diff --git a/app/build.gradle b/app/build.gradle index 42fbd3d..60baee3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,7 +10,7 @@ android { applicationId "com.uam.wmi.findmytutor" minSdkVersion 22 targetSdkVersion 27 - versionCode 58 + versionCode 59 versionName "1.0.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -75,4 +75,6 @@ dependencies { // spinner loaders library implementation 'com.github.ybq:Android-SpinKit:1.2.0' + // rx binding + implementation 'com.jakewharton.rxbinding:rxbinding:0.3.0' } diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/BlackList.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/BlackList.java index 91cc203..5e833d7 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/BlackList.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/BlackList.java @@ -68,6 +68,7 @@ import io.reactivex.Observable; import io.reactivex.ObservableSource; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; import io.reactivex.functions.Function; import io.reactivex.observers.DisposableObserver; import io.reactivex.observers.DisposableSingleObserver; @@ -153,7 +154,6 @@ public class BlackList extends AppCompatActivity { })); addToBlackListFab.setOnClickListener(this::showFabDialog); - handleSwitch(); } @@ -173,34 +173,29 @@ public class BlackList extends AppCompatActivity { } private void fetchBlackListedUsers() { - prevSize = blacklistedUsers.size(); - blacklistedUsers.clear(); - disposable.add(getListOfBlacklistedUsers(tutorId) - .doOnSubscribe(t -> didFetched = false) + .doOnSubscribe(this::handleDoOnSubscribe) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .flatMap((Function, Observable>) Observable::fromIterable) - .flatMap((Function>) this::getUserObservable) - .subscribeWith(new DisposableObserver() { - @Override - public void onNext(User user) { - blacklistedUsers.add(user); - } + .flatMap(Observable::fromIterable) + .flatMap(this::getUserObservable) + .subscribe(user -> blacklistedUsers.add(user), this::handleError,this::handleComplete)); + } - @Override - public void onError(Throwable e) { - showError(e); - didFetched = false; - } + private void handleDoOnSubscribe(Disposable disposable) { + prevSize = blacklistedUsers.size(); + blacklistedUsers.clear(); + didFetched = false; + } - @Override - public void onComplete() { - Collections.sort(blacklistedUsers, (a, b) -> sortByUserName(a,b)); - didFetched = true; - refreshUI(); - } - })); + private void handleComplete() { + Collections.sort(blacklistedUsers, this::sortByUserName); + didFetched = true; + refreshUI(); + } + private void handleError(Throwable e){ + showError(e); + didFetched = false; } private void refreshUI(){ @@ -262,10 +257,8 @@ public class BlackList extends AppCompatActivity { ); } - private void handleAddUser(User user) { Toast.makeText(this, R.string.add_user_to_list, Snackbar.LENGTH_LONG).show(); - blacklistedUsers.clear(); fetchBlackListedUsers(); } diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/LoginActivity.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/LoginActivity.java index d865b1c..97ef399 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/LoginActivity.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/LoginActivity.java @@ -3,7 +3,6 @@ package com.uam.wmi.findmytutor.activity; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.annotation.TargetApi; -import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Build; @@ -28,7 +27,6 @@ import com.uam.wmi.findmytutor.model.ValidateUser; import com.uam.wmi.findmytutor.network.ApiClient; import com.uam.wmi.findmytutor.service.LdapService; import com.uam.wmi.findmytutor.service.UserService; -import com.uam.wmi.findmytutor.utils.LocaleHelper; import com.uam.wmi.findmytutor.utils.PrefUtils; import com.uam.wmi.findmytutor.utils.RestApiHelper; @@ -41,8 +39,7 @@ import io.reactivex.disposables.CompositeDisposable; import io.reactivex.schedulers.Schedulers; import okhttp3.ResponseBody; -public class -LoginActivity extends AppCompatActivity { +public class LoginActivity extends AppCompatActivity { private AutoCompleteTextView mLoginNameView; private EditText mPasswordView; @@ -52,11 +49,6 @@ LoginActivity extends AppCompatActivity { private UserService userService; private CompositeDisposable disposable = new CompositeDisposable(); - @Override - protected void attachBaseContext(Context base) { - super.attachBaseContext(LocaleHelper.onAttach(base)); - } - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -157,9 +149,9 @@ LoginActivity extends AppCompatActivity { private void loginProcess(String email, String password) { ValidateUser user = new ValidateUser(email, password); - // LdapUser fakeUser = new LdapUser(email, password,"wmi","tutor",email,"Fałszywy",email); + // LdapUser fakeUser = new LdapUser(email, password,"wmi","tutor",email,"Fałszywy",email); disposable.add(ldapService.validate(user) - //disposable.add(ldapService.fakeValidate(fakeUser) + //disposable.add(ldapService.fakeValidate(fakeUser) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::handleResponse, this::handleError)); 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 5ce1844..fa4ee6b 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 @@ -151,7 +151,6 @@ public class SharingFragment extends PreferenceFragment implements SharedPrefere public void onError(Throwable e) { Toast.makeText(getApplicationContext(), R.string.error_location_fetch, Toast.LENGTH_SHORT).show(); } - })); } @@ -246,7 +245,6 @@ public class SharingFragment extends PreferenceFragment implements SharedPrefere return true; }); - /** Button 'choose from map' button listener **/ manualLocationButton.setOnPreferenceChangeListener((preference, o) -> { FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 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 73034da..7ab81f7 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 @@ -66,28 +66,6 @@ public class TutorTab extends AppCompatActivity { private RecyclerView.LayoutManager dutyHoursLayoutManager; private TutorTabViewModel newTab; - - - public boolean isEmailValid(String email) - { - String regExpn = - "^(([\\w-]+\\.)+[\\w-]+|([a-zA-Z]{1}|[\\w-]{2,}))@" - +"((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\.([0-1]?" - +"[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\." - +"([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\.([0-1]?" - +"[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|" - +"([a-zA-Z]+[\\w-]+\\.)+[a-zA-Z]{2,4})$"; - - CharSequence inputStr = email; - - Pattern pattern = Pattern.compile(regExpn,Pattern.CASE_INSENSITIVE); - Matcher matcher = pattern.matcher(inputStr); - - if(matcher.matches()) - return true; - else - return false; - } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -118,8 +96,6 @@ public class TutorTab extends AppCompatActivity { getTutorTab(); -// 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( @@ -236,7 +212,6 @@ public class TutorTab extends AppCompatActivity { }else{ userEmail.setError(getString(R.string.error_invalid_email)); } - }); } @@ -286,7 +261,6 @@ public class TutorTab extends AppCompatActivity { Toast.makeText(getApplicationContext(), "Network error " + error.getMessage(), Toast.LENGTH_SHORT).show(); - Log.e("WMI SUCC", String.valueOf(error)); } @@ -309,5 +283,21 @@ public class TutorTab extends AppCompatActivity { super.attachBaseContext(LocaleHelper.onAttach(base)); } + public boolean isEmailValid(String email) + { + String regExpn = + "^(([\\w-]+\\.)+[\\w-]+|([a-zA-Z]{1}|[\\w-]{2,}))@" + +"((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\.([0-1]?" + +"[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\." + +"([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\.([0-1]?" + +"[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|" + +"([a-zA-Z]+[\\w-]+\\.)+[a-zA-Z]{2,4})$"; + CharSequence inputStr = email; + + Pattern pattern = Pattern.compile(regExpn,Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(inputStr); + + return matcher.matches(); + } } diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/UsersListFragment.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/UsersListFragment.java index 11cf999..3788485 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/UsersListFragment.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/UsersListFragment.java @@ -63,6 +63,7 @@ import io.reactivex.Observable; import io.reactivex.ObservableSource; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; import io.reactivex.functions.Function; import io.reactivex.observers.DisposableObserver; import io.reactivex.observers.DisposableSingleObserver; @@ -316,6 +317,7 @@ public class UsersListFragment extends Fragment { tutorsList.addAll(users); mAdapter.notifyDataSetChanged(); toggleEmptyNotes(); + fetchTopCords(); } @Override @@ -425,6 +427,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()) + .subscribe(this::addTimestamps,this::showError)); + } + + private void addTimestamps(List coordinates) { + for (Coordinate crd : + coordinates) { + Long ts = crd.getTimeStamp(); + tutorsTimeStamps.put(crd.getUserId(), getDate(ts)); + } + + mAdapter.notifyDataSetChanged(); + } + + private String getDate(long time) { + Calendar cal = Calendar.getInstance(Locale.ENGLISH); + cal.setTimeInMillis(time); + return DateFormat.format("HH:mm dd/MM", cal).toString(); + } + @Override public void onDestroy() { super.onDestroy(); @@ -447,54 +478,4 @@ public class UsersListFragment extends Fragment { super.onStop(); } - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - } - - private Observable> getListOfActiveUsers() { - return userService.getAllActiveTutors() - .toObservable() - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()); - } - - private Observable getCoordinateObservable(User user) { - return coordinateService - .getTopCoordinateByUserId(user.getId()) - .toObservable() - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()); - } - - private void fetchTopCords(){ - tutorsTimeStamps.clear(); - disposable.add(getListOfActiveUsers() - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .flatMap((Function, Observable>) Observable::fromIterable) - .flatMap((Function>) this::getCoordinateObservable) - .subscribeWith(new DisposableObserver() { - @Override - public void onNext(Coordinate coordinate) { - Long ts = coordinate.getTimeStamp(); - tutorsTimeStamps.put(coordinate.getUserId(), getDate(ts)); - } - - @Override - public void onError(Throwable e) {showError(e);} - - @Override - public void onComplete() { - Log.e("USERS", String.valueOf(tutorsTimeStamps)); - mAdapter.notifyDataSetChanged(); - } - })); - } - - 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; - } } diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/WhiteList.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/WhiteList.java index 485b8f0..7490af9 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/WhiteList.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/WhiteList.java @@ -58,6 +58,7 @@ import io.reactivex.Observable; import io.reactivex.ObservableSource; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; import io.reactivex.functions.Function; import io.reactivex.observers.DisposableObserver; import io.reactivex.schedulers.Schedulers; @@ -162,34 +163,29 @@ public class WhiteList extends AppCompatActivity { } private void fetchWhiteListedUsers() { - prevSize = whitelistedUsers.size(); - whitelistedUsers.clear(); - disposable.add(getListOfWhitelistedUsers(tutorId) - .doOnSubscribe(t -> didFetched = false) + .doOnSubscribe(this::handleDoOnSubscribe) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .flatMap((Function, Observable>) Observable::fromIterable) - .flatMap((Function>) this::getUserObservable) - .subscribeWith(new DisposableObserver() { - @Override - public void onNext(User user) { - whitelistedUsers.add(user); - } + .flatMap(Observable::fromIterable) + .flatMap(this::getUserObservable) + .subscribe(user -> whitelistedUsers.add(user), this::handleError,this::handleComplete)); + } - @Override - public void onError(Throwable e) { - showError(e); - didFetched = false; - } + private void handleDoOnSubscribe(Disposable disposable) { + prevSize = whitelistedUsers.size(); + whitelistedUsers.clear(); + didFetched = false; + } - @Override - public void onComplete() { - Collections.sort(whitelistedUsers, (a, b) -> sortByUserName(a, b)); - didFetched = true; - refreshUI(); - } - })); + private void handleComplete() { + Collections.sort(whitelistedUsers, this::sortByUserName); + didFetched = true; + refreshUI(); + } + private void handleError(Throwable e){ + showError(e); + didFetched = false; } private void refreshUI() { diff --git a/app/src/main/java/com/uam/wmi/findmytutor/adapters/TutorsListAdapter.java b/app/src/main/java/com/uam/wmi/findmytutor/adapters/TutorsListAdapter.java index 2a147c8..cda7aec 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/adapters/TutorsListAdapter.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/adapters/TutorsListAdapter.java @@ -1,3 +1,4 @@ +/* package com.uam.wmi.findmytutor.adapters; import android.content.Context; @@ -46,6 +47,7 @@ public class TutorsListAdapter extends RecyclerView.Adapter { + + private Context context; + private List tutorsList; + private HashMap tutorsTimeStamps; + + public TutorsListAdapter(Context context, List tutors, HashMap tutorsTimeStamps) { + this.context = context; + this.tutorsList = tutors; + this.tutorsTimeStamps = tutorsTimeStamps; + } + @NonNull + @Override + public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View itemView = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.tutor_list_row, parent, false); + + return new MyViewHolder(itemView); + } + + @Override + public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { + Drawable image = null; + User tutor = tutorsList.get(position); + + holder.firstName.setText(String.format("%s %s", tutor.getFirstName(), tutor.getLastName())); + String ts = tutorsTimeStamps.get(tutor.getId()); + + if (tutor.isIsOnline()) { + image = context.getResources().getDrawable(R.drawable.user_list_online); + holder.lastSeen.setText(R.string.available_now); + holder.lastSeen.setVisibility(View.VISIBLE); + holder.loader.setVisibility(View.GONE); + } else if(tutor.isIsActive()){ + image = context.getResources().getDrawable(R.drawable.user_list_offline); + + if (ts != null){ + holder.lastSeen.setText(R.string.last_sign); + holder.lastSeen.append(String.format(": %s", ts)); + holder.loader.setVisibility(View.GONE); + } + } else { + image = context.getResources().getDrawable(R.drawable.user_list_off); + + if(ts == null){ + holder.lastSeen.setText(R.string.never_logged_in); + }else{ + holder.lastSeen.setText(R.string.last_sign); + holder.lastSeen.append(String.format(": %s", ts)); + } holder.loader.setVisibility(View.GONE); } diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index a96ee0c..ceb6c7b 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -43,9 +43,10 @@ - - - - @@ -192,18 +194,22 @@ android:layout_alignEnd="@+id/userEmailLayout" android:textColor="@color/white" app:backgroundTint="@color/colorPrimary" + android:stateListAnimator="@null" android:text="@string/scrap_tutor_tab" /> + android:stateListAnimator="@null" + android:text="@string/saveButton" /> diff --git a/app/src/main/res/layout/preference_button_widget.xml b/app/src/main/res/layout/preference_button_widget.xml index 41ea58f..d0fb785 100644 --- a/app/src/main/res/layout/preference_button_widget.xml +++ b/app/src/main/res/layout/preference_button_widget.xml @@ -7,7 +7,6 @@ android:fontFamily="@font/lato_regular" > - diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index db0dcb7..003a659 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -289,5 +289,8 @@ Dostępny teraz Profil użytkownika + Nigdy + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7fa8adc..77a24cd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -456,4 +456,5 @@ Status Available now Last seen + Never diff --git a/build.gradle b/build.gradle index 8d3ef8e..4559f51 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,6 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:3.2.1' - // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files