/*
* Copyright (c) linroid 2015.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.linroid.pushapp.ui.device;
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;
import com.linroid.pushapp.App;
import com.linroid.pushapp.R;
import com.linroid.pushapp.api.DeviceService;
import com.linroid.pushapp.model.Device;
import com.linroid.pushapp.model.Pagination;
import com.linroid.pushapp.ui.base.RefreshableFragment;
import com.squareup.sqlbrite.BriteDatabase;
import java.util.List;
import javax.inject.Inject;
import hugo.weaving.DebugLog;
import rx.Observable;
import rx.Observer;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
import rx.subscriptions.CompositeSubscription;
public class DeviceFragment extends RefreshableFragment {
CompositeSubscription subscriptions = new CompositeSubscription();
@Inject
BriteDatabase db;
@Inject
DeviceService deviceApi;
DeviceAdapter adapter;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
adapter = new DeviceAdapter(getActivity());
subscriptions.add(db.createQuery(Device.DB.TABLE_NAME, Device.DB.SQL_LIST_QUERY)
.map(Device.DB.MAP)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(adapter)
);
forceRefresh();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
App.from(activity).component().inject(this);
}
@Override
public RecyclerView.Adapter<? extends RecyclerView.ViewHolder> getAdapter() {
return adapter;
}
@Override
protected int provideViewResourceId() {
return R.layout.fragment_device;
}
@Override
public void loadData(int page) {
subscriptions.add(deviceApi.listDevice(page)
.map(new Func1<Pagination<Device>, List<Device>>() {
@Override
public List<Device> call(Pagination<Device> pagination) {
return pagination.getData();
}
})
.flatMap(new Func1<List<Device>, Observable<Device>>() {
@Override
public Observable<Device> call(List<Device> devices) {
return Observable.from(devices);
}
})
.filter(new Func1<Device, Boolean>() {
@Override
public Boolean call(Device pack) {
Cursor cursor = db.query(Device.DB.SQL_ITEM_QUERY, String.valueOf(pack.getId()));
return !cursor.moveToNext();
}
})
.toList()
.doOnNext(new Action1<List<Device>>() {
@Override
public void call(List<Device> devices) {
db.beginTransaction();
for (Device device : devices) {
db.insert(Device.DB.TABLE_NAME, device.toContentValues());
}
db.setTransactionSuccessful();
db.endTransaction();
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<Device>>() {
@DebugLog
@Override
public void onCompleted() {
loaderView.refreshLayout.setRefreshing(false);
}
@DebugLog
@Override
public void onError(Throwable e) {
loaderView.refreshLayout.setRefreshing(false);
Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_SHORT).show();
}
@DebugLog
@Override
public void onNext(List<Device> devices) {
}
}));
}
@Override
public void onDestroy() {
super.onDestroy();
subscriptions.unsubscribe();
}
}