diff --git a/.idea/misc.xml b/.idea/misc.xml index b0c7b20..dc44dda 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -29,7 +29,7 @@ - + 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 607c7c5..c9faef8 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 @@ -1,6 +1,7 @@ package com.uam.wmi.findmytutor.activity; import android.annotation.SuppressLint; +import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.FloatingActionButton; @@ -14,18 +15,28 @@ import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.util.Log; +import android.view.Gravity; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; import android.view.View; +import android.view.WindowManager; import android.widget.Button; +import android.widget.CompoundButton; import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.PopupWindow; +import android.widget.Switch; import android.widget.TextView; import android.widget.Toast; +import android.widget.ToggleButton; import com.jakewharton.retrofit2.adapter.rxjava2.HttpException; import com.mapbox.geojson.Point; import com.mapbox.mapboxsdk.geometry.LatLng; import com.uam.wmi.findmytutor.R; import com.uam.wmi.findmytutor.adapters.BlackListAdapter; +import com.uam.wmi.findmytutor.model.IsUsingListBool; import com.uam.wmi.findmytutor.model.PredefinedCoordViewModel; import com.uam.wmi.findmytutor.model.StudentIdModel; import com.uam.wmi.findmytutor.model.User; @@ -40,7 +51,9 @@ import com.uam.wmi.findmytutor.utils.RestApiHelper; import com.uam.wmi.findmytutor.utils.SharingLevel; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import butterknife.BindView; import butterknife.ButterKnife; @@ -54,18 +67,21 @@ public class BlackList extends AppCompatActivity { private CompositeDisposable disposable = new CompositeDisposable(); private UserService userService; - + private boolean didFetched = false; + private String tutorId; @BindView(R.id.recycler_view) RecyclerView recyclerView; @BindView(R.id.black_list_empty_text_view) TextView noNotesView; - + @BindView(R.id.switch_blacklist_toggle) + Switch aSwitch; @BindView(R.id.add_to_black_list_fab) FloatingActionButton addToBlackListFab; private BlackListAdapter mAdapter; private List blacklistedUsers = new ArrayList<>(); + private HashSet blacklistedUsersIDs = new HashSet<>(); @Override protected void onCreate(Bundle savedInstanceState) { @@ -73,9 +89,11 @@ public class BlackList extends AppCompatActivity { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); setContentView(R.layout.activity_black_list); ButterKnife.bind(this); + aSwitch.setText(getString(R.string.blacklist) +" ON"); + tutorId = PrefUtils.getUserId(getApplicationContext()); Toolbar toolbar = findViewById(R.id.toolbar); - toolbar.setTitle(getString(R.string.activity_title_home)); + toolbar.setTitle(getString(R.string.activity_title_blacklist)); setSupportActionBar(toolbar); userService = ApiClient.getClient(getApplicationContext()) @@ -101,31 +119,26 @@ public class BlackList extends AppCompatActivity { @Override public void onLongClick(View view, int position) { - } - - })); addToBlackListFab.setOnClickListener(this::showFabDialog); - fetchBlackListedUsers(PrefUtils.getUserId(getApplicationContext())); + fetchBlackListedUsersIDs(PrefUtils.getUserId(getApplicationContext())); + handleSwitch(); } - private void fetchBlackListedUsers(String userId) { + private void fetchBlackListedUsersIDs(String userId) { disposable.add( userService.getTutorBlacklistedByID(userId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribeWith(new DisposableSingleObserver>() { + .subscribeWith(new DisposableSingleObserver>() { @Override - public void onSuccess(List users) { - blacklistedUsers.addAll(users); - - mAdapter.notifyDataSetChanged(); - Log.e("BLACKLIST","fetch success"); - Snackbar.make(getWindow().getDecorView().getRootView(), "fetch success", Snackbar.LENGTH_LONG) - .setAction("Action", null).show(); + public void onSuccess(List users) { + blacklistedUsersIDs.addAll(users); + didFetched = true; + fetchBlackListedUsers(); toggleEmptyNotes(); } @@ -137,6 +150,33 @@ public class BlackList extends AppCompatActivity { ); } + private void fetchBlackListedUsers() { + for (String GUID : blacklistedUsersIDs){ + disposable.add( + userService.getUserById(GUID) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeWith(new DisposableSingleObserver() { + @Override + public void onSuccess(User user) { + blacklistedUsers.add(user); + Snackbar.make(getWindow().getDecorView().getRootView(), "user fetch OK! success", Snackbar.LENGTH_LONG) + .setAction("Action", null).show(); + toggleEmptyNotes(); + if (blacklistedUsers.size() == blacklistedUsersIDs.size()) { + mAdapter.notifyDataSetChanged(); + } + } + + @Override + public void onError(Throwable e) { + showError(e); + } + }) + ); + } + } + private void showFabDialog(View v){ LayoutInflater layoutInflaterAndroid = LayoutInflater.from(getApplicationContext()); @@ -150,6 +190,7 @@ public class BlackList extends AppCompatActivity { .setNegativeButton(R.string.cancel, null); final AlertDialog alertDialog = alertDialogBuilderUserInput.create(); + alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); EditText modalUserInput = view.findViewById(R.id.black_list_modal_input); @@ -164,10 +205,9 @@ public class BlackList extends AppCompatActivity { String body = modalUserInput.getText().toString(); if (TextUtils.isEmpty(body)) { - Toast.makeText(getApplicationContext(), "Co tu napisac?", Toast.LENGTH_SHORT).show(); + Toast.makeText(getApplicationContext(), R.string.can_not_be_empty, Toast.LENGTH_SHORT).show(); modalUserInput.requestFocus(); } else { -// send4Location(body, latLng); sendUserToBlacklist(body); alertDialog.dismiss(); } @@ -178,20 +218,18 @@ public class BlackList extends AppCompatActivity { } private void sendUserToBlacklist(String body) { - - UserService userService = ApiClient.getClient(getApplicationContext()).create(UserService.class); StudentIdModel studentIdModel = new StudentIdModel(body); - Toast.makeText(getApplicationContext(), body, Toast.LENGTH_SHORT).show(); - //TODO subscribe Completable #how to do that? -// disposable.add( -// userService.addStudentToBlacklist(PrefUtils.getUserId(getApplicationContext()), studentIdModel) -// .observeOn(AndroidSchedulers.mainThread()) -// -// -// ); + disposable.add( + userService.addStudentToBlacklist(PrefUtils.getUserId(getApplicationContext()), studentIdModel) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(()->{ + fetchBlackListedUsersIDs(PrefUtils.getUserId(getApplicationContext())); + Toast.makeText(getApplicationContext(), R.string.user_added, Toast.LENGTH_SHORT).show(); + },this::showError) + ); } - private void showError(Throwable e) { String message; @@ -201,14 +239,22 @@ public class BlackList extends AppCompatActivity { } else { message = "Network Error !"; } + Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show(); + + Snackbar.make(getWindow().getDecorView().getRootView(), message, Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } private void toggleEmptyNotes() { - if (blacklistedUsers.size() >= 0) { + + if (didFetched && blacklistedUsers.size() == 0) { + noNotesView.setText(R.string.list_is_empty); + noNotesView.setVisibility(View.VISIBLE); + }else if (blacklistedUsers.size() > 0) { noNotesView.setVisibility(View.GONE); } else { + noNotesView.setText(getString(R.string.loading)); noNotesView.setVisibility(View.VISIBLE); } } @@ -222,7 +268,6 @@ public class BlackList extends AppCompatActivity { @Override public void onResume() { super.onResume(); - fetchBlackListedUsers(PrefUtils.getUserId(this)); } @Override @@ -234,4 +279,57 @@ public class BlackList extends AppCompatActivity { public void onStop() { super.onStop(); } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.menu_black_list, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + + if (item.getItemId()==R.id.action_blacklist_info_popup){ + int layoutID = R.layout.info_popup_blacklist; + + View popupView = getLayoutInflater().inflate(layoutID,null); + + PopupWindow popupWindow = new PopupWindow(popupView, + LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); + // If the PopupWindow should be focusable + popupWindow.setFocusable(true); + // If you need the PopupWindow to dismiss when when touched outside + popupWindow.setBackgroundDrawable(new ColorDrawable()); + // Get the View's(the one that was clicked in the Fragment) location + View anchorView= getWindow().getDecorView().findViewById(android.R.id.content); + popupWindow.showAtLocation(anchorView,Gravity.TOP|Gravity.END, 0, 0); + } + + return super.onOptionsItemSelected(item); + } + + private void handleSwitch(){ + aSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> { + if (isChecked){ + aSwitch.setText(getString(R.string.blacklist) + " "+ getString(R.string.on)); + handleChangeRequest(true); + }else { + aSwitch.setText(getString(R.string.blacklist) + " "+getString(R.string.off)); + handleChangeRequest(false); + } + }); + } + + private void handleChangeRequest(boolean value){ + IsUsingListBool isUsingListBool = new IsUsingListBool(); + isUsingListBool.setIsUsing(value); + disposable.add( + userService.setTutorBlacklist(tutorId, isUsingListBool) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(()->{ + },this::showError) + ); + } } diff --git a/app/src/main/java/com/uam/wmi/findmytutor/adapters/BlackListAdapter.java b/app/src/main/java/com/uam/wmi/findmytutor/adapters/BlackListAdapter.java index bb5a6c2..3fd9043 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/adapters/BlackListAdapter.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/adapters/BlackListAdapter.java @@ -3,25 +3,44 @@ package com.uam.wmi.findmytutor.adapters; import android.content.Context; import android.graphics.drawable.Drawable; import android.support.annotation.NonNull; +import android.support.design.widget.Snackbar; import android.support.v7.widget.RecyclerView; +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 android.widget.Toast; +import com.jakewharton.retrofit2.adapter.rxjava2.HttpException; import com.uam.wmi.findmytutor.R; +import com.uam.wmi.findmytutor.model.StudentIdModel; import com.uam.wmi.findmytutor.model.User; +import com.uam.wmi.findmytutor.network.ApiClient; +import com.uam.wmi.findmytutor.service.UserService; +import com.uam.wmi.findmytutor.utils.PrefUtils; +import com.uam.wmi.findmytutor.utils.RestApiHelper; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.schedulers.Schedulers; +import okhttp3.ResponseBody; + +import static com.mapbox.mapboxsdk.Mapbox.getApplicationContext; public class BlackListAdapter extends RecyclerView.Adapter { private Context context; private List tutorsList; + private CompositeDisposable disposable = new CompositeDisposable(); + private UserService userService; + public BlackListAdapter(Context context, List tutors) { this.context = context; @@ -30,6 +49,8 @@ public class BlackListAdapter extends RecyclerView.Adapter{ + StudentIdModel studentIdModel = new StudentIdModel(tutor.getLdapLogin()); + String tutorId = PrefUtils.getUserId(getApplicationContext()); + disposable.add( + userService.removeStudentFromBlacklist(tutorId, studentIdModel) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(()->{ + Toast.makeText(getApplicationContext(), "User removed", Toast.LENGTH_SHORT).show(); + tutorsList.remove(position); + notifyDataSetChanged(); + },this::showError) + ); + }); +// +// if (tutor.isIsOnline()) { +// image = context.getResources().getDrawable(R.drawable.user_list_online); +// } else { +// image = context.getResources().getDrawable(R.drawable.user_list_offline); +// } +// +// if (!tutor.isIsActive()) { +// image = context.getResources().getDrawable(R.drawable.user_list_off); +// } - if (tutor.isIsOnline()) { - image = context.getResources().getDrawable(R.drawable.user_list_online); - } else { - image = context.getResources().getDrawable(R.drawable.user_list_offline); - } - - if (!tutor.isIsActive()) { - image = context.getResources().getDrawable(R.drawable.user_list_off); - } - - image.setBounds(0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight()); - holder.isOnline.setCompoundDrawables(image, null, null, null); +// image.setBounds(0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight()); +// holder.isOnline.setCompoundDrawables(image, null, null, null); } @Override @@ -71,8 +107,10 @@ public class BlackListAdapter extends RecyclerView.Adapter> getTutorBlacklistedByID(@Path("tutorID") String tutorID); + Single> getTutorBlacklistedByID(@Path("tutorID") String tutorID); @PUT("api/users/blacklist/{tutorID}") Completable setTutorBlacklist(@Path("tutorID") String tutorID, @Body IsUsingListBool isUsing); @@ -69,7 +70,8 @@ public interface UserService { @POST("api/users/blacklist/{tutorID}") Completable addStudentToBlacklist(@Path("tutorID") String tutorID, @Body StudentIdModel student); - @DELETE("api/users/blacklist/{tutorID}") +// @DELETE("api/users/blacklist/{tutorID}") + @HTTP(method = "DELETE", path = "api/users/blacklist/{tutorID}", hasBody = true) Completable removeStudentFromBlacklist(@Path("tutorID") String tutorID, @Body StudentIdModel student); @GET("api/users/whitelist/{tutorID}") diff --git a/app/src/main/java/com/uam/wmi/findmytutor/utils/Const.java b/app/src/main/java/com/uam/wmi/findmytutor/utils/Const.java index 48fd35f..f5103c7 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/utils/Const.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/utils/Const.java @@ -6,7 +6,7 @@ import java.util.Arrays; import java.util.List; public class Const { - public final static String BASE_URL = "https://s416084.projektstudencki.pl/master/"; + public final static String BASE_URL = "https://s416084.projektstudencki.pl/develop/"; public final static Integer onlineBackgroundLocationInterval = 7000; public final static Integer offlineBackgroundLocationInterval = 36000; public final static Integer defaultMapZoom = 17; diff --git a/app/src/main/res/layout/activity_black_list.xml b/app/src/main/res/layout/activity_black_list.xml index 2795643..7b69662 100644 --- a/app/src/main/res/layout/activity_black_list.xml +++ b/app/src/main/res/layout/activity_black_list.xml @@ -5,6 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" + android:id="@+id/activity_blacklist_container" tools:context=".activity.BlackList"> - + android:thumbTextPadding="45dp" + android:checked="true" + android:text="BLACKLIST TEXT SWITCH" /> + - - @@ -68,25 +68,17 @@ + app:srcCompat="@android:drawable/ic_input_add" + app:useCompatPadding="true" + tools:srcCompat="@tools:sample/backgrounds/scenic" /> - - \ No newline at end of file diff --git a/app/src/main/res/layout/black_list_row.xml b/app/src/main/res/layout/black_list_row.xml index f35e962..d2efd45 100644 --- a/app/src/main/res/layout/black_list_row.xml +++ b/app/src/main/res/layout/black_list_row.xml @@ -1,5 +1,6 @@ - + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/content_black_list.xml b/app/src/main/res/layout/content_black_list.xml index 58a94c5..a252726 100644 --- a/app/src/main/res/layout/content_black_list.xml +++ b/app/src/main/res/layout/content_black_list.xml @@ -18,7 +18,7 @@ android:layout_height="match_parent" /> - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_black_list.xml b/app/src/main/res/menu/menu_black_list.xml index 23de524..8e1ae9f 100644 --- a/app/src/main/res/menu/menu_black_list.xml +++ b/app/src/main/res/menu/menu_black_list.xml @@ -3,8 +3,9 @@ xmlns:tools="http://schemas.android.com/tools" tools:context="com.uam.wmi.findmytutor.activity.BlackList"> + android:title="Popup info icon" + android:icon="@drawable/outline_info_24" + app:showAsAction="ifRoom" /> diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index c764d4f..4770d64 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -211,12 +211,10 @@ - użytkownik jest obecnie offline - użytkownik jest nieaktywny (nie udostępnił żadnych danych o lokalizacji od conajmniej tygodnia) -<<<<<<< HEAD Dodaj Index użytkownika Dodaj użytkownika do Blacklsi -======= Po kliknięciu w imię i nazwisko, wyświetli się karta zawierająca dokładne informacje o profesorze. @@ -245,7 +243,13 @@ Nie Aby skorzystać z tej funkcji musisz pozwolić na udostępnianie lokalizacji. Zgadzasz sie? Udostępnianie ->>>>>>> develop + Czarna lista + Pole nie może być puste + Użytkownik dodany + Lista jest pusta + WŁĄCZONA + WYŁĄCZONA + Czarna lista diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d6f2667..15bb46b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -32,7 +32,7 @@ Settings - Notes + Blacklist Password Sign in or register Sign out @@ -297,7 +297,6 @@ - user is currently offline - user is inactive (didn’t share any localization data since 7 days) -<<<<<<< HEAD BlackList User index Add user to Blacklist @@ -391,13 +390,11 @@ "when a user tries to pick up one of cards.\n\n" Add -======= After clicking on a name, the tutor tab will pop up, containing details about selected tutor. Yes App issues reporting ->>>>>>> develop Day @@ -415,4 +412,11 @@ In order to use this function, you have to enable localization sharing. May I do it for you? Sharing The user hasn\'t defined a status. + Blacklist + Field can not be empty + User added + The list is empty + Map + ON + OFF