Change loaders

This commit is contained in:
Mieszko Wrzeszczyński 2019-01-10 23:32:45 +01:00
parent ec68ae14ef
commit ad83c5ed88
11 changed files with 139 additions and 35 deletions

View File

@ -74,4 +74,6 @@ dependencies {
implementation 'org.apache.commons:commons-collections4:4.0' implementation 'org.apache.commons:commons-collections4:4.0'
implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support:design:27.1.1' implementation 'com.android.support:design:27.1.1'
// spinner loaders library
implementation 'com.github.ybq:Android-SpinKit:1.2.0'
} }

View File

@ -31,6 +31,7 @@ import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import android.widget.ToggleButton; import android.widget.ToggleButton;
import com.github.ybq.android.spinkit.SpinKitView;
import com.jakewharton.retrofit2.adapter.rxjava2.HttpException; import com.jakewharton.retrofit2.adapter.rxjava2.HttpException;
import com.mapbox.geojson.Point; import com.mapbox.geojson.Point;
import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.geometry.LatLng;
@ -86,6 +87,9 @@ public class BlackList extends AppCompatActivity {
Switch aSwitch; Switch aSwitch;
@BindView(R.id.add_to_black_list_fab) @BindView(R.id.add_to_black_list_fab)
FloatingActionButton addToBlackListFab; FloatingActionButton addToBlackListFab;
@BindView(R.id.loader)
SpinKitView loader;
private Integer prevSize; private Integer prevSize;
private BlackListAdapter mAdapter; private BlackListAdapter mAdapter;
@ -122,6 +126,7 @@ public class BlackList extends AppCompatActivity {
recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.addItemDecoration(new MyDividerItemDecoration(this, LinearLayoutManager.VERTICAL, 16)); recyclerView.addItemDecoration(new MyDividerItemDecoration(this, LinearLayoutManager.VERTICAL, 16));
recyclerView.setAdapter(mAdapter); recyclerView.setAdapter(mAdapter);
noNotesView.setVisibility(View.GONE);
fetchBlackListedUsers(); fetchBlackListedUsers();
/** /**
@ -275,15 +280,15 @@ public class BlackList extends AppCompatActivity {
} }
private void toggleEmptyNotes() { private void toggleEmptyNotes() {
if (didFetched && blacklistedUsers.size() == 0) { if (didFetched && blacklistedUsers.size() == 0) {
noNotesView.setText(R.string.list_is_empty);
noNotesView.setVisibility(View.VISIBLE); noNotesView.setVisibility(View.VISIBLE);
noNotesView.setText(R.string.list_is_empty);
loader.setVisibility(View.GONE);
}else if (blacklistedUsers.size() > 0) { }else if (blacklistedUsers.size() > 0) {
noNotesView.setVisibility(View.GONE); noNotesView.setVisibility(View.GONE);
loader.setVisibility(View.GONE);
} else { } else {
noNotesView.setText(getString(R.string.loading)); loader.setVisibility(View.VISIBLE);
noNotesView.setVisibility(View.VISIBLE);
} }
} }

View File

@ -4,6 +4,7 @@ import android.app.Fragment;
import android.app.FragmentTransaction; import android.app.FragmentTransaction;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.os.SystemClock;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar; import android.support.design.widget.Snackbar;
@ -30,6 +31,7 @@ import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;
import com.annimon.stream.Stream; import com.annimon.stream.Stream;
import com.github.ybq.android.spinkit.SpinKitView;
import com.jakewharton.retrofit2.adapter.rxjava2.HttpException; import com.jakewharton.retrofit2.adapter.rxjava2.HttpException;
import com.uam.wmi.findmytutor.R; import com.uam.wmi.findmytutor.R;
import com.uam.wmi.findmytutor.adapters.TutorsListAdapter; import com.uam.wmi.findmytutor.adapters.TutorsListAdapter;
@ -57,8 +59,12 @@ import java.util.Locale;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.functions.Function;
import io.reactivex.observers.DisposableObserver;
import io.reactivex.observers.DisposableSingleObserver; import io.reactivex.observers.DisposableSingleObserver;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
import okhttp3.ResponseBody; import okhttp3.ResponseBody;
@ -74,6 +80,8 @@ public class UsersListFragment extends Fragment {
RecyclerView recyclerView; RecyclerView recyclerView;
@BindView(R.id.txt_empty_notes_view) @BindView(R.id.txt_empty_notes_view)
TextView noNotesView; TextView noNotesView;
@BindView(R.id.loader)
SpinKitView loader;
private SearchView searchView; private SearchView searchView;
private UserService userService; private UserService userService;
@ -95,7 +103,6 @@ public class UsersListFragment extends Fragment {
} }
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mAdapter = new TutorsListAdapter(getActivity().getApplicationContext(), tutorsList, tutorsTimeStamps); mAdapter = new TutorsListAdapter(getActivity().getApplicationContext(), tutorsList, tutorsTimeStamps);
View view = inflater.inflate(R.layout.users_list, container, false); View view = inflater.inflate(R.layout.users_list, container, false);
view.setBackgroundColor(getResources().getColor(android.R.color.white)); view.setBackgroundColor(getResources().getColor(android.R.color.white));
@ -119,6 +126,7 @@ public class UsersListFragment extends Fragment {
recyclerView.setVerticalScrollBarEnabled(true); recyclerView.setVerticalScrollBarEnabled(true);
recyclerView.addItemDecoration(new MyDividerItemDecoration(getActivity(), LinearLayoutManager.VERTICAL, 16)); recyclerView.addItemDecoration(new MyDividerItemDecoration(getActivity(), LinearLayoutManager.VERTICAL, 16));
recyclerView.setAdapter(mAdapter); recyclerView.setAdapter(mAdapter);
noNotesView.setVisibility(View.GONE);
fetchAllTutors(); fetchAllTutors();
fetchTopCords(); fetchTopCords();
@ -404,9 +412,10 @@ public class UsersListFragment extends Fragment {
} }
private void toggleEmptyNotes() { private void toggleEmptyNotes() {
if (tutorsList.size() > 0) { loader.setVisibility(View.GONE);
noNotesView.setVisibility(View.GONE); noNotesView.setVisibility(View.GONE);
} else {
if (tutorsList.size() == 0) {
noNotesView.setVisibility(View.VISIBLE); noNotesView.setVisibility(View.VISIBLE);
if (fetchOnlyOnlineUsers) if (fetchOnlyOnlineUsers)
noNotesView.setText(R.string.no_online_users); noNotesView.setText(R.string.no_online_users);
@ -442,28 +451,44 @@ public class UsersListFragment extends Fragment {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
} }
private Observable<List<User>> getListOfActiveUsers() {
return userService.getAllActiveTutors()
.toObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
private Observable<Coordinate> getCoordinateObservable(User user) {
return coordinateService
.getTopCoordinatesByUserId(user.getId())
.toObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
private void fetchTopCords(){ private void fetchTopCords(){
disposable.add( tutorsTimeStamps.clear();
coordinateService.getTopCoordinates() disposable.add(getListOfActiveUsers()
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableSingleObserver<List<Coordinate>>() { .flatMap((Function<List<User>, Observable<User>>) Observable::fromIterable)
@Override .flatMap((Function<User, ObservableSource<Coordinate>>) this::getCoordinateObservable)
public void onSuccess(List<Coordinate> newCords) { .subscribeWith(new DisposableObserver<Coordinate>() {
for (Coordinate crd : @Override
newCords) { public void onNext(Coordinate coordinate) {
Long ts = crd.getTimeStamp(); Long ts = coordinate.getTimeStamp();
if (ts != 0){ tutorsTimeStamps.put(coordinate.getUserId(), getDate(ts));
tutorsTimeStamps.put(crd.getUserId(), getDate(ts)); }
}
}
mAdapter.notifyDataSetChanged();
} @Override
public void onError(Throwable e) {showError(e);}
@Override @Override
public void onError(Throwable e) {showSearchError(e);} public void onComplete() {
})); Log.e("USERS", String.valueOf(tutorsTimeStamps));
mAdapter.notifyDataSetChanged();
}
}));
} }
private String getDate(long time) { private String getDate(long time) {
@ -472,4 +497,4 @@ public class UsersListFragment extends Fragment {
String date = DateFormat.format("HH:mm dd/MM", cal).toString(); String date = DateFormat.format("HH:mm dd/MM", cal).toString();
return date; return date;
} }
} }

View File

@ -27,6 +27,7 @@ import android.widget.Switch;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.github.ybq.android.spinkit.SpinKitView;
import com.jakewharton.retrofit2.adapter.rxjava2.HttpException; import com.jakewharton.retrofit2.adapter.rxjava2.HttpException;
import com.uam.wmi.findmytutor.R; import com.uam.wmi.findmytutor.R;
import com.uam.wmi.findmytutor.adapters.WhiteListAdapter; import com.uam.wmi.findmytutor.adapters.WhiteListAdapter;
@ -68,6 +69,9 @@ public class WhiteList extends AppCompatActivity {
Switch aSwitch; Switch aSwitch;
@BindView(R.id.add_to_white_list_fab) @BindView(R.id.add_to_white_list_fab)
FloatingActionButton addToWhiteListFab; FloatingActionButton addToWhiteListFab;
@BindView(R.id.loader)
SpinKitView loader;
private CompositeDisposable disposable = new CompositeDisposable(); private CompositeDisposable disposable = new CompositeDisposable();
private UserService userService; private UserService userService;
private boolean didFetched = false; private boolean didFetched = false;
@ -106,6 +110,7 @@ public class WhiteList extends AppCompatActivity {
recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.addItemDecoration(new MyDividerItemDecoration(this, LinearLayoutManager.VERTICAL, 16)); recyclerView.addItemDecoration(new MyDividerItemDecoration(this, LinearLayoutManager.VERTICAL, 16));
recyclerView.setAdapter(mAdapter); recyclerView.setAdapter(mAdapter);
noNotesView.setVisibility(View.GONE);
/** /**
* On long press on RecyclerView item, open alert dialog * On long press on RecyclerView item, open alert dialog
@ -258,17 +263,20 @@ public class WhiteList extends AppCompatActivity {
private void toggleEmptyNotes() { private void toggleEmptyNotes() {
if (didFetched && whitelistedUsers.size() == 0) { if (didFetched && whitelistedUsers.size() == 0) {
noNotesView.setText(R.string.list_is_empty);
noNotesView.setVisibility(View.VISIBLE); noNotesView.setVisibility(View.VISIBLE);
noNotesView.setText(R.string.list_is_empty);
loader.setVisibility(View.GONE);
} else if (whitelistedUsers.size() > 0) { } else if (whitelistedUsers.size() > 0) {
noNotesView.setVisibility(View.GONE); noNotesView.setVisibility(View.GONE);
loader.setVisibility(View.GONE);
} else { } else {
noNotesView.setText(getString(R.string.loading)); loader.setVisibility(View.VISIBLE);
noNotesView.setVisibility(View.VISIBLE);
} }
} }
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {

View File

@ -9,6 +9,7 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
import com.github.ybq.android.spinkit.SpinKitView;
import com.uam.wmi.findmytutor.R; import com.uam.wmi.findmytutor.R;
import com.uam.wmi.findmytutor.model.User; import com.uam.wmi.findmytutor.model.User;
@ -49,17 +50,22 @@ public class TutorsListAdapter extends RecyclerView.Adapter<TutorsListAdapter.My
if (tutor.isIsOnline()) { if (tutor.isIsOnline()) {
image = context.getResources().getDrawable(R.drawable.user_list_online); image = context.getResources().getDrawable(R.drawable.user_list_online);
holder.lastSeen.setText(R.string.available_now); holder.lastSeen.setText(R.string.available_now);
holder.loader.setVisibility(View.GONE);
} else { } else {
image = context.getResources().getDrawable(R.drawable.user_list_offline); image = context.getResources().getDrawable(R.drawable.user_list_offline);
String ts = tutorsTimeStamps.get(tutor.getId()); String ts = tutorsTimeStamps.get(tutor.getId());
if (ts != null){ if (ts != null){
holder.lastSeen.setText(String.format("%s: %s", context.getString(R.string.last_seen), ts)); holder.lastSeen.setText(R.string.last_sign);
holder.lastSeen.append(String.format(": %s", ts));
holder.loader.setVisibility(View.GONE);
} }
} }
if (!tutor.isIsActive()) { if (!tutor.isIsActive()) {
image = context.getResources().getDrawable(R.drawable.user_list_off); image = context.getResources().getDrawable(R.drawable.user_list_off);
holder.lastSeen.setText("");
holder.loader.setVisibility(View.GONE);
} }
image.setBounds(0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight()); image.setBounds(0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight());
@ -82,6 +88,9 @@ public class TutorsListAdapter extends RecyclerView.Adapter<TutorsListAdapter.My
@BindView(R.id.isOnline) @BindView(R.id.isOnline)
TextView isOnline; TextView isOnline;
@BindView(R.id.loader)
SpinKitView loader;
MyViewHolder(View view) { MyViewHolder(View view) {
super(view); super(view);
ButterKnife.bind(this, view); ButterKnife.bind(this, view);

View File

@ -28,6 +28,21 @@
android:textColor="@color/msg_no_notes" android:textColor="@color/msg_no_notes"
android:textSize="@dimen/msg_no_notes" /> android:textSize="@dimen/msg_no_notes" />
<com.github.ybq.android.spinkit.SpinKitView
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/loader"
style="@style/SpinKitView.Large.Wave"
android:layout_width="150dp"
android:layout_height="150dp"
app:SpinKit_Color="@color/msg_no_notes"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/margin_top_no_notes"
android:fontFamily="sans-serif-light"
android:text="@string/loading"
android:textColor="@color/msg_no_notes"
android:textSize="@dimen/msg_no_notes" />
</RelativeLayout> </RelativeLayout>

View File

@ -28,6 +28,20 @@
android:textColor="@color/msg_no_notes" android:textColor="@color/msg_no_notes"
android:textSize="@dimen/msg_no_notes" /> android:textSize="@dimen/msg_no_notes" />
<com.github.ybq.android.spinkit.SpinKitView
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/loader"
style="@style/SpinKitView.Large.Wave"
android:layout_width="150dp"
android:layout_height="150dp"
app:SpinKit_Color="@color/msg_no_notes"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/margin_top_no_notes"
android:fontFamily="sans-serif-light"
android:text="@string/loading"
android:textColor="@color/msg_no_notes"
android:textSize="@dimen/msg_no_notes" />
</RelativeLayout> </RelativeLayout>

View File

@ -19,9 +19,20 @@
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_marginStart="12dp" android:layout_marginStart="12dp"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:textColor="@color/note_list_text" android:textColor="@color/note_list_text"
android:textSize="15sp" /> android:textSize="15sp" />
<com.github.ybq.android.spinkit.SpinKitView xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/loader"
style="@style/SpinKitView.Large.Wave"
android:layout_marginStart="12dp"
android:layout_marginTop="35dp"
android:layout_width="30dp"
android:layout_height="30dp"
app:SpinKit_Color="@color/colorAccent" />
<TextView <TextView
android:id="@+id/lastSeen" android:id="@+id/lastSeen"
android:layout_width="270dp" android:layout_width="270dp"
@ -35,7 +46,6 @@
android:textColor="#979797" android:textColor="#979797"
android:textSize="13sp" /> android:textSize="13sp" />
<TextView <TextView
android:id="@+id/isOnline" android:id="@+id/isOnline"
android:layout_width="50dp" android:layout_width="50dp"

View File

@ -27,5 +27,20 @@
android:textSize="@dimen/msg_no_notes" /> android:textSize="@dimen/msg_no_notes" />
<com.github.ybq.android.spinkit.SpinKitView
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/loader"
style="@style/SpinKitView.Large.Wave"
android:layout_width="150dp"
android:layout_height="150dp"
app:SpinKit_Color="@color/msg_no_notes"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/margin_top_no_notes"
android:fontFamily="sans-serif-light"
android:text="@string/loading"
android:textColor="@color/msg_no_notes"
android:textSize="@dimen/msg_no_notes" />
</RelativeLayout> </RelativeLayout>

View File

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

View File

@ -455,5 +455,5 @@
<string name="other_location">Not saved location.</string> <string name="other_location">Not saved location.</string>
<string name="user_status_label" translatable="false">Status</string> <string name="user_status_label" translatable="false">Status</string>
<string name="available_now">Available now</string> <string name="available_now">Available now</string>
<string name="last_seen">Last seen</string> <string name="last_sign">Last seen</string>
</resources> </resources>