Merge branch 'userListEnchancment' of s416084/find-my-tutor-android into develop

This commit is contained in:
Mieszko Wrzeszczyński 2019-01-09 23:41:41 +00:00 committed by Gogs
commit 393f25b1f9
11 changed files with 169 additions and 69 deletions

View File

@ -10,7 +10,7 @@ android {
applicationId "com.uam.wmi.findmytutor"
minSdkVersion 22
targetSdkVersion 27
versionCode 53
versionCode 55
versionName "1.0.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true

View File

@ -412,7 +412,6 @@ public abstract class BaseActivity
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.activity_content, sharingFragment);
ft.commit();
}
private void loadUserListFragment() {

View File

@ -74,7 +74,7 @@ import static com.uam.wmi.findmytutor.utils.Const.mapRefreshInterval;
public class MapActivity extends BaseActivity
implements PermissionsListener, OnMapReadyCallback {
public HashMap<Long, String> markerUserHash = new HashMap<>();
private HashMap<Long, String> markerUserHash = new HashMap<>();
private String tag = getClass().getName();
private PermissionsManager permissionsManager;
private LocationComponent locationComponent;
@ -90,7 +90,7 @@ public class MapActivity extends BaseActivity
private Button removeLocationButton;
private Marker tmpLocalMarker;
private Coordinate droppedMarkercoordinate;
private HashMap<String, Coordinate> coordsMap = new HashMap<>();
public HashMap<String, Coordinate> coordsMap = new HashMap<>();
private HashMap<String, MapMarker> markerHash = new HashMap<>();
private Set<String> previousCoordsIds = new HashSet<>();
private ManualLocationUtils manualLocationUtils;

View File

@ -14,6 +14,7 @@ import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.format.DateFormat;
import android.text.style.ImageSpan;
import android.util.Log;
import android.view.Gravity;
@ -24,6 +25,7 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
@ -31,10 +33,12 @@ import com.annimon.stream.Stream;
import com.jakewharton.retrofit2.adapter.rxjava2.HttpException;
import com.uam.wmi.findmytutor.R;
import com.uam.wmi.findmytutor.adapters.TutorsListAdapter;
import com.uam.wmi.findmytutor.model.Coordinate;
import com.uam.wmi.findmytutor.model.DutyHourViewModel;
import com.uam.wmi.findmytutor.model.TutorTabViewModel;
import com.uam.wmi.findmytutor.model.User;
import com.uam.wmi.findmytutor.network.ApiClient;
import com.uam.wmi.findmytutor.service.CoordinateService;
import com.uam.wmi.findmytutor.service.TutorTabApi;
import com.uam.wmi.findmytutor.service.UserService;
import com.uam.wmi.findmytutor.utils.ActiveFragment;
@ -45,7 +49,9 @@ import com.uam.wmi.findmytutor.utils.RestApiHelper;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
@ -72,9 +78,12 @@ public class UsersListFragment extends Fragment {
private SearchView searchView;
private UserService userService;
private TutorTabApi tutorTabService;
private CoordinateService coordinateService;
private CompositeDisposable disposable = new CompositeDisposable();
private TutorsListAdapter mAdapter;
private List<User> tutorsList = new ArrayList<>();
private HashMap<String, String> tutorsTimeStamps = new HashMap<>();
private Collator plCollator = Collator.getInstance(Locale.forLanguageTag("pl-PL"));
private Boolean fetchOnlyOnlineUsers = PrefUtils.getShowOnlyOnlineUsers(getApplicationContext());
@ -86,7 +95,8 @@ public class UsersListFragment extends Fragment {
}
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mAdapter = new TutorsListAdapter(getActivity().getApplicationContext(), tutorsList);
mAdapter = new TutorsListAdapter(getActivity().getApplicationContext(), tutorsList, tutorsTimeStamps);
View view = inflater.inflate(R.layout.users_list, container, false);
view.setBackgroundColor(getResources().getColor(android.R.color.white));
setHasOptionsMenu(true);
@ -98,9 +108,10 @@ public class UsersListFragment extends Fragment {
userService = ApiClient.getClient(getApplicationContext())
.create(UserService.class);
tutorTabService = ApiClient.getClient(getActivity().getApplicationContext())
.create(TutorTabApi.class);
coordinateService = ApiClient.getClient(getApplicationContext())
.create(CoordinateService.class);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(mLayoutManager);
@ -110,6 +121,7 @@ public class UsersListFragment extends Fragment {
recyclerView.setAdapter(mAdapter);
fetchAllTutors();
fetchTopCords();
recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity().getApplicationContext(),
recyclerView, new RecyclerTouchListener.ClickListener() {
@ -192,6 +204,9 @@ public class UsersListFragment extends Fragment {
TextView userRoom = view.findViewById(R.id.userRoom);
TextView userEmail = view.findViewById(R.id.userEmail);
TextView department = view.findViewById(R.id.userDepartment);
TextView userStatusLabel = view.findViewById(R.id.user_status_label);
LinearLayout userStatusLabelLL = view.findViewById(R.id.user_status_label_linearLayout);
userName.setText(String.format("%s %s", user.getFirstName(), user.getLastName()));
@ -221,7 +236,8 @@ public class UsersListFragment extends Fragment {
@Override
public void onSuccess(TutorTabViewModel tutorTabViewModel) {
final AlertDialog alertDialog;
if (((MapActivity) getActivity()).markerUserHash.containsValue(user.getId())) {
if (((MapActivity) getActivity()).coordsMap.containsKey(user.getId())) {
alertDialogBuilderUserInput.setPositiveButton(R.string.show_on_map, (dialog, id) -> {
// User cancelled the dialog
((MapActivity) getActivity()).activeFragment = ActiveFragment.NONE;
@ -230,11 +246,6 @@ public class UsersListFragment extends Fragment {
fragmentTransaction.commit();
((MapActivity) getActivity()).searchUser(user.getFirstName());
((MapActivity) getActivity()).updateNavigationBarState();
/* List<User> list = new ArrayList<User>();
list.add(user);
((MapActivity) getActivity()).filterMarkers(list);
((MapActivity) getActivity()).updateNavigationBarState();*/
});
}
alertDialog = alertDialogBuilderUserInput.create();
@ -257,6 +268,16 @@ public class UsersListFragment extends Fragment {
department.setText(String.format("%s: %s", getString(R.string.userDepartment), user.getDepartment()));
userDutyHoursTitle.setText(String.format("%s:", getString(R.string.userDutyHoursHeader)));
Coordinate coordinate = ((MapActivity) getActivity()).coordsMap.get(user.getId());
if (coordinate != null){
String label = coordinate.getLabel();
if (!label.isEmpty()) {
userStatusLabelLL.setVisibility(View.VISIBLE);
userStatusLabel.setText(String.format("%s: %s", getString(R.string.user_status_label),label));
}
}
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(getActivity(),
R.layout.duty_hours_item, dutyHoursList);
@ -338,6 +359,7 @@ public class UsersListFragment extends Fragment {
public void restoreUsersList() {
fetchAllTutors();
fetchTopCords();
}
private int sortByUserName(User t1, User t2) {
@ -419,4 +441,35 @@ public class UsersListFragment extends Fragment {
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
private void fetchTopCords(){
disposable.add(
coordinateService.getTopCoordinates()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableSingleObserver<List<Coordinate>>() {
@Override
public void onSuccess(List<Coordinate> newCords) {
for (Coordinate crd :
newCords) {
Long ts = crd.getTimeStamp();
if (ts != 0){
tutorsTimeStamps.put(crd.getUserId(), getDate(ts));
}
}
mAdapter.notifyDataSetChanged();
}
@Override
public void onError(Throwable e) {showSearchError(e);}
}));
}
private String getDate(long time) {
Calendar cal = Calendar.getInstance(Locale.ENGLISH);
cal.setTimeInMillis(time);
String date = DateFormat.format("HH:mm dd/MM", cal).toString();
return date;
}
}

View File

@ -12,6 +12,7 @@ import android.widget.TextView;
import com.uam.wmi.findmytutor.R;
import com.uam.wmi.findmytutor.model.User;
import java.util.HashMap;
import java.util.List;
import butterknife.BindView;
@ -22,10 +23,12 @@ public class TutorsListAdapter extends RecyclerView.Adapter<TutorsListAdapter.My
private Context context;
private List<User> tutorsList;
private HashMap<String, String> tutorsTimeStamps;
public TutorsListAdapter(Context context, List<User> tutors) {
public TutorsListAdapter(Context context, List<User> tutors, HashMap<String,String> tutorsTimeStamps) {
this.context = context;
this.tutorsList = tutors;
this.tutorsTimeStamps = tutorsTimeStamps;
}
@NonNull
@Override
@ -41,13 +44,18 @@ public class TutorsListAdapter extends RecyclerView.Adapter<TutorsListAdapter.My
Drawable image = null;
User tutor = tutorsList.get(position);
holder.firstName.setText(tutor.getFirstName());
holder.lastName.setText(tutor.getLastName());
holder.firstName.setText(String.format("%s %s", tutor.getFirstName(), tutor.getLastName()));
if (tutor.isIsOnline()) {
image = context.getResources().getDrawable(R.drawable.user_list_online);
holder.lastSeen.setText(R.string.available_now);
} else {
image = context.getResources().getDrawable(R.drawable.user_list_offline);
String ts = tutorsTimeStamps.get(tutor.getId());
if (ts != null){
holder.lastSeen.setText(String.format("%s: %s", context.getResources().getString(R.string.last_seen), ts));
}
}
if (!tutor.isIsActive()) {
@ -68,8 +76,8 @@ public class TutorsListAdapter extends RecyclerView.Adapter<TutorsListAdapter.My
@BindView(R.id.firstName)
TextView firstName;
@BindView(R.id.lastName)
TextView lastName;
@BindView(R.id.lastSeen)
TextView lastSeen;
@BindView(R.id.isOnline)
TextView isOnline;
@ -79,6 +87,7 @@ public class TutorsListAdapter extends RecyclerView.Adapter<TutorsListAdapter.My
ButterKnife.bind(this, view);
}
}
}
}

View File

@ -25,7 +25,7 @@ public interface CoordinateService {
Single<List<Coordinate>> getCoordinatesByUserId(@Path("userId") String userId);
@GET("api/coordinates/userTop/{userId}")
Single<List<Coordinate>> getTopCoordinatesByUserId(@Path("userId") String userId);
Single<Coordinate> getTopCoordinatesByUserId(@Path("userId") String userId);
@GET("api/coordinates/top")
Single<List<Coordinate>> getTopCoordinates();

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#ffffff"
android:pathData="M22 10l-6-6H4c-1.1 0-2 0.9-2 2v12.01c0 1.1 0.9 1.99 2 1.99l16-0.01c1.1 0 2-0.89 2-1.99v-8zm-7-4.5l5.5 5.5H15V5.5z" />
<path
android:pathData="M0 0h24v24H0V0z" />
</vector>

View File

@ -23,7 +23,7 @@
android:textSize="15sp" />
<TextView
android:id="@+id/lastName"
android:id="@+id/lastSeen"
android:layout_width="270dp"
android:layout_height="22dp"
android:layout_marginStart="12dp"
@ -32,8 +32,8 @@
android:layout_marginTop="10dp"
android:layout_marginEnd="0dp"
android:layout_alignParentStart="true"
android:textColor="@color/note_list_text"
android:textSize="15sp" />
android:textColor="#979797"
android:textSize="13sp" />
<TextView

View File

@ -27,19 +27,20 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/userName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:drawablePadding="10dp"
android:gravity="center_horizontal"
android:text="Name Surname"
android:textColor="@color/white"
android:textSize="@dimen/lbl_new_note_title"
android:textStyle="normal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/userName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:gravity="center_horizontal"
android:textColor="@color/white"
android:textSize="@dimen/lbl_new_note_title"
android:textStyle="normal"
android:drawablePadding="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
</android.support.constraint.ConstraintLayout>
</RelativeLayout>
@ -50,6 +51,28 @@
android:layout_marginTop="25dp"
android:orientation="vertical">
<LinearLayout
android:id="@+id/user_status_label_linearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone"
android:paddingLeft="20dp">
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/user_modal_title" />
<TextView
android:id="@+id/user_status_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:paddingLeft="10dp"
android:textColor="@color/mapboxWhite" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -59,15 +82,15 @@
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/user_modal_department"/>
android:src="@drawable/user_modal_department" />
<TextView
android:id="@+id/userDepartment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textColor="@color/mapboxWhite"
android:paddingLeft="10dp"
/>
android:textColor="@color/mapboxWhite" />
</LinearLayout>
<LinearLayout
@ -80,15 +103,15 @@
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/user_modal_room"/>
android:src="@drawable/user_modal_room" />
<TextView
android:id="@+id/userRoom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textColor="@color/mapboxWhite"
android:paddingLeft="10dp"
/>
android:textColor="@color/mapboxWhite" />
</LinearLayout>
<LinearLayout
@ -101,15 +124,15 @@
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/user_modal_email"/>
android:src="@drawable/user_modal_email" />
<TextView
android:id="@+id/userEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textColor="@color/mapboxWhite"
android:paddingLeft="10dp"
/>
android:textColor="@color/mapboxWhite" />
</LinearLayout>
@ -123,15 +146,14 @@
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/user_modal_duty"/>
android:src="@drawable/user_modal_duty" />
<TextView
android:id="@+id/userDutyHoursTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/mapboxWhite"
android:paddingLeft="10dp"
/>
android:textColor="@color/mapboxWhite" />
</LinearLayout>
<LinearLayout
@ -151,34 +173,33 @@
android:id="@+id/userDutyHours"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="25dp"
android:paddingTop="-10dp"
android:divider="@color/background_user_modal"
android:dividerHeight="1dp"
android:textColor="@color/mapboxWhite"
/>
android:paddingLeft="25dp"
android:paddingTop="-10dp"
android:textColor="@color/mapboxWhite" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:orientation="horizontal"
android:paddingLeft="20dp">
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/user_modal_note"/>
<TextView
android:id="@+id/userNote"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textColor="@color/mapboxWhite"
android:paddingLeft="10dp"
/>
</LinearLayout>
android:layout_marginTop="5dp"
android:orientation="horizontal"
android:paddingLeft="20dp">
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/user_modal_note" />
<TextView
android:id="@+id/userNote"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:paddingLeft="10dp"
android:textColor="@color/mapboxWhite" />
</LinearLayout>
</LinearLayout>

View File

@ -284,7 +284,9 @@
<string name="exact_mode">dokładny</string>
<string name="approx_mode">przybliżony</string>
<string name="other_location">Niezapisana lokalizacja.</string>
<string name="last_seen">Ostatnio</string>
<string name="available_now">Dostępny teraz</string>
<string name="profile_activity_title">Profil</string>
</resources>

View File

@ -453,4 +453,7 @@
<!--(ENG) Undefined manual -->
<string name="other_location">Not saved location.</string>
<string name="user_status_label" translatable="false">Status</string>
<string name="available_now">Available now</string>
<string name="last_seen">Last seen</string>
</resources>