From 299e25d0f98f7d37250b58e872645dae4b672ff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mieszko=20Wrzeszczy=C5=84ski?= Date: Sat, 27 Oct 2018 23:58:51 +0200 Subject: [PATCH] Add primitive modal about user --- .../activity/UsersListActivity.java | 103 +++++---- .../findmytutor/model/DutyHourViewModel.java | 122 +++++++++++ .../findmytutor/model/TutorTabViewModel.java | 199 ++++++++++++++++++ .../wmi/findmytutor/service/TutorTabApi.java | 58 +++++ app/src/main/res/layout/note_dialog.xml | 37 +++- app/src/main/res/layout/tutor_list_row.xml | 12 +- 6 files changed, 475 insertions(+), 56 deletions(-) create mode 100644 app/src/main/java/com/uam/wmi/findmytutor/model/DutyHourViewModel.java create mode 100644 app/src/main/java/com/uam/wmi/findmytutor/model/TutorTabViewModel.java create mode 100644 app/src/main/java/com/uam/wmi/findmytutor/service/TutorTabApi.java diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/UsersListActivity.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/UsersListActivity.java index 5333ebe..7e053e4 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/UsersListActivity.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/UsersListActivity.java @@ -1,6 +1,5 @@ package com.uam.wmi.findmytutor.activity; -import android.content.DialogInterface; import android.graphics.Color; import android.os.Build; import android.os.Bundle; @@ -8,25 +7,25 @@ import android.support.annotation.RequiresApi; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.Snackbar; import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; -import android.text.TextUtils; +import android.util.Log; import android.view.LayoutInflater; -import android.view.MenuItem; import android.view.View; -import android.widget.EditText; +import android.widget.ArrayAdapter; +import android.widget.ListView; import android.widget.TextView; -import android.widget.Toast; import com.annimon.stream.Stream; import com.jakewharton.retrofit2.adapter.rxjava2.HttpException; import com.uam.wmi.findmytutor.R; - -import com.uam.wmi.findmytutor.model.ReturnedTutors; +import com.uam.wmi.findmytutor.model.DutyHour; +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.TutorTabApi; import com.uam.wmi.findmytutor.service.UserService; import com.uam.wmi.findmytutor.utils.MyDividerItemDecoration; import com.uam.wmi.findmytutor.utils.RecyclerTouchListener; @@ -35,34 +34,29 @@ import com.uam.wmi.findmytutor.view.TutorsAdapter; import java.util.ArrayList; import java.util.Collections; -import java.util.Comparator; import java.util.List; -import java.util.stream.Collectors; import butterknife.BindView; import butterknife.ButterKnife; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; -import io.reactivex.functions.Function; import io.reactivex.observers.DisposableSingleObserver; import io.reactivex.schedulers.Schedulers; import okhttp3.ResponseBody; -public class UsersListActivity extends BaseActivity { +public class UsersListActivity extends BaseActivity { private static final String TAG = UsersListActivity.class.getSimpleName(); - private UserService apiService; + @BindView(R.id.coordinator_layout) + CoordinatorLayout coordinatorLayout; + @BindView(R.id.recycler_view) + RecyclerView recyclerView; + @BindView(R.id.txt_empty_notes_view) + TextView noNotesView; + private UserService userService; + private TutorTabApi tutorTabService; private CompositeDisposable disposable = new CompositeDisposable(); private TutorsAdapter mAdapter; private List tutorsList = new ArrayList<>(); - @BindView(R.id.coordinator_layout) - CoordinatorLayout coordinatorLayout; - - @BindView(R.id.recycler_view) - RecyclerView recyclerView; - - - @BindView(R.id.txt_empty_notes_view) - TextView noNotesView; @RequiresApi(api = Build.VERSION_CODES.N) @Override @@ -72,9 +66,12 @@ public class UsersListActivity extends BaseActivity { setContentView(R.layout.users_list); ButterKnife.bind(this); - apiService = ApiClient.getClient(getApplicationContext()) + userService = ApiClient.getClient(getApplicationContext()) .create(UserService.class); + tutorTabService = ApiClient.getClient(getApplicationContext()) + .create(TutorTabApi.class); + mAdapter = new TutorsAdapter(this, tutorsList); RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); recyclerView.setLayoutManager(mLayoutManager); @@ -94,7 +91,8 @@ public class UsersListActivity extends BaseActivity { @Override public void onLongClick(View view, int position) { //showActionsDialog(position); - showNoteDialog(true, tutorsList.get(position), position); + + //showNoteDialog(true, tutorsList.get(position), position); } })); } @@ -115,43 +113,70 @@ public class UsersListActivity extends BaseActivity { builder.show(); } - private void showNoteDialog(final boolean shouldUpdate, final User note, final int position) { + private void showNoteDialog(final boolean shouldUpdate, final User user, final int position) { LayoutInflater layoutInflaterAndroid = LayoutInflater.from(getApplicationContext()); View view = layoutInflaterAndroid.inflate(R.layout.note_dialog, null); AlertDialog.Builder alertDialogBuilderUserInput = new AlertDialog.Builder(this); alertDialogBuilderUserInput.setView(view); - final TextView inputNote = view.findViewById(R.id.note); - TextView dialogTitle = view.findViewById(R.id.dialog_title); - dialogTitle.setText(note.getNormalizedUserName()); + TextView userName = view.findViewById(R.id.userName); + TextView userDutyHours = view.findViewById(R.id.userDutyHours); + TextView userNote = view.findViewById(R.id.userNote); + TextView userRoom = view.findViewById(R.id.userRoom); + TextView userEmail = view.findViewById(R.id.userEmail); + + userName.setText(user.getFirstName() + " " + user.getLastName()); + + disposable.add( + tutorTabService.apiUsersTutorTabByTutorIdGet(user.getId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeWith(new DisposableSingleObserver() { + @Override + public void onSuccess(TutorTabViewModel tutorTabViewModel) { + Log.e("TUTOR_TAB",tutorTabViewModel.toString()); + + List dutyHourslist = Stream.of(tutorTabViewModel.getDutyHours()) + .map(DutyHourViewModel::toString).toList(); + + userRoom.setText(tutorTabViewModel.getRoom()); + userEmail.setText(tutorTabViewModel.getEmailTutorTab()); + userNote.setText(tutorTabViewModel.getNote()); + + if(dutyHourslist.size() > 0) + userDutyHours.setText(dutyHourslist.get(0)); - inputNote.setText(note.getNormalizedUserName() + note.getTitle() + note.getDepartment()); + } + + @Override + public void onError(Throwable e) { + showError(e); + } + })); + final AlertDialog alertDialog = alertDialogBuilderUserInput.create(); alertDialog.show(); - - } - - private void fetchAllTutors() { disposable.add( - apiService.apiUsersGet() + userService.apiUsersGet() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .map(tutors -> { List tutorsList = new ArrayList<>(tutors.getTutors()); List onlineTutors = Stream.of(tutorsList).filter(User::isIsOnline).toList(); - List activeNotOnlineTutors = Stream.of(tutorsList) - .filter(t -> t.isIsActive() && !onlineTutors.contains(t)).toList();; - List notActiveTutors = Stream.of(tutorsList) - .filterNot(User::isIsActive).toList();; + List activeNotOnlineTutors = Stream.of(tutorsList) + .filter(t -> t.isIsActive() && !onlineTutors.contains(t)).toList(); + + List notActiveTutors = Stream.of(tutorsList) + .filterNot(User::isIsActive).toList(); Collections.sort(onlineTutors, (t1, t2) -> t1.getFirstName().compareTo(t2.getFirstName())); Collections.sort(activeNotOnlineTutors, (t1, t2) -> t1.getFirstName().compareTo(t2.getFirstName())); @@ -163,7 +188,7 @@ public class UsersListActivity extends BaseActivity { return sortedUserList; }) - .subscribeWith(new DisposableSingleObserver >() { + .subscribeWith(new DisposableSingleObserver>() { @Override public void onSuccess(List users) { tutorsList.clear(); diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/DutyHourViewModel.java b/app/src/main/java/com/uam/wmi/findmytutor/model/DutyHourViewModel.java new file mode 100644 index 0000000..36e688e --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/DutyHourViewModel.java @@ -0,0 +1,122 @@ +package com.uam.wmi.findmytutor.model; + + +import java.util.Objects; +import com.google.gson.annotations.SerializedName; +import io.swagger.annotations.ApiModelProperty; + + +/** + * DutyHourViewModel + */ + +public class DutyHourViewModel { + @SerializedName("day") + private String day = null; + + @SerializedName("start") + private String start = null; + + @SerializedName("end") + private String end = null; + + public DutyHourViewModel day(String day) { + this.day = day; + return this; + } + + /** + * Get day + * @return day + **/ + @ApiModelProperty(value = "") + public String getDay() { + return day; + } + + public void setDay(String day) { + this.day = day; + } + + public DutyHourViewModel start(String start) { + this.start = start; + return this; + } + + /** + * Get start + * @return start + **/ + @ApiModelProperty(value = "") + public String getStart() { + return start; + } + + public void setStart(String start) { + this.start = start; + } + + public DutyHourViewModel end(String end) { + this.end = end; + return this; + } + + /** + * Get end + * @return end + **/ + @ApiModelProperty(value = "") + public String getEnd() { + return end; + } + + public void setEnd(String end) { + this.end = end; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + DutyHourViewModel dutyHourViewModel = (DutyHourViewModel) o; + return Objects.equals(this.day, dutyHourViewModel.day) && + Objects.equals(this.start, dutyHourViewModel.start) && + Objects.equals(this.end, dutyHourViewModel.end); + } + + @Override + public int hashCode() { + return Objects.hash(day, start, end); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class DutyHourViewModel {\n"); + + sb.append(" day: ").append(toIndentedString(day)).append("\n"); + sb.append(" start: ").append(toIndentedString(start)).append("\n"); + sb.append(" end: ").append(toIndentedString(end)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/TutorTabViewModel.java b/app/src/main/java/com/uam/wmi/findmytutor/model/TutorTabViewModel.java new file mode 100644 index 0000000..8c7bb97 --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/TutorTabViewModel.java @@ -0,0 +1,199 @@ +package com.uam.wmi.findmytutor.model; + + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import com.google.gson.annotations.SerializedName; + +import io.swagger.annotations.ApiModelProperty; + +import java.util.UUID; + +/** + * TutorTabViewModel + */ + +public class TutorTabViewModel { + @SerializedName("tutorTabId") + private UUID tutorTabId = null; + + @SerializedName("userId") + private String userId = null; + + @SerializedName("room") + private String room = null; + + @SerializedName("emailTutorTab") + private String emailTutorTab = null; + + @SerializedName("note") + private String note = null; + + @SerializedName("dutyHours") + private List dutyHours = null; + + public TutorTabViewModel tutorTabId(UUID tutorTabId) { + this.tutorTabId = tutorTabId; + return this; + } + + /** + * Get tutorTabId + * @return tutorTabId + **/ + @ApiModelProperty(value = "") + public UUID getTutorTabId() { + return tutorTabId; + } + + public void setTutorTabId(UUID tutorTabId) { + this.tutorTabId = tutorTabId; + } + + public TutorTabViewModel userId(String userId) { + this.userId = userId; + return this; + } + + /** + * Get userId + * @return userId + **/ + @ApiModelProperty(value = "") + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public TutorTabViewModel room(String room) { + this.room = room; + return this; + } + + /** + * Get room + * @return room + **/ + @ApiModelProperty(value = "") + public String getRoom() { + return room; + } + + public void setRoom(String room) { + this.room = room; + } + + public TutorTabViewModel emailTutorTab(String emailTutorTab) { + this.emailTutorTab = emailTutorTab; + return this; + } + + /** + * Get emailTutorTab + * @return emailTutorTab + **/ + @ApiModelProperty(value = "") + public String getEmailTutorTab() { + return emailTutorTab; + } + + public void setEmailTutorTab(String emailTutorTab) { + this.emailTutorTab = emailTutorTab; + } + + public TutorTabViewModel note(String note) { + this.note = note; + return this; + } + + + public String getNote() { + return note; + } + + public void setNote(String note) { + this.note = note; + } + + public TutorTabViewModel dutyHours(List dutyHours) { + this.dutyHours = dutyHours; + return this; + } + + public TutorTabViewModel addDutyHoursItem(DutyHourViewModel dutyHoursItem) { + if (this.dutyHours == null) { + this.dutyHours = new ArrayList(); + } + this.dutyHours.add(dutyHoursItem); + return this; + } + + /** + * Get dutyHours + * @return dutyHours + **/ + @ApiModelProperty(value = "") + public List getDutyHours() { + return dutyHours; + } + + public void setDutyHours(List dutyHours) { + this.dutyHours = dutyHours; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + TutorTabViewModel tutorTabViewModel = (TutorTabViewModel) o; + return Objects.equals(this.tutorTabId, tutorTabViewModel.tutorTabId) && + Objects.equals(this.userId, tutorTabViewModel.userId) && + Objects.equals(this.room, tutorTabViewModel.room) && + Objects.equals(this.emailTutorTab, tutorTabViewModel.emailTutorTab) && + Objects.equals(this.note, tutorTabViewModel.note) && + Objects.equals(this.dutyHours, tutorTabViewModel.dutyHours); + } + + @Override + public int hashCode() { + return Objects.hash(tutorTabId, userId, room, emailTutorTab, note, dutyHours); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class TutorTabViewModel {\n"); + + sb.append(" tutorTabId: ").append(toIndentedString(tutorTabId)).append("\n"); + sb.append(" userId: ").append(toIndentedString(userId)).append("\n"); + sb.append(" room: ").append(toIndentedString(room)).append("\n"); + sb.append(" emailTutorTab: ").append(toIndentedString(emailTutorTab)).append("\n"); + sb.append(" note: ").append(toIndentedString(note)).append("\n"); + sb.append(" dutyHours: ").append(toIndentedString(dutyHours)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/app/src/main/java/com/uam/wmi/findmytutor/service/TutorTabApi.java b/app/src/main/java/com/uam/wmi/findmytutor/service/TutorTabApi.java new file mode 100644 index 0000000..e2f6d9a --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/service/TutorTabApi.java @@ -0,0 +1,58 @@ +package com.uam.wmi.findmytutor.service; + + +import com.uam.wmi.findmytutor.model.TutorTabViewModel; + +import io.reactivex.Observable; +import io.reactivex.Single; +import retrofit2.http.*; + + +public interface TutorTabApi { + /** + * Scrap all tutor tabs + * With this method, you can initialize tutor tabs scrapper. The effect will be: - all tutor tabs will be overwritten with data from the WMI source + * @param tutorId (required) + * @return Call<Void> + */ + @POST("api/users/scrapTutorTab/{tutorId}") + Observable apiUsersScrapTutorTabByTutorIdPost( + @retrofit2.http.Path("tutorId") String tutorId + ); + + /** + * Scrap all tutor tabs + * With this method, you can initialize tutor tabs scrapper. The effect will be: - all tutor tabs will be overwritten with data from the WMI source + * @return Call<Void> + */ + @POST("api/users/scrapTutorTab") + Observable apiUsersScrapTutorTabPost(); + + + /** + * + * + * @param tutorId (required) + * @return Call<TutorTabViewModel> + */ + @GET("api/users/tutorTab/{tutorId}") + Single apiUsersTutorTabByTutorIdGet( + @retrofit2.http.Path("tutorId") String tutorId + ); + + /** + * + * + * @param tutorId (required) + * @param tutorTab (optional) + * @return Call<Void> + */ + @Headers({ + "Content-Type:application/json" + }) + @PUT("api/users/tutorTab/{tutorId}") + Observable apiUsersTutorTabByTutorIdPut( + @retrofit2.http.Path("tutorId") String tutorId, @retrofit2.http.Body TutorTabViewModel tutorTab + ); + +} diff --git a/app/src/main/res/layout/note_dialog.xml b/app/src/main/res/layout/note_dialog.xml index 2fc7ee8..08dcdd2 100644 --- a/app/src/main/res/layout/note_dialog.xml +++ b/app/src/main/res/layout/note_dialog.xml @@ -1,5 +1,6 @@ - - + android:textColor="@color/note_list_text" + /> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/tutor_list_row.xml b/app/src/main/res/layout/tutor_list_row.xml index f1c59c4..d31fb60 100644 --- a/app/src/main/res/layout/tutor_list_row.xml +++ b/app/src/main/res/layout/tutor_list_row.xml @@ -1,7 +1,7 @@ + android:textSize="15sp" /> + android:textSize="15sp" />