package com.quickblox.sample.customobjects.activities; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import com.orangegangsters.github.swipyrefreshlayout.library.SwipyRefreshLayout; import com.orangegangsters.github.swipyrefreshlayout.library.SwipyRefreshLayoutDirection; import com.quickblox.core.exception.QBResponseException; import com.quickblox.core.request.QBRequestGetBuilder; import com.quickblox.core.server.Performer; import com.quickblox.customobjects.QBCustomObjects; import com.quickblox.customobjects.model.QBCustomObject; import com.quickblox.extensions.RxJavaPerformProcessor; import com.quickblox.sample.customobjects.R; import com.quickblox.sample.customobjects.adapter.MovieListAdapter; import com.quickblox.sample.customobjects.helper.DataHolder; import com.quickblox.sample.customobjects.model.Movie; import com.quickblox.sample.customobjects.utils.Consts; import com.quickblox.sample.customobjects.utils.QBCustomObjectsUtils; import java.util.ArrayList; import java.util.Map; import rx.Observable; import rx.Observer; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Func1; import rx.schedulers.Schedulers; public class MovieListActivity extends BaseActivity implements AdapterView.OnItemClickListener { private static final String TAG = MovieListActivity.class.getSimpleName(); private static final String createDateField = "created_at"; private MovieListAdapter movieListAdapter; private SwipyRefreshLayout setOnRefreshListener; private QBRequestGetBuilder builder; private int skipRecords = 0; public static void start(Context context) { Intent intent = new Intent(context, MovieListActivity.class); context.startActivity(intent); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_movies_list); DataHolderClear(); initUI(); getMovieList(true); } @Override public void onResume() { super.onResume(); movieListAdapter.updateData(DataHolder.getInstance().getMovieMap()); } private void DataHolderClear() { if (!DataHolder.getInstance().getMovieMap().isEmpty()) { DataHolder.getInstance().clear(); } } private void initUI() { ListView moviesListView = _findViewById(R.id.list_movies); moviesListView.setOnItemClickListener(this); movieListAdapter = new MovieListAdapter(this, DataHolder.getInstance().getMovieMap()); moviesListView.setAdapter(movieListAdapter); builder = new QBRequestGetBuilder(); setOnRefreshListener = _findViewById(R.id.swipy_refresh_layout); setOnRefreshListener.setOnRefreshListener(new SwipyRefreshLayout.OnRefreshListener() { @Override public void onRefresh(SwipyRefreshLayoutDirection direction) { builder.setSkip(skipRecords += Consts.LIMIT_RECORDS); getMovieList(false); } }); } @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { Movie movie = (Movie) adapterView.getItemAtPosition(position); ShowMovieActivity.start(this, movie.getId()); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.activity_movies_list, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_add_movie: AddNewMovieActivity.start(this); return true; default: return super.onOptionsItemSelected(item); } } private void getMovieList(boolean progress) { if (progress) { progressDialog.show(); } builder.setLimit(Consts.LIMIT_RECORDS); builder.sortDesc(createDateField); Performer<ArrayList<QBCustomObject>> performer = QBCustomObjects.getObjects(Consts.CLASS_NAME, builder); Observable<ArrayList<QBCustomObject>> observable = performer.convertTo(RxJavaPerformProcessor.INSTANCE); observable.flatMap(new Func1<ArrayList<QBCustomObject>, Observable<QBCustomObject>>() { @Override public Observable<QBCustomObject> call(ArrayList<QBCustomObject> qbCustomObjects) { return Observable.from(qbCustomObjects); } }).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<QBCustomObject>() { @Override public void onCompleted() { setResultParams(true); Map<String, Movie> movieMap = DataHolder.getInstance().getMovieMap(); movieListAdapter.updateData(movieMap); } @Override public void onError(Throwable e) { setResultParams(false); if (QBCustomObjectsUtils.checkQBException(e)) { View rootLayout = findViewById(R.id.swipy_refresh_layout); showSnackbarError(rootLayout, R.string.splash_create_session_error, (QBResponseException) e, new View.OnClickListener() { @Override public void onClick(View v) { getMovieList(false); } }); } else { Log.d(TAG, "onError" + e.getMessage()); } } @Override public void onNext(QBCustomObject customObject) { DataHolder.getInstance().addMovieToMap(new Movie(customObject)); } }); } private void setResultParams(boolean enabled) { setOnRefreshListener.setEnabled(enabled); progressDialog.dismiss(); setOnRefreshListener.setRefreshing(false); } }