package com.hitherejoe.watchtower.ui.fragment; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.TextView; import com.hitherejoe.watchtower.R; import com.hitherejoe.watchtower.WatchTowerApplication; import com.hitherejoe.watchtower.data.DataManager; import com.hitherejoe.watchtower.data.model.Beacon; import com.hitherejoe.watchtower.data.model.Diagnostics; import com.hitherejoe.watchtower.data.model.Diagnostics.Alert; import com.hitherejoe.watchtower.ui.adapter.AlertHolder; import com.hitherejoe.watchtower.util.DataUtils; import com.hitherejoe.watchtower.util.DialogFactory; import java.util.Arrays; import butterknife.Bind; import butterknife.ButterKnife; import retrofit.RetrofitError; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.subscriptions.CompositeSubscription; import timber.log.Timber; import uk.co.ribot.easyadapter.EasyRecyclerAdapter; public class AlertsFragment extends Fragment { @Bind(R.id.recycler_alerts) RecyclerView mAlertsRecycler; @Bind(R.id.text_no_alerts) TextView mNoAttachmentsText; @Bind(R.id.progress_indicator) ProgressBar mProgressBar; @Bind(R.id.text_battery_date) TextView mBatteryDateText; private static final String EXTRA_BEACON = "EXTRA_BEACON"; private Beacon mBeacon; private CompositeSubscription mSubscriptions; private DataManager mDataManager; private Diagnostics mDiagnostics; private EasyRecyclerAdapter<Alert> mEasyRecycleAdapter; public static AlertsFragment newInstance(Beacon beacon) { AlertsFragment propertiesFragment = new AlertsFragment(); Bundle args = new Bundle(); args.putParcelable(EXTRA_BEACON, beacon); propertiesFragment.setArguments(args); return propertiesFragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBeacon = getArguments().getParcelable(EXTRA_BEACON); if (mBeacon == null) { throw new IllegalArgumentException("Alerts fragment requires a beacon instance!"); } mSubscriptions = new CompositeSubscription(); mDataManager = WatchTowerApplication.get(getActivity()).getComponent().dataManager(); mEasyRecycleAdapter = new EasyRecyclerAdapter<>(getActivity(), AlertHolder.class); setHasOptionsMenu(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View fragmentView = inflater.inflate(R.layout.fragment_alerts, container, false); ButterKnife.bind(this, fragmentView); setupRecyclerView(); getDiagnostics(); return fragmentView; } @Override public void onDestroyView() { super.onDestroyView(); mSubscriptions.unsubscribe(); } private void setupRecyclerView() { mAlertsRecycler.setLayoutManager(new LinearLayoutManager(getActivity())); mAlertsRecycler.setAdapter(mEasyRecycleAdapter); } private void getDiagnostics() { if (DataUtils.isNetworkAvailable(getActivity())) { mSubscriptions.add(mDataManager.getDiagnostics(mBeacon.beaconName) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(mDataManager.getScheduler()) .subscribe(new Subscriber<Diagnostics>() { @Override public void onCompleted() { mProgressBar.setVisibility(View.GONE); if (mDiagnostics != null) { if (mDiagnostics.estimatedLowBatteryDate != null) { mBatteryDateText.setText(mDiagnostics.estimatedLowBatteryDate.buildDate()); } else { mBatteryDateText.setText(getString(R.string.text_battery_unknown)); } if (mDiagnostics.alerts != null && mDiagnostics.alerts.length > 0) { mEasyRecycleAdapter.addItems(Arrays.asList(mDiagnostics.alerts)); mNoAttachmentsText.setVisibility(View.GONE); mAlertsRecycler.setVisibility(View.VISIBLE); } else { mNoAttachmentsText.setVisibility(View.VISIBLE); mAlertsRecycler.setVisibility(View.GONE); } } } @Override public void onError(Throwable error) { mProgressBar.setVisibility(View.GONE); Timber.e("There was an error retrieving beacon diagnostics " + error); if (error instanceof RetrofitError) { DialogFactory.createRetrofitErrorDialog(getActivity(), (RetrofitError) error).show(); } else { DialogFactory.createSimpleErrorDialog(getActivity()).show(); } } @Override public void onNext(Diagnostics diagnostics) { mDiagnostics = diagnostics; } })); } else { mProgressBar.setVisibility(View.GONE); DialogFactory.createSimpleOkErrorDialog( getActivity(), getString(R.string.dialog_error_title), getString(R.string.dialog_error_no_connection) ).show(); } } }