diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 30aa626..2715a34 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -1,29 +1,29 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/SharingFragment.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/SharingFragment.java index 6bf9a04..1ede65f 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/SharingFragment.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/SharingFragment.java @@ -7,6 +7,7 @@ import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceCategory; import android.preference.PreferenceFragment; +import android.preference.SwitchPreference; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -40,7 +41,7 @@ import static com.mapbox.mapboxsdk.Mapbox.getApplicationContext; public class SharingFragment extends PreferenceFragment { - protected Preference locationSharing; + protected SwitchPreference locationSharing; protected Preference locationMode; protected ListPreference manualLocationList; protected PreferenceCategory preferenceCategory; @@ -113,7 +114,7 @@ public class SharingFragment extends PreferenceFragment { public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.layout.pref_sharing); - locationSharing = findPreference("key_sharing_enabled"); + locationSharing = (SwitchPreference) findPreference("key_sharing_enabled"); locationMode = findPreference("key_location_level"); preferenceCategory = (PreferenceCategory) findPreference("category_sharing"); manualLocationList = (ListPreference) findPreference("key_manual_location_value"); diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/TutorTab.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/TutorTab.java index f96a2b0..31ac9e6 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/TutorTab.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/TutorTab.java @@ -2,16 +2,22 @@ package com.uam.wmi.findmytutor.activity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; +import android.widget.Adapter; import android.widget.Button; import android.widget.EditText; +import android.widget.LinearLayout; 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.adapters.DutyHoursAdapter; +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; @@ -22,6 +28,7 @@ import com.uam.wmi.findmytutor.utils.InfoHelperUtils; import com.uam.wmi.findmytutor.utils.PrefUtils; import com.uam.wmi.findmytutor.utils.RestApiHelper; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -42,28 +49,38 @@ public class TutorTab extends AppCompatActivity { private TextView userRoom; private TextView userEmail; private TextView department; + private Button addDutyButton; private Button saveButon; + private Boolean ifTutorTabExists = true; + private List dutyHourList; + private RecyclerView dutyHoursRecycller; + private DutyHoursAdapter dutyHoursAdapter; + private RecyclerView.LayoutManager dutyHoursLayoutManager; private TutorTabViewModel newTab; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setContentView(R.layout.content_tutor_tab); + + userName = findViewById(R.id.userName); +// TextView userDutyHours = findViewById(R.id.userDutyHours); + userNote = findViewById(R.id.userNote); + userRoom = findViewById(R.id.userRoom); + userEmail = findViewById(R.id.userEmail); + department = findViewById(R.id.userDepartment); + saveButon = findViewById(R.id.saveButon); + addDutyButton = findViewById(R.id.addDuty); + dutyHoursRecycller = (RecyclerView) findViewById(R.id.dutyHourView); + dutyHoursLayoutManager = new LinearLayoutManager(this); + dutyHoursRecycller.setLayoutManager(dutyHoursLayoutManager); + + tutorTabService = ApiClient.getClient(getApplicationContext()) .create(TutorTabApi.class); userService = ApiClient.getClient(getApplicationContext()) .create(UserService.class); - setContentView(R.layout.content_tutor_tab); - TextView userName = findViewById(R.id.userName); - TextView userDutyHours = findViewById(R.id.userDutyHours); - EditText userNote = findViewById(R.id.userNote); - TextView userRoom = findViewById(R.id.userRoom); - TextView userEmail = findViewById(R.id.userEmail); - TextView department = findViewById(R.id.userDepartment); - Button saveButon = findViewById(R.id.saveButon); - findViewById(R.id.contentTutorTabInfoImageButton).setOnClickListener(v-> InfoHelperUtils.infoPopUp(v,R.layout.info_popup_tutor_tab)); - - userName.setText(String.format("%s %s", PrefUtils.getUserFirstName(getApplicationContext()), PrefUtils.getUserLastName(getApplicationContext()))); disposable.add( tutorTabService.apiUsersTutorTabByTutorIdGet(PrefUtils.getUserId(getApplicationContext())) .subscribeOn(Schedulers.io()) @@ -72,23 +89,49 @@ public class TutorTab extends AppCompatActivity { @Override public void onSuccess(TutorTabViewModel tutorTabViewModel) { - List dutyHoursList = Stream.of(tutorTabViewModel.getDutyHours()) - .map(DutyHourViewModel::getSummary).toList(); - - userRoom.setText(String.format("%s: %s", getString(R.string.userRoom), tutorTabViewModel.getRoom())); - userEmail.setText(String.format("%s: %s", getString(R.string.userEmail), tutorTabViewModel.getEmailTutorTab())); + dutyHourList = tutorTabViewModel.getDutyHours(); + if(dutyHourList == null){ + }else{ + dutyHoursAdapter = new DutyHoursAdapter(getApplicationContext(),dutyHourList); + dutyHoursRecycller.setAdapter(dutyHoursAdapter); + addDutyButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + addEmptyDuty(dutyHoursAdapter); + } + }); + } + userRoom.setText(String.format("%s", tutorTabViewModel.getRoom())); + userEmail.setText(String.format("%s", tutorTabViewModel.getEmailTutorTab())); if (!tutorTabViewModel.getNote().equals("")) { userNote.setText(String.format("%s", tutorTabViewModel.getNote())); } - userDutyHours.setText(String.format("%s: %s", getString(R.string.userDutyHoursHeader), Arrays.toString(dutyHoursList.toArray()))); - } @Override public void onError(Throwable e) { + int code = ((HttpException) e).response().code(); + if( code == 404){ + ifTutorTabExists = false; + dutyHoursAdapter = new DutyHoursAdapter(getApplicationContext(),new ArrayList()); + dutyHoursRecycller.setAdapter(dutyHoursAdapter); + addDutyButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + addEmptyDuty(dutyHoursAdapter); + } + }); + } showError(e); } })); + + + + findViewById(R.id.contentTutorTabInfoImageButton).setOnClickListener(v-> InfoHelperUtils.infoPopUp(v,R.layout.info_popup_tutor_tab)); + + userName.setText(String.format("%s %s", PrefUtils.getUserFirstName(getApplicationContext()), PrefUtils.getUserLastName(getApplicationContext()))); + disposable.add( userService.getUserById(PrefUtils.getUserId(getApplicationContext())) @@ -104,18 +147,32 @@ public class TutorTab extends AppCompatActivity { @Override public void onError(Throwable e) { + showError(e); } })); - setUpSaveListener(saveButon, userNote); + setUpSaveListener(saveButon); + } + private void addEmptyDuty(DutyHoursAdapter adapter){ + adapter.addDuty(new DutyHourViewModel()); + adapter.notifyItemInserted(adapter.getItemCount()); + dutyHoursRecycller.scrollToPosition(adapter.getItemCount()-1); } - private void setUpSaveListener(Button button, EditText note) { + private void setUpSaveListener(Button button) { button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - newTab = new TutorTabViewModel(PrefUtils.getUserId(getApplicationContext()),note.getText().toString()); - putUserTab(newTab); + newTab = new TutorTabViewModel(PrefUtils.getUserId(getApplicationContext()), + userRoom.getText().toString(), + userEmail.getText().toString(), + userNote.getText().toString(), + dutyHoursAdapter.getDutyList()); + if(ifTutorTabExists){ + putUserTab(newTab); + }else{ + postUserTab(newTab); + } } }); } @@ -124,11 +181,21 @@ public class TutorTab extends AppCompatActivity { disposable.add(tutorTabService.apiUsersTutorTabByTutorIdPut(PrefUtils.getUserId(getApplicationContext()), tutorTabViewModel) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(this::handleResponse, this::handleError)); + .subscribe(this::handleResponsePut, this::handleError)); + } + private void postUserTab(TutorTabViewModel tutorTabViewModel) { + disposable.add(tutorTabService.apiUsersTutorTabByTutorIdPost(PrefUtils.getUserId(getApplicationContext()), tutorTabViewModel) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(this::handleResponsePost, this::handleError)); } - private void handleResponse(TutorTabViewModel tutorTabViewModel) { - Toast.makeText(getApplicationContext(), getApplicationContext().getString(R.string.modal_feedback_thankyou), Toast.LENGTH_SHORT).show(); + private void handleResponsePut(Response resp) { + Toast.makeText(getApplicationContext(), getApplicationContext().getString(R.string.updateToast), Toast.LENGTH_SHORT).show(); + + } + private void handleResponsePost(TutorTabViewModel tutorTabViewModel ) { + Toast.makeText(getApplicationContext(), getApplicationContext().getString(R.string.updateToast), Toast.LENGTH_SHORT).show(); } @@ -155,9 +222,6 @@ public class TutorTab extends AppCompatActivity { } else { message = "Network Error!"; } - -// Snackbar.make(coordinatorLayout, message, Snackbar.LENGTH_LONG) -// .show(); Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); } diff --git a/app/src/main/java/com/uam/wmi/findmytutor/adapters/DutyHoursAdapter.java b/app/src/main/java/com/uam/wmi/findmytutor/adapters/DutyHoursAdapter.java new file mode 100644 index 0000000..2de243f --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/adapters/DutyHoursAdapter.java @@ -0,0 +1,163 @@ +package com.uam.wmi.findmytutor.adapters; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageButton; +import android.widget.TextView; + +import com.annimon.stream.Collectors; +import com.annimon.stream.Stream; +import com.uam.wmi.findmytutor.R; +import com.uam.wmi.findmytutor.model.DutyHourViewModel; + +import java.util.ArrayList; +import java.util.List; +import butterknife.BindView; +import butterknife.ButterKnife; + + +public class DutyHoursAdapter extends RecyclerView.Adapter { + private Context context; + private List hours; + +public DutyHoursAdapter(Context context, List hours) { + this.context = context; + this.hours = new ArrayList(hours); +} + + +public List getDutyList(){ + ArrayList notEmpty = Stream.of(hours).filter(DutyHourViewModel::isValid).collect(Collectors.toCollection(ArrayList::new)); + return notEmpty; +} +public void addDuty(DutyHourViewModel duty){ + hours.add(duty); +} +private void removeDuty(int pos){ + hours.remove(pos); + this.notifyItemRemoved(pos); + Log.d("DutyIndex af rm size",Integer.toString(getItemCount())); + +} + +@NonNull +@Override +public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View itemView = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.duty_hour_row, parent, false); + + return new MyViewHolder(itemView); + } + +@Override +public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { + DutyHourViewModel duty = hours.get(position); + holder.dutyDay.setText(duty.getDay()); + holder.dutyDay.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + duty.setDay(holder.dutyDay.getText().toString()); + } + }); + holder.dutyStart.setText(duty.getStart()); + holder.dutyStart.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + duty.setStart(holder.dutyStart.getText().toString()); + } + }); + holder.dutyStop.setText(duty.getEnd()); + holder.dutyStop.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + duty.setEnd(holder.dutyStop.getText().toString()); + } + }); + holder.deleteRow.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + try{ + Log.d("DutyIndex bf rm size",Integer.toString(getItemCount())); + Log.d("DutyIndex bf rm pos",Integer.toString(holder.getLayoutPosition())); + removeDuty(holder.getLayoutPosition()); + Log.d("DutyIndex af rm pos",Integer.toString(holder.getLayoutPosition())); + + + }catch(Error e){ + Log.e("DutyIndex error",e.getMessage()); + Log.e("DutyIndex size",Integer.toString(getItemCount())); + Log.e("DutyIndex pos",Integer.toString(holder.getAdapterPosition())); + + + } + + } + }); + + } + +@Override +public int getItemCount() { + return hours.size(); + } + +class MyViewHolder extends RecyclerView.ViewHolder { + + @BindView(R.id.duty_day_value) + TextView dutyDay; + + @BindView(R.id.duty_start_value) + TextView dutyStart; + + @BindView(R.id.duty_stop_value) + TextView dutyStop; + + @BindView(R.id.deleteRow) + ImageButton deleteRow; + + MyViewHolder(View view) { + super(view); + ButterKnife.bind(this, view); + } +} + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/DutyHour.java b/app/src/main/java/com/uam/wmi/findmytutor/model/DutyHour.java index 46cbdb3..3c17824 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/DutyHour.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/DutyHour.java @@ -33,6 +33,9 @@ public class DutyHour extends BaseResponse { public DutyHour dutyHourId(UUID dutyHourId) { this.dutyHourId = dutyHourId; return this; + } + public DutyHour(){ + } /** 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 index d3bcbe2..241d998 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/DutyHourViewModel.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/DutyHourViewModel.java @@ -24,6 +24,20 @@ public class DutyHourViewModel { this.day = day; return this; } + public Boolean isValid(){ + if(this.day.isEmpty()){ + return false; + }else if( !this.start.isEmpty() && this.end.isEmpty() ){ + return false; + }else{ + return true; + } + } + public DutyHourViewModel(){ + day=""; + start=""; + end=""; + } /** * Get day 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 index e726ce9..73ed9d8 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/TutorTabViewModel.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/TutorTabViewModel.java @@ -33,11 +33,12 @@ public class TutorTabViewModel { @SerializedName("dutyHours") private List dutyHours = null; - public TutorTabViewModel(String userId, String note){ + public TutorTabViewModel(String userId, String room, String email, String note, List dutyHours){ this.userId=userId; -// this.room=room; -// this.emailTutorTab=emailTutorTab; + this.room=room; + this.emailTutorTab=email; this.note=note; + this.dutyHours = new ArrayList(dutyHours); } public TutorTabViewModel tutorTabId(UUID tutorTabId) { 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 index e5ba6b1..837e356 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/service/TutorTabApi.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/service/TutorTabApi.java @@ -5,6 +5,7 @@ import com.uam.wmi.findmytutor.model.TutorTabViewModel; import io.reactivex.Observable; import io.reactivex.Single; +import retrofit2.Response; import retrofit2.http.*; @@ -40,6 +41,10 @@ public interface TutorTabApi { @retrofit2.http.Path("tutorId") String tutorId ); + @POST("api/users/tutorTab/{tutorId}") + Single apiUsersTutorTabByTutorIdPost( + @retrofit2.http.Path("tutorId") String tutorId, @retrofit2.http.Body TutorTabViewModel tutorTab + ); /** * * @@ -51,7 +56,7 @@ public interface TutorTabApi { "Content-Type:application/json" }) @PUT("api/users/tutorTab/{tutorId}") - Observable apiUsersTutorTabByTutorIdPut( + Observable> apiUsersTutorTabByTutorIdPut( @retrofit2.http.Path("tutorId") String tutorId, @retrofit2.http.Body TutorTabViewModel tutorTab ); diff --git a/app/src/main/res/layout/content_tutor_tab.xml b/app/src/main/res/layout/content_tutor_tab.xml index dae766a..178d4ac 100644 --- a/app/src/main/res/layout/content_tutor_tab.xml +++ b/app/src/main/res/layout/content_tutor_tab.xml @@ -1,15 +1,21 @@ - + + + + - - + android:orientation="vertical" + > + + + + + + + + + + + + + + + + + android:paddingTop="0dp" + android:paddingBottom="0dp" + android:textColor="@color/mapboxRedDark" + android:text="@string/dutyTitle"/> - + + + +