diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 32beaf54..959ff820 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -80,6 +80,7 @@
+
\ No newline at end of file
diff --git a/app/src/main/java/org/mian/gitnex/actions/TeamActions.java b/app/src/main/java/org/mian/gitnex/actions/TeamActions.java
new file mode 100644
index 00000000..181851e5
--- /dev/null
+++ b/app/src/main/java/org/mian/gitnex/actions/TeamActions.java
@@ -0,0 +1,154 @@
+package org.mian.gitnex.actions;
+
+import android.content.Context;
+import androidx.annotation.NonNull;
+import com.google.gson.JsonElement;
+import org.mian.gitnex.R;
+import org.mian.gitnex.activities.AddNewTeamMemberActivity;
+import org.mian.gitnex.clients.RetrofitClient;
+import org.mian.gitnex.helpers.AlertDialogs;
+import org.mian.gitnex.helpers.Authorization;
+import org.mian.gitnex.helpers.Toasty;
+import org.mian.gitnex.util.TinyDB;
+import retrofit2.Call;
+import retrofit2.Callback;
+
+/**
+ * Author M M Arif
+ */
+
+public class TeamActions {
+
+ public static void removeTeamMember(final Context context, String userName, int teamId) {
+
+ final TinyDB tinyDb = new TinyDB(context);
+ final String instanceUrl = tinyDb.getString("instanceUrl");
+ final String loginUid = tinyDb.getString("loginUid");
+ final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
+
+ Call call;
+
+ call = RetrofitClient
+ .getInstance(instanceUrl, context)
+ .getApiInterface()
+ .removeTeamMember(Authorization.returnAuthentication(context, loginUid, instanceToken), teamId, userName);
+
+ call.enqueue(new Callback() {
+
+ @Override
+ public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) {
+
+ if(response.isSuccessful()) {
+
+ if(response.code() == 204) {
+
+ tinyDb.putBoolean("teamActionFlag", true);
+ Toasty.info(context, context.getString(R.string.memberRemovedMessage));
+ ((AddNewTeamMemberActivity)context).finish();
+
+ }
+
+ }
+ else if(response.code() == 401) {
+
+ AlertDialogs.authorizationTokenRevokedDialog(context, context.getResources().getString(R.string.alertDialogTokenRevokedTitle),
+ context.getResources().getString(R.string.alertDialogTokenRevokedMessage),
+ context.getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
+ context.getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
+
+ }
+ else if(response.code() == 403) {
+
+ Toasty.info(context, context.getString(R.string.authorizeError));
+
+ }
+ else if(response.code() == 404) {
+
+ Toasty.info(context, context.getString(R.string.apiNotFound));
+
+ }
+ else {
+
+ Toasty.info(context, context.getString(R.string.genericError));
+
+ }
+
+ }
+
+ @Override
+ public void onFailure(@NonNull Call call, @NonNull Throwable t) {
+
+ Toasty.error(context, context.getResources().getString(R.string.genericServerResponseError));
+
+ }
+ });
+
+ }
+
+ public static void addTeamMember(final Context context, String userName, int teamId) {
+
+ final TinyDB tinyDb = new TinyDB(context);
+ final String instanceUrl = tinyDb.getString("instanceUrl");
+ final String loginUid = tinyDb.getString("loginUid");
+ final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
+
+ Call call;
+
+ call = RetrofitClient
+ .getInstance(instanceUrl, context)
+ .getApiInterface()
+ .addTeamMember(Authorization.returnAuthentication(context, loginUid, instanceToken), teamId, userName);
+
+ call.enqueue(new Callback() {
+
+ @Override
+ public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) {
+
+ if(response.isSuccessful()) {
+
+ if(response.code() == 204) {
+
+ tinyDb.putBoolean("teamActionFlag", true);
+ Toasty.info(context, context.getString(R.string.memberAddedMessage));
+ ((AddNewTeamMemberActivity)context).finish();
+
+ }
+
+ }
+ else if(response.code() == 401) {
+
+ AlertDialogs.authorizationTokenRevokedDialog(context, context.getResources().getString(R.string.alertDialogTokenRevokedTitle),
+ context.getResources().getString(R.string.alertDialogTokenRevokedMessage),
+ context.getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
+ context.getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
+
+ }
+ else if(response.code() == 403) {
+
+ Toasty.info(context, context.getString(R.string.authorizeError));
+
+ }
+ else if(response.code() == 404) {
+
+ Toasty.info(context, context.getString(R.string.apiNotFound));
+
+ }
+ else {
+
+ Toasty.info(context, context.getString(R.string.genericError));
+
+ }
+
+ }
+
+ @Override
+ public void onFailure(@NonNull Call call, @NonNull Throwable t) {
+
+ Toasty.error(context, context.getResources().getString(R.string.genericServerResponseError));
+
+ }
+ });
+
+ }
+
+}
diff --git a/app/src/main/java/org/mian/gitnex/activities/AddCollaboratorToRepositoryActivity.java b/app/src/main/java/org/mian/gitnex/activities/AddCollaboratorToRepositoryActivity.java
index 4810697e..3ef91b8b 100644
--- a/app/src/main/java/org/mian/gitnex/activities/AddCollaboratorToRepositoryActivity.java
+++ b/app/src/main/java/org/mian/gitnex/activities/AddCollaboratorToRepositoryActivity.java
@@ -74,16 +74,16 @@ public class AddCollaboratorToRepositoryActivity extends BaseActivity {
initCloseListener();
closeActivity.setOnClickListener(onClickListener);
- addCollaboratorSearch.setOnEditorActionListener(new TextView.OnEditorActionListener() {
- @Override
- public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
- if (actionId == EditorInfo.IME_ACTION_SEND) {
- if(!addCollaboratorSearch.getText().toString().equals("")) {
- loadUserSearchList(instanceUrl, instanceToken, addCollaboratorSearch.getText().toString(), loginUid);
- }
+ addCollaboratorSearch.setOnEditorActionListener((v, actionId, event) -> {
+
+ if (actionId == EditorInfo.IME_ACTION_SEND) {
+ if(!addCollaboratorSearch.getText().toString().equals("")) {
+ loadUserSearchList(instanceUrl, instanceToken, addCollaboratorSearch.getText().toString(), loginUid);
}
- return false;
}
+
+ return false;
+
});
}
@@ -142,12 +142,7 @@ public class AddCollaboratorToRepositoryActivity extends BaseActivity {
}
private void initCloseListener() {
- onClickListener = new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- finish();
- }
- };
+ onClickListener = view -> finish();
}
diff --git a/app/src/main/java/org/mian/gitnex/activities/AddNewTeamMemberActivity.java b/app/src/main/java/org/mian/gitnex/activities/AddNewTeamMemberActivity.java
new file mode 100644
index 00000000..ebe8a917
--- /dev/null
+++ b/app/src/main/java/org/mian/gitnex/activities/AddNewTeamMemberActivity.java
@@ -0,0 +1,164 @@
+package org.mian.gitnex.activities;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.util.Log;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.ImageView;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.DividerItemDecoration;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import org.mian.gitnex.R;
+import org.mian.gitnex.adapters.UserSearchForTeamMemberAdapter;
+import org.mian.gitnex.clients.RetrofitClient;
+import org.mian.gitnex.helpers.Authorization;
+import org.mian.gitnex.models.UserInfo;
+import org.mian.gitnex.models.UserSearch;
+import org.mian.gitnex.util.TinyDB;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+
+public class AddNewTeamMemberActivity extends BaseActivity {
+
+ private View.OnClickListener onClickListener;
+ final Context ctx = this;
+ private Context appCtx;
+ private TextView addNewTeamMember;
+ private TextView noData;
+ private ProgressBar mProgressBar;
+
+ private RecyclerView mRecyclerView;
+ private List dataList;
+ private UserSearchForTeamMemberAdapter adapter;
+
+ private String teamId;
+
+ @Override
+ protected int getLayoutResourceId() {
+ return R.layout.activity_add_new_team_member;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+
+ super.onCreate(savedInstanceState);
+ appCtx = getApplicationContext();
+
+ InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+
+ TinyDB tinyDb = new TinyDB(appCtx);
+ final String instanceUrl = tinyDb.getString("instanceUrl");
+ final String loginUid = tinyDb.getString("loginUid");
+ String repoFullName = tinyDb.getString("repoFullName");
+ String[] parts = repoFullName.split("/");
+ final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
+
+ ImageView closeActivity = findViewById(R.id.close);
+ addNewTeamMember = findViewById(R.id.addNewTeamMeber);
+ mRecyclerView = findViewById(R.id.recyclerViewUserSearch);
+ mProgressBar = findViewById(R.id.progress_bar);
+ noData = findViewById(R.id.noData);
+
+ addNewTeamMember.requestFocus();
+ assert imm != null;
+ imm.showSoftInput(addNewTeamMember, InputMethodManager.SHOW_IMPLICIT);
+
+ initCloseListener();
+ closeActivity.setOnClickListener(onClickListener);
+
+ if(getIntent().getStringExtra("teamId") != null && !Objects.requireNonNull(getIntent().getStringExtra("teamId")).equals("")) {
+ teamId = getIntent().getStringExtra("teamId");
+ }
+ else {
+ teamId = "0";
+ }
+
+ mRecyclerView.setHasFixedSize(true);
+ mRecyclerView.setLayoutManager(new LinearLayoutManager(ctx));
+
+ DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(), DividerItemDecoration.VERTICAL);
+ mRecyclerView.addItemDecoration(dividerItemDecoration);
+
+ dataList = new ArrayList<>();
+
+ addNewTeamMember.addTextChangedListener(new TextWatcher() {
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+ if(!addNewTeamMember.getText().toString().equals("")) {
+
+ adapter = new UserSearchForTeamMemberAdapter(dataList, ctx, Integer.parseInt(teamId));
+ loadUserSearchList(instanceUrl, instanceToken, addNewTeamMember.getText().toString(), loginUid, teamId);
+
+ }
+
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ }
+
+ });
+
+ }
+
+ public void loadUserSearchList(String instanceUrl, String token, String searchKeyword, String loginUid, String teamId) {
+
+ Call call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getUserBySearch(Authorization.returnAuthentication(ctx, loginUid, token), searchKeyword, 10);
+
+ call.enqueue(new Callback() {
+
+ @Override
+ public void onResponse(@NonNull Call call, @NonNull Response response) {
+
+ if(response.isSuccessful()) {
+
+ assert response.body() != null;
+ if(response.body().getData().size() > 0) {
+
+ dataList.clear();
+ dataList.addAll(response.body().getData());
+ mRecyclerView.setAdapter(adapter);
+ noData.setVisibility(View.GONE);
+ mProgressBar.setVisibility(View.GONE);
+
+ }
+ else {
+
+ noData.setVisibility(View.VISIBLE);
+ mProgressBar.setVisibility(View.GONE);
+
+ }
+
+ }
+
+ }
+
+ @Override
+ public void onFailure(@NonNull Call call, @NonNull Throwable t) {
+ Log.e("onFailure", t.toString());
+ }
+
+ });
+ }
+
+ private void initCloseListener() {
+ onClickListener = view -> finish();
+ }
+
+}
diff --git a/app/src/main/java/org/mian/gitnex/activities/OrganizationTeamMembersActivity.java b/app/src/main/java/org/mian/gitnex/activities/OrganizationTeamMembersActivity.java
index 293c626c..a270ecdf 100644
--- a/app/src/main/java/org/mian/gitnex/activities/OrganizationTeamMembersActivity.java
+++ b/app/src/main/java/org/mian/gitnex/activities/OrganizationTeamMembersActivity.java
@@ -1,28 +1,30 @@
package org.mian.gitnex.activities;
-import androidx.annotation.Nullable;
-import androidx.lifecycle.Observer;
-import androidx.lifecycle.ViewModelProvider;
import android.content.Context;
+import android.content.Intent;
import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.View;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
+import androidx.appcompat.widget.Toolbar;
+import androidx.lifecycle.ViewModelProvider;
import org.mian.gitnex.R;
import org.mian.gitnex.adapters.TeamMembersByOrgAdapter;
+import org.mian.gitnex.fragments.BottomSheetOrganizationTeamsFragment;
import org.mian.gitnex.helpers.Authorization;
-import org.mian.gitnex.models.UserInfo;
import org.mian.gitnex.util.TinyDB;
import org.mian.gitnex.viewmodels.TeamMembersByOrgViewModel;
-import java.util.List;
import java.util.Objects;
/**
* Author M M Arif
*/
-public class OrganizationTeamMembersActivity extends BaseActivity {
+public class OrganizationTeamMembersActivity extends BaseActivity implements BottomSheetOrganizationTeamsFragment.BottomSheetListener {
private TextView noDataMembers;
private View.OnClickListener onClickListener;
@@ -32,6 +34,8 @@ public class OrganizationTeamMembersActivity extends BaseActivity {
final Context ctx = this;
private Context appCtx;
+ private String teamId;
+
@Override
protected int getLayoutResourceId(){
return R.layout.activity_org_team_members;
@@ -42,6 +46,8 @@ public class OrganizationTeamMembersActivity extends BaseActivity {
super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
+ Toolbar toolbar = findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
TinyDB tinyDb = new TinyDB(appCtx);
final String instanceUrl = tinyDb.getString("instanceUrl");
@@ -63,7 +69,6 @@ public class OrganizationTeamMembersActivity extends BaseActivity {
toolbarTitle.setText(R.string.orgTeamMembers);
}
- String teamId;
if(getIntent().getStringExtra("teamId") != null && !Objects.requireNonNull(getIntent().getStringExtra("teamId")).equals("")){
teamId = getIntent().getStringExtra("teamId");
}
@@ -71,11 +76,24 @@ public class OrganizationTeamMembersActivity extends BaseActivity {
teamId = "0";
}
- getIntent().getStringExtra("teamId");
- //Log.i("teamId", getIntent().getStringExtra("teamId"));
-
assert teamId != null;
- fetchDataAsync(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), Integer.valueOf(teamId));
+ fetchDataAsync(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), Integer.parseInt(teamId));
+
+ }
+
+ @Override
+ public void onResume() {
+
+ super.onResume();
+ TinyDB tinyDb = new TinyDB(appCtx);
+ final String instanceUrl = tinyDb.getString("instanceUrl");
+ final String loginUid = tinyDb.getString("loginUid");
+ final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
+
+ if(tinyDb.getBoolean("teamActionFlag")) {
+ fetchDataAsync(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), Integer.parseInt(teamId));
+ tinyDb.putBoolean("teamActionFlag", false);
+ }
}
@@ -83,30 +101,65 @@ public class OrganizationTeamMembersActivity extends BaseActivity {
TeamMembersByOrgViewModel teamMembersModel = new ViewModelProvider(this).get(TeamMembersByOrgViewModel.class);
- teamMembersModel.getMembersByOrgList(instanceUrl, instanceToken, teamId, ctx).observe(this, new Observer>() {
- @Override
- public void onChanged(@Nullable List teamMembersListMain) {
- adapter = new TeamMembersByOrgAdapter(ctx, teamMembersListMain);
- if(adapter.getCount() > 0) {
- mGridView.setAdapter(adapter);
- noDataMembers.setVisibility(View.GONE);
- }
- else {
- adapter.notifyDataSetChanged();
- mGridView.setAdapter(adapter);
- noDataMembers.setVisibility(View.VISIBLE);
- }
+ teamMembersModel.getMembersByOrgList(instanceUrl, instanceToken, teamId, ctx).observe(this, teamMembersListMain -> {
+
+ adapter = new TeamMembersByOrgAdapter(ctx, teamMembersListMain);
+ if(adapter.getCount() > 0) {
+ mGridView.setAdapter(adapter);
+ noDataMembers.setVisibility(View.GONE);
}
+ else {
+ adapter.notifyDataSetChanged();
+ mGridView.setAdapter(adapter);
+ noDataMembers.setVisibility(View.VISIBLE);
+ }
+
});
}
- private void initCloseListener() {
- onClickListener = new View.OnClickListener() {
- @Override
- public void onClick(View view) {
+ @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:
+ BottomSheetOrganizationTeamsFragment bottomSheet = new BottomSheetOrganizationTeamsFragment();
+ bottomSheet.show(getSupportFragmentManager(), "orgTeamsBottomSheet");
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+
+ }
+
+ @Override
+ public void onButtonClicked(String text) {
+
+ TinyDB tinyDb = new TinyDB(appCtx);
+
+ if("newMember".equals(text)) {
+ Intent intent = new Intent(OrganizationTeamMembersActivity.this, AddNewTeamMemberActivity.class);
+ intent.putExtra("teamId", teamId);
+ startActivity(intent);
+ }
+
+ }
+
+ private void initCloseListener() {
+ onClickListener = view -> finish();
}
}
diff --git a/app/src/main/java/org/mian/gitnex/adapters/UserSearchForTeamMemberAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/UserSearchForTeamMemberAdapter.java
new file mode 100644
index 00000000..5c65b465
--- /dev/null
+++ b/app/src/main/java/org/mian/gitnex/adapters/UserSearchForTeamMemberAdapter.java
@@ -0,0 +1,184 @@
+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 androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+import org.mian.gitnex.R;
+import org.mian.gitnex.clients.PicassoService;
+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.helpers.Toasty;
+import org.mian.gitnex.models.UserInfo;
+import org.mian.gitnex.util.TinyDB;
+import java.util.List;
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+
+/**
+ * Author M M Arif
+ */
+
+public class UserSearchForTeamMemberAdapter extends RecyclerView.Adapter {
+
+ private List usersSearchList;
+ private Context mCtx;
+ private int teamId;
+
+ public UserSearchForTeamMemberAdapter(List dataList, Context mCtx, int teamId) {
+ this.mCtx = mCtx;
+ this.usersSearchList = dataList;
+ this.teamId = teamId;
+ }
+
+ static class UserSearchViewHolder extends RecyclerView.ViewHolder {
+
+ private ImageView userAvatar;
+ private TextView userFullName;
+ private TextView userName;
+ private TextView userNameMain;
+ private ImageView addMemberButtonAdd;
+ private ImageView addMemberButtonRemove;
+ private TextView teamId_;
+
+ 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);
+ addMemberButtonAdd = itemView.findViewById(R.id.addCollaboratorButtonAdd);
+ addMemberButtonRemove = itemView.findViewById(R.id.addCollaboratorButtonRemove);
+ teamId_ = itemView.findViewById(R.id.teamId);
+
+ addMemberButtonAdd.setOnClickListener(v -> {
+
+ Context context = v.getContext();
+
+ AlertDialogs.addMemberDialog(context, userNameMain.getText().toString(),
+ context.getResources().getString(R.string.addTeamMemberTitle),
+ context.getResources().getString(R.string.addTeamMemberMessage),
+ context.getResources().getString(R.string.addButton),
+ context.getResources().getString(R.string.cancelButton), Integer.parseInt(teamId_.getText().toString()));
+
+ });
+
+ addMemberButtonRemove.setOnClickListener(v -> {
+
+ Context context = v.getContext();
+
+ AlertDialogs.removeMemberDialog(context, userNameMain.getText().toString(),
+ context.getResources().getString(R.string.removeTeamMemberTitle),
+ context.getResources().getString(R.string.removeTeamMemberMessage),
+ context.getResources().getString(R.string.removeButton),
+ context.getResources().getString(R.string.cancelButton), Integer.parseInt(teamId_.getText().toString()));
+
+ });
+
+ }
+
+ }
+
+ @NonNull
+ @Override
+ public UserSearchForTeamMemberAdapter.UserSearchViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_collaborators_search, parent, false);
+ return new UserSearchForTeamMemberAdapter.UserSearchViewHolder(v);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull final UserSearchForTeamMemberAdapter.UserSearchViewHolder holder, int position) {
+
+ final UserInfo currentItem = usersSearchList.get(position);
+
+ holder.userNameMain.setText(currentItem.getLogin());
+ holder.teamId_.setText(String.valueOf(teamId));
+
+ if (!currentItem.getFullname().equals("")) {
+ holder.userFullName.setText(currentItem.getFullname());
+ holder.userName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getLogin()));
+ }
+ else {
+ holder.userFullName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getLogin()));
+ holder.userName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getLogin()));
+ }
+
+ if (!currentItem.getAvatar().equals("")) {
+ PicassoService.getInstance(mCtx).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(120, 120).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 call = RetrofitClient
+ .getInstance(instanceUrl, mCtx)
+ .getApiInterface()
+ .checkTeamMember(Authorization.returnAuthentication(mCtx, loginUid, instanceToken), teamId, currentItem.getLogin());
+
+ call.enqueue(new Callback() {
+
+ @Override
+ public void onResponse(@NonNull Call call, @NonNull Response response) {
+
+ if(response.code() == 200) {
+
+ if(!currentItem.getLogin().equals(loginUid) && !currentItem.getLogin().equals(repoOwner)) {
+ holder.addMemberButtonRemove.setVisibility(View.VISIBLE);
+ }
+ else {
+ holder.addMemberButtonRemove.setVisibility(View.GONE);
+ }
+
+ }
+ else if(response.code() == 404) {
+
+ if(!currentItem.getLogin().equals(loginUid) && !currentItem.getLogin().equals(repoOwner)) {
+ holder.addMemberButtonAdd.setVisibility(View.VISIBLE);
+ }
+ else {
+ holder.addMemberButtonAdd.setVisibility(View.GONE);
+ }
+
+ }
+ else {
+ holder.addMemberButtonRemove.setVisibility(View.GONE);
+ holder.addMemberButtonAdd.setVisibility(View.GONE);
+ }
+
+ }
+
+ @Override
+ public void onFailure(@NonNull Call call, @NonNull Throwable t) {
+
+ Toasty.error(mCtx, mCtx.getResources().getString(R.string.genericServerResponseError));
+
+ }
+
+ });
+
+ }
+
+ }
+
+ @Override
+ public int getItemCount() {
+ return usersSearchList.size();
+ }
+
+}
diff --git a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetAdminUsersFragment.java b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetAdminUsersFragment.java
index 1438a72d..96942406 100644
--- a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetAdminUsersFragment.java
+++ b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetAdminUsersFragment.java
@@ -22,7 +22,7 @@ public class BottomSheetAdminUsersFragment extends BottomSheetDialogFragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
- View v = inflater.inflate(R.layout.bottom_sheet_admin_users_layout, container, false);
+ View v = inflater.inflate(R.layout.bottom_sheet_admin_users, container, false);
TextView createNewUser = v.findViewById(R.id.createNewUser);
diff --git a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetOrganizationFragment.java b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetOrganizationFragment.java
index 38e57a74..7abd7715 100644
--- a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetOrganizationFragment.java
+++ b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetOrganizationFragment.java
@@ -22,7 +22,7 @@ public class BottomSheetOrganizationFragment extends BottomSheetDialogFragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
- View v = inflater.inflate(R.layout.bottom_sheet_organization_layout, container, false);
+ View v = inflater.inflate(R.layout.bottom_sheet_organization, container, false);
TextView createTeam = v.findViewById(R.id.createTeam);
TextView createRepository = v.findViewById(R.id.createRepository);
diff --git a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetOrganizationTeamsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetOrganizationTeamsFragment.java
new file mode 100644
index 00000000..717a70c3
--- /dev/null
+++ b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetOrganizationTeamsFragment.java
@@ -0,0 +1,58 @@
+package org.mian.gitnex.fragments;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
+import org.mian.gitnex.R;
+
+/**
+ * Author M M Arif
+ */
+
+public class BottomSheetOrganizationTeamsFragment extends BottomSheetDialogFragment {
+
+ private BottomSheetOrganizationTeamsFragment.BottomSheetListener bmListener;
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+
+ View v = inflater.inflate(R.layout.bottom_sheet_organization_teams, container, false);
+
+ TextView addNewMember = v.findViewById(R.id.addNewMember);
+
+ addNewMember.setOnClickListener(v1 -> {
+
+ bmListener.onButtonClicked("newMember");
+ dismiss();
+
+ });
+
+ return v;
+
+ }
+
+ public interface BottomSheetListener {
+ void onButtonClicked(String text);
+ }
+
+ @Override
+ public void onAttach(@NonNull Context context) {
+ super.onAttach(context);
+
+ try {
+ bmListener = (BottomSheetOrganizationTeamsFragment.BottomSheetListener) context;
+ }
+ catch (ClassCastException e) {
+ Log.e("BsOrganizationTeams", e.toString());
+ }
+ }
+
+}
diff --git a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetProfileFragment.java b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetProfileFragment.java
index 8c8c9368..4c635008 100644
--- a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetProfileFragment.java
+++ b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetProfileFragment.java
@@ -21,7 +21,7 @@ public class BottomSheetProfileFragment extends BottomSheetDialogFragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
- View v = inflater.inflate(R.layout.bottom_sheet_profile_layout, container, false);
+ View v = inflater.inflate(R.layout.bottom_sheet_profile, container, false);
TextView addNewEmailAddress = v.findViewById(R.id.addNewEmailAddress);
diff --git a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetRepoFragment.java b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetRepoFragment.java
index d40c6cd0..ac11a1ae 100644
--- a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetRepoFragment.java
+++ b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetRepoFragment.java
@@ -24,7 +24,7 @@ public class BottomSheetRepoFragment extends BottomSheetDialogFragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
- View v = inflater.inflate(R.layout.bottom_sheet_repo_layout, container, false);
+ View v = inflater.inflate(R.layout.bottom_sheet_repo, container, false);
final TinyDB tinyDb = new TinyDB(getContext());
diff --git a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetSingleIssueFragment.java b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetSingleIssueFragment.java
index 7daa9360..8d1daf85 100644
--- a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetSingleIssueFragment.java
+++ b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetSingleIssueFragment.java
@@ -33,7 +33,7 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
- View v = inflater.inflate(R.layout.bottom_sheet_single_issue_layout, container, false);
+ View v = inflater.inflate(R.layout.bottom_sheet_single_issue, container, false);
final Context ctx = getContext();
final TinyDB tinyDB = new TinyDB(ctx);
diff --git a/app/src/main/java/org/mian/gitnex/helpers/AlertDialogs.java b/app/src/main/java/org/mian/gitnex/helpers/AlertDialogs.java
index 595a9297..ad82d98c 100644
--- a/app/src/main/java/org/mian/gitnex/helpers/AlertDialogs.java
+++ b/app/src/main/java/org/mian/gitnex/helpers/AlertDialogs.java
@@ -4,6 +4,7 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import org.mian.gitnex.R;
+import org.mian.gitnex.actions.TeamActions;
import org.mian.gitnex.activities.CreateLabelActivity;
import org.mian.gitnex.activities.LoginActivity;
import org.mian.gitnex.actions.CollaboratorActions;
@@ -25,25 +26,17 @@ public class AlertDialogs {
.setMessage(message)
.setCancelable(true)
.setIcon(R.drawable.ic_warning)
- .setNegativeButton(copyNegativeButton, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- }
- })
- .setPositiveButton(copyPositiveButton, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
+ .setNegativeButton(copyNegativeButton, (dialog, which) -> dialog.dismiss())
+ .setPositiveButton(copyPositiveButton, (dialog, which) -> {
- final TinyDB tinyDb = new TinyDB(context);
- tinyDb.putBoolean("loggedInMode", false);
- tinyDb.remove("basicAuthPassword");
- tinyDb.putBoolean("basicAuthFlag", false);
- Intent intent = new Intent(context, LoginActivity.class);
- context.startActivity(intent);
- dialog.dismiss();
+ final TinyDB tinyDb = new TinyDB(context);
+ tinyDb.putBoolean("loggedInMode", false);
+ tinyDb.remove("basicAuthPassword");
+ tinyDb.putBoolean("basicAuthFlag", false);
+ Intent intent = new Intent(context, LoginActivity.class);
+ context.startActivity(intent);
+ dialog.dismiss();
- }
});
AlertDialog alertDialog = alertDialogBuilder.create();
@@ -56,15 +49,14 @@ public class AlertDialogs {
.setTitle(title + labelTitle)
.setMessage(message)
.setIcon(R.drawable.ic_delete)
- .setPositiveButton(positiveButton, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
+ .setPositiveButton(positiveButton, (dialog, whichButton) -> {
- Intent intent = new Intent(context, CreateLabelActivity.class);
- intent.putExtra("labelId", labelId);
- intent.putExtra("labelAction", "delete");
- context.startActivity(intent);
+ Intent intent = new Intent(context, CreateLabelActivity.class);
+ intent.putExtra("labelId", labelId);
+ intent.putExtra("labelAction", "delete");
+ context.startActivity(intent);
- }})
+ })
.setNegativeButton(negativeButton, null).show();
}
@@ -74,13 +66,27 @@ public class AlertDialogs {
new AlertDialog.Builder(context)
.setTitle(title + userNameMain)
.setMessage(message)
- .setIcon(R.drawable.ic_warning)
- .setPositiveButton(positiveButton, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
+ .setPositiveButton(positiveButton, (dialog, whichButton) -> CollaboratorActions.deleteCollaborator(context, searchKeyword, userNameMain))
+ .setNegativeButton(negativeButton, null).show();
- CollaboratorActions.deleteCollaborator(context, searchKeyword, userNameMain);
+ }
- }})
+ public static void addMemberDialog(final Context context, final String userNameMain, String title, String message, String positiveButton, String negativeButton, int teamId) {
+
+ new AlertDialog.Builder(context)
+ .setTitle(title + userNameMain)
+ .setMessage(message)
+ .setPositiveButton(positiveButton, (dialog, whichButton) -> TeamActions.addTeamMember(context, userNameMain, teamId))
+ .setNegativeButton(negativeButton, null).show();
+
+ }
+
+ public static void removeMemberDialog(final Context context, final String userNameMain, String title, String message, String positiveButton, String negativeButton, int teamId) {
+
+ new AlertDialog.Builder(context)
+ .setTitle(title + userNameMain)
+ .setMessage(message)
+ .setPositiveButton(positiveButton, (dialog, whichButton) -> TeamActions.removeTeamMember(context, userNameMain, teamId))
.setNegativeButton(negativeButton, null).show();
}
diff --git a/app/src/main/java/org/mian/gitnex/interfaces/ApiInterface.java b/app/src/main/java/org/mian/gitnex/interfaces/ApiInterface.java
index 910e2f74..54f29522 100644
--- a/app/src/main/java/org/mian/gitnex/interfaces/ApiInterface.java
+++ b/app/src/main/java/org/mian/gitnex/interfaces/ApiInterface.java
@@ -275,4 +275,13 @@ public interface ApiInterface {
@DELETE("repos/{owner}/{repo}/issues/comments/{id}") // delete own comment from issue
Call deleteComment(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName, @Path("id") int commentIndex);
+
+ @GET("teams/{teamId}/members/{username}") // check team member
+ Call checkTeamMember(@Header("Authorization") String token, @Path("teamId") int teamId, @Path("username") String username);
+
+ @PUT("teams/{teamId}/members/{username}") // add new team member
+ Call addTeamMember(@Header("Authorization") String token, @Path("teamId") int teamId, @Path("username") String username);
+
+ @DELETE("teams/{teamId}/members/{username}") // remove team member
+ Call removeTeamMember(@Header("Authorization") String token, @Path("teamId") int teamId, @Path("username") String username);
}
diff --git a/app/src/main/res/layout/activity_add_new_team_member.xml b/app/src/main/res/layout/activity_add_new_team_member.xml
new file mode 100644
index 00000000..8c830a7c
--- /dev/null
+++ b/app/src/main/res/layout/activity_add_new_team_member.xml
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_admin_get_users.xml b/app/src/main/res/layout/activity_admin_get_users.xml
index 3730be65..06805643 100644
--- a/app/src/main/res/layout/activity_admin_get_users.xml
+++ b/app/src/main/res/layout/activity_admin_get_users.xml
@@ -18,7 +18,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/primaryBackgroundColor"
- android:theme="@style/AppTheme.AppBarOverlay"
tools:ignore="UnusedAttribute">
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/bottom_sheet_profile_layout.xml b/app/src/main/res/layout/bottom_sheet_profile.xml
similarity index 100%
rename from app/src/main/res/layout/bottom_sheet_profile_layout.xml
rename to app/src/main/res/layout/bottom_sheet_profile.xml
diff --git a/app/src/main/res/layout/bottom_sheet_repo_layout.xml b/app/src/main/res/layout/bottom_sheet_repo.xml
similarity index 100%
rename from app/src/main/res/layout/bottom_sheet_repo_layout.xml
rename to app/src/main/res/layout/bottom_sheet_repo.xml
diff --git a/app/src/main/res/layout/bottom_sheet_single_issue_layout.xml b/app/src/main/res/layout/bottom_sheet_single_issue.xml
similarity index 100%
rename from app/src/main/res/layout/bottom_sheet_single_issue_layout.xml
rename to app/src/main/res/layout/bottom_sheet_single_issue.xml
diff --git a/app/src/main/res/layout/list_collaborators_search.xml b/app/src/main/res/layout/list_collaborators_search.xml
index 520e70a9..93d01902 100644
--- a/app/src/main/res/layout/list_collaborators_search.xml
+++ b/app/src/main/res/layout/list_collaborators_search.xml
@@ -8,6 +8,12 @@
android:paddingEnd="20dp"
android:background="?attr/primaryBackgroundColor" >
+
+
No members found
Org members
Organization team members
+ Add / Remove New Member
+ Remove\u0020
+ Add\u0020
+ Do you want to add this user to the team?
+ Do you want to remove this user from the team?
+ Member added to the team successfully
+ Member removed from the team successfully