Skip to content
Snippets Groups Projects
Commit 44732ef9 authored by Jawnnypoo's avatar Jawnnypoo
Browse files

Move adding a user into an activity instead of a dialog since that makes more sense. Needs work.

parent ab67c288
No related branches found
No related tags found
No related merge requests found
Showing
with 480 additions and 88 deletions
Loading
Loading
@@ -49,6 +49,7 @@
</activity>
 
<activity android:name=".activities.AboutActivity"/>
<activity android:name=".activities.AddUserActivity"/>
 
<meta-data
android:name="io.fabric.ApiKey"
Loading
Loading
package com.commit451.gitlab.activities;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.commit451.gitlab.GitLabApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.NewUserAdapter;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.dialogs.UserRoleDialog;
import com.commit451.gitlab.model.User;
import com.commit451.gitlab.tools.KeyboardUtil;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
import retrofit.Callback;
import retrofit.Response;
import timber.log.Timber;
/**
* Add a new user to the repo
* Created by Jawn on 9/15/2015.
*/
public class AddUserActivity extends BaseActivity {
public static Intent newInstance(Context context) {
Intent intent = new Intent(context, AddUserActivity.class);
return intent;
}
@Bind(R.id.toolbar) Toolbar mToolbar;
@Bind(R.id.userSearch) EditText mUserSearch;
@Bind(R.id.swipe_layout) SwipeRefreshLayout mSwipeRefreshLayout;
@Bind(R.id.list) RecyclerView mRecyclerView;
NewUserAdapter mAdapter;
UserRoleDialog mUserRoleDialog;
User mSelectedUser;
private final View.OnClickListener mOnBackPressed = new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
};
private final TextView.OnEditorActionListener mSearchEditorActionListener = new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (!TextUtils.isEmpty(mUserSearch.getText())) {
KeyboardUtil.hideKeyboard(AddUserActivity.this);
mSwipeRefreshLayout.setRefreshing(true);
GitLabClient.instance().searchUsers(mUserSearch.getText().toString()).enqueue(mUserCallback);
}
return true;
}
};
private final Callback<List<User>> mUserCallback = new Callback<List<User>>() {
@Override
public void onResponse(Response<List<User>> response) {
mSwipeRefreshLayout.setRefreshing(false);
if (!response.isSuccess()) {
return;
}
mAdapter.setData(response.body());
}
@Override
public void onFailure(Throwable t) {
Timber.e(t.toString());
Snackbar.make(getWindow().getDecorView(), getString(R.string.connection_error_users), Snackbar.LENGTH_SHORT)
.show();
}
};
private final NewUserAdapter.Listener mUserClickListener = new NewUserAdapter.Listener() {
@Override
public void onUserClicked(User user) {
mSelectedUser = user;
mUserRoleDialog.show();
}
};
private final UserRoleDialog.Listener mUserRoleDialogListener = new UserRoleDialog.Listener() {
@Override
public void onAccessLevelClicked(String accessLevel) {
GitLabClient.instance().addGroupMember(
GitLabApp.instance().getSelectedProject().getGroup().getId(),
mSelectedUser.getId(),
accessLevel).enqueue(mAddGroupMemeberCallback);
}
};
private final Callback<User> mAddGroupMemeberCallback = new Callback<User>() {
@Override
public void onResponse(Response<User> response) {
if (!response.isSuccess()) {
return;
}
Toast.makeText(AddUserActivity.this, "User added successfully", Toast.LENGTH_SHORT).show();
finish();
}
@Override
public void onFailure(Throwable t) {
Timber.e(t.toString());
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_user);
ButterKnife.bind(this);
mUserRoleDialog = new UserRoleDialog(this, mUserRoleDialogListener);
mToolbar.setNavigationIcon(R.drawable.ic_back);
mToolbar.setNavigationOnClickListener(mOnBackPressed);
mUserSearch.setOnEditorActionListener(mSearchEditorActionListener);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mAdapter = new NewUserAdapter(mUserClickListener);
mRecyclerView.setAdapter(mAdapter);
}
}
package com.commit451.gitlab.adapter;
 
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
 
import com.commit451.gitlab.R;
import com.commit451.gitlab.model.User;
import com.commit451.gitlab.viewHolders.UserViewHolder;
 
import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
 
/**
* Created by Jawn on 7/28/2015.
*/
public class NewUserAdapter extends RecyclerView.Adapter<UserViewHolder> {
 
private List<User> mValues;
public interface Listener {
void onUserClicked(User user);
}
private Listener mListener;
private ArrayList<User> mValues;
private final View.OnClickListener mItemClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = (int) v.getTag(R.id.list_position);
mListener.onUserClicked(getValueAt(position));
}
};
 
public User getValueAt(int position) {
return mValues.get(position);
}
 
public NewUserAdapter(List<User> items) {
mValues = items;
public NewUserAdapter(Listener listener) {
mListener = listener;
mValues = new ArrayList<>();
}
public void setData(Collection<User> data) {
mValues.clear();
if (data != null) {
mValues.addAll(data);
}
notifyDataSetChanged();
}
 
@Override
public UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
UserViewHolder holder = UserViewHolder.create(parent);
holder.itemView.setOnClickListener(mItemClickListener);
return holder;
}
 
Loading
Loading
package com.commit451.gitlab.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import com.commit451.gitlab.R;
import com.commit451.gitlab.viewHolders.ProjectAccessViewHolder;
/**
* Created by Jawn on 9/16/2015.
*/
public class ProjectAccessAdapter extends RecyclerView.Adapter<ProjectAccessViewHolder> {
public interface Listener {
void onAccessLevelClicked(String accessLevel);
}
private Listener mListener;
private String[] mValues;
public ProjectAccessAdapter(Context context, Listener listener) {
mListener = listener;
mValues = context.getResources().getStringArray(R.array.role_names);
}
public String getValueAt(int position) {
return mValues[position];
}
private final View.OnClickListener onProjectClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = (int) v.getTag(R.id.list_position);
mListener.onAccessLevelClicked(getValueAt(position));
}
};
@Override
public ProjectAccessViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ProjectAccessViewHolder holder = ProjectAccessViewHolder.create(parent);
holder.itemView.setOnClickListener(onProjectClickListener);
return holder;
}
@Override
public void onBindViewHolder(final ProjectAccessViewHolder holder, int position) {
String accessLevel = getValueAt(position);
holder.bind(accessLevel);
holder.itemView.setTag(R.id.list_position, position);
}
@Override
public int getItemCount() {
return mValues.length;
}
}
Loading
Loading
@@ -15,6 +15,7 @@ import com.commit451.gitlab.tools.Repository;
import com.commit451.gitlab.viewHolders.ProjectViewHolder;
 
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
 
/**
Loading
Loading
@@ -29,10 +30,17 @@ public class ProjectsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
return mValues.get(position);
}
 
public ProjectsAdapter(List<Project> items) {
mValues = items;
public ProjectsAdapter() {
mValues = new ArrayList<>();
mNavItems = new ArrayList<>();
}
 
public void setData(Collection<Project> projects) {
mValues.clear();
if (projects != null) {
mValues.addAll(projects);
}
notifyDataSetChanged();
}
 
private final View.OnClickListener onProjectClickListener = new View.OnClickListener() {
Loading
Loading
Loading
Loading
@@ -130,4 +130,7 @@ public interface GitLab {
@DELETE(API_VERSION + "/groups/{id}/members/{user_id}")
Call<DeleteResponse> removeGroupMember(@Path("id") long groupId,
@Path("user_id") long userId);
@GET(API_VERSION + "/users")
Call<List<User>> searchUsers(@Query("search") String query);
}
\ No newline at end of file
package com.commit451.gitlab.dialogs;
import android.content.Context;
import android.support.v7.app.AppCompatDialog;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import com.commit451.gitlab.R;
import com.commit451.gitlab.adapter.ProjectAccessAdapter;
import butterknife.Bind;
import butterknife.ButterKnife;
/**
* Created by Jawn on 9/16/2015.
*/
public class UserRoleDialog extends AppCompatDialog {
public interface Listener {
void onAccessLevelClicked(String accessLevel);
}
Listener mListener;
@Bind(R.id.list) RecyclerView mRecyclerView;
ProjectAccessAdapter mAdapter;
private final ProjectAccessAdapter.Listener mAccessListener = new ProjectAccessAdapter.Listener() {
@Override
public void onAccessLevelClicked(String accessLevel) {
mListener.onAccessLevelClicked(accessLevel);
}
};
public UserRoleDialog(Context context, Listener listener) {
super(context);
setContentView(R.layout.dialog_user_role);
ButterKnife.bind(this);
mListener = listener;
mAdapter = new ProjectAccessAdapter(getContext(), mAccessListener);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mRecyclerView.setAdapter(mAdapter);
}
}
Loading
Loading
@@ -12,6 +12,7 @@ import android.widget.TextView;
 
import com.commit451.gitlab.GitLabApp;
import com.commit451.gitlab.R;
import com.commit451.gitlab.activities.AddUserActivity;
import com.commit451.gitlab.adapter.NewUserAdapter;
import com.commit451.gitlab.api.GitLabClient;
import com.commit451.gitlab.dialogs.NewUserDialog;
Loading
Loading
@@ -32,6 +33,7 @@ public class UsersFragment extends BaseFragment implements SwipeRefreshLayout.On
@Bind(R.id.add_user_button) View addUserButton;
@Bind(R.id.list) RecyclerView listView;
NewUserAdapter mAdapter;
@Bind(R.id.error_text) TextView errorText;
@Bind(R.id.swipe_layout) SwipeRefreshLayout swipeLayout;
 
Loading
Loading
@@ -44,7 +46,14 @@ public class UsersFragment extends BaseFragment implements SwipeRefreshLayout.On
View view = inflater.inflate(R.layout.fragment_users, container, false);
ButterKnife.bind(this, view);
 
mAdapter = new NewUserAdapter(new NewUserAdapter.Listener() {
@Override
public void onUserClicked(User user) {
//TODO go to profile or allow kicking from group or something
}
});
listView.setLayoutManager(new LinearLayoutManager(getActivity()));
listView.setAdapter(mAdapter);
swipeLayout.setOnRefreshListener(this);
 
if(GitLabApp.instance().getSelectedProject() != null) {
Loading
Loading
@@ -103,7 +112,7 @@ public class UsersFragment extends BaseFragment implements SwipeRefreshLayout.On
listView.setVisibility(View.VISIBLE);
addUserButton.setVisibility(View.VISIBLE);
 
listView.setAdapter(new NewUserAdapter(response.body()));
mAdapter.setData(response.body());
 
addUserButton.setEnabled(true);
}
Loading
Loading
@@ -128,6 +137,7 @@ public class UsersFragment extends BaseFragment implements SwipeRefreshLayout.On
@OnClick(R.id.add_user_button)
public void onAddUserClick() {
startActivity(AddUserActivity.newInstance(getActivity()));
new NewUserDialog(getActivity()).show();
}
 
Loading
Loading
package com.commit451.gitlab.model;
 
import com.google.gson.annotations.SerializedName;
import org.parceler.Parcel;
 
import java.util.Date;
@Parcel
public class User {
@SerializedName("id")
long id;
@SerializedName("username")
String username;
@SerializedName("email")
String email;
@SerializedName("avatar_url")
String avatar_url;
@SerializedName("name")
String name;
@SerializedName("blocked")
boolean blocked;
@SerializedName("created_at")
Date created_at;
int access_level;
@SerializedName("access_level")
int access_level = -1;
 
public User(){}
 
Loading
Loading
@@ -32,14 +42,12 @@ public class User {
}
 
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
 
public String getAvatarUrl() {
return avatar_url;
}
public void setAvatarUrl(String avatar_url) {
this.avatar_url = avatar_url;
}
 
public String getName() {
return name;
Loading
Loading
@@ -55,11 +63,8 @@ public class User {
this.blocked = blocked;
}
 
public Date getCreatedAt() {
return created_at;
}
public void setCreatedAt(Date created_at) {
this.created_at = created_at;
public int getAccessLevel() {
return access_level;
}
 
public String getAccessLevel(String[] names) {
Loading
Loading
@@ -70,9 +75,6 @@ public class User {
return "";
}
public void setAccessLevel(int access_level) {
this.access_level = access_level;
}
public boolean equals(Object obj) {
if (obj == null)
Loading
Loading
package com.commit451.gitlab.viewHolders;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.commit451.gitlab.R;
import butterknife.Bind;
import butterknife.ButterKnife;
/**
* Access denied!
* Created by Jawn on 9/16/2015.
*/
public class ProjectAccessViewHolder extends RecyclerView.ViewHolder {
public static ProjectAccessViewHolder create(ViewGroup parent) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_project_access, parent, false);
return new ProjectAccessViewHolder(view);
}
@Bind(R.id.textView) TextView title;
public ProjectAccessViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
}
public void bind(String access) {
title.setText(access);
}
}
Loading
Loading
@@ -16,7 +16,7 @@ import butterknife.ButterKnife;
import fr.tkeunebr.gravatar.Gravatar;
 
/**
* Projects, yay!
* Users, yay!
* Created by Jawn on 6/11/2015.
*/
public class UserViewHolder extends RecyclerView.ViewHolder {
Loading
Loading
@@ -27,10 +27,10 @@ public class UserViewHolder extends RecyclerView.ViewHolder {
return new UserViewHolder(view);
}
 
@Bind(R.id.title) TextView title;
@Bind(R.id.summary) TextView summary;
@Bind(R.id.custom) TextView custom;
@Bind(R.id.icon) ImageView icon;
@Bind(R.id.user_name) TextView name;
@Bind(R.id.user_username) TextView username;
@Bind(R.id.user_role) TextView role;
@Bind(R.id.user_image) ImageView image;
 
public UserViewHolder(View view) {
super(view);
Loading
Loading
@@ -38,15 +38,17 @@ public class UserViewHolder extends RecyclerView.ViewHolder {
}
 
public void bind(User user) {
title.setText(user.getName());
if(user.getEmail() != null) {
summary.setText(user.getEmail());
}
else {
summary.setText(user.getUsername());
name.setText(user.getName());
if(user.getUsername() != null) {
username.setText(user.getUsername());
}
 
custom.setText(user.getAccessLevel(itemView.getResources().getStringArray(R.array.role_names)));
if (user.getAccessLevel() != -1) {
role.setVisibility(View.VISIBLE);
role.setText(user.getAccessLevel(itemView.getResources().getStringArray(R.array.role_names)));
} else {
role.setVisibility(View.GONE);
}
 
int size = itemView.getResources().getDimensionPixelSize(R.dimen.image_size);
 
Loading
Loading
@@ -59,6 +61,8 @@ public class UserViewHolder extends RecyclerView.ViewHolder {
url = user.getAvatarUrl() + "&s=" + size;
}
 
Picasso.with(itemView.getContext()).load(url).into(icon);
Picasso.with(itemView.getContext())
.load(url)
.into(image);
}
}
Loading
Loading
@@ -33,6 +33,7 @@ public class GitLabNavigationView extends FrameLayout{
 
@Bind(R.id.profile_image) ImageView profileImage;
@Bind(R.id.list) RecyclerView projectList;
ProjectsAdapter mAdapter;
 
@OnClick(R.id.drawer_header)
void onHeaderClick() {
Loading
Loading
@@ -83,11 +84,13 @@ public class GitLabNavigationView extends FrameLayout{
private void init() {
inflate(getContext(), R.layout.nav_drawer, this);
ButterKnife.bind(this);
mAdapter = new ProjectsAdapter();
projectList.setAdapter(mAdapter);
projectList.setLayoutManager(new LinearLayoutManager(getContext()));
}
 
public void setProjects(List<Project> projects) {
projectList.setAdapter(new ProjectsAdapter(projects));
mAdapter.setData(projects);
}
 
public void setUserId(long userId) {
Loading
Loading
<?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="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary" >
<EditText
android:id="@+id/userSearch"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/search_for_user"
android:singleLine="true"
android:imeOptions="actionSearch"
android:layout_marginRight="16dp"/>
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<com.commit451.gitlab.views.GitLabSwipeRefreshLayout
android:id="@+id/swipe_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v7.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</com.commit451.gitlab.views.GitLabSwipeRefreshLayout>
</LinearLayout>
\ No newline at end of file
Loading
Loading
@@ -7,7 +7,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/logout_title"
android:id="@+id/textView" />
 
Loading
Loading
<?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="match_parent"
android:padding="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/set_project_access"
android:id="@+id/textView" />
<android.support.v7.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/textView" />
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/list_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:orientation="horizontal"
android:paddingLeft="8dp"
android:paddingRight="?android:attr/scrollbarSize" >
<RelativeLayout
android:id="@+id/img_lay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp" >
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" />
</RelativeLayout>
<RelativeLayout
android:layout_toRightOf="@+id/img_lay"
android:id="@+id/user_list_item"
android:layout_width="match_parent"
android:padding="8dp"
android:minHeight="?android:attr/listPreferredItemHeight"
android:background="?attr/selectableItemBackground">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/user_image"
android:layout_width="@dimen/image_size"
android:layout_height="@dimen/image_size"
android:layout_marginRight="8dp"
android:layout_gravity="center_vertical"
android:contentDescription="@null"
tools:src="@drawable/ic_doc"
/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingRight="?android:attr/scrollbarSize" >
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:singleLine="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:textAppearance="?android:attr/textAppearanceMedium" />
android:layout_weight="1"
android:orientation="vertical">
 
<TextView
android:id="@+id/summary"
android:id="@+id/user_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/title"
android:layout_below="@+id/title"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary" />
android:textSize="@dimen/text_size_small"
android:maxLines="2"
android:ellipsize="end"
tools:text="John"/>
 
<TextView
android:id="@+id/custom"
android:id="@+id/user_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary" />
android:textSize="@dimen/text_size_tiny"
android:textColor="@color/white_60"
tools:text="Jawnnypoo"/>
 
</RelativeLayout>
</LinearLayout>
<TextView
android:id="@+id/user_role"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/text_size_tiny"
android:layout_gravity="bottom"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
tools:text="Closed"/>
 
</RelativeLayout>
\ No newline at end of file
</LinearLayout>
\ No newline at end of file
Loading
Loading
@@ -91,6 +91,8 @@
<string name="add_user">Add user to group</string>
<string name="add_user_dialog_title">Add user</string>
<string name="no_users_found">No users found.</string>
<string name="search_for_user">Search for user</string>
<string name="set_project_access">Project Access</string>
 
<string-array name="role_names">
<item>Guest</item>
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment