package co.smartreceipts.android.sync.widget.errors; import android.content.Context; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import javax.inject.Inject; import co.smartreceipts.android.activities.NavigationHandler; import co.smartreceipts.android.analytics.Analytics; import co.smartreceipts.android.analytics.events.DataPoint; import co.smartreceipts.android.analytics.events.DefaultDataPointEvent; import co.smartreceipts.android.analytics.events.Events; import co.smartreceipts.android.sync.BackupProviderChangeListener; import co.smartreceipts.android.sync.BackupProvidersManager; import co.smartreceipts.android.sync.errors.SyncErrorType; import co.smartreceipts.android.sync.provider.SyncProvider; import co.smartreceipts.android.utils.log.Logger; import co.smartreceipts.android.widget.Tooltip; import dagger.android.support.AndroidSupportInjection; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; public class SyncErrorFragment extends Fragment implements BackupProviderChangeListener { @Inject Analytics analytics; @Inject BackupProvidersManager backupProvidersManager; @Inject NavigationHandler navigationHandler; private SyncErrorInteractor mSyncErrorInteractor; private SyncErrorPresenter mSyncErrorPresenter; private CompositeDisposable mCompositeDisposable; @Override public void onAttach(Context context) { AndroidSupportInjection.inject(this); super.onAttach(context); } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mSyncErrorInteractor = new SyncErrorInteractor(getActivity(), navigationHandler, backupProvidersManager, analytics); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return new Tooltip(getContext()); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mSyncErrorPresenter = new SyncErrorPresenter((Tooltip) view); } @Override public void onResume() { super.onResume(); mCompositeDisposable = new CompositeDisposable(); mCompositeDisposable.add(mSyncErrorPresenter.getClickStream() .subscribe(syncErrorType -> mSyncErrorInteractor.handleClick(syncErrorType))); backupProvidersManager.registerChangeListener(this); updateForProvider(backupProvidersManager.getSyncProvider()); } @Override public void onPause() { backupProvidersManager.unregisterChangeListener(this); mCompositeDisposable.dispose(); super.onPause(); } @Override public void onProviderChanged(@NonNull SyncProvider newProvider) { updateForProvider(newProvider); } private void updateForProvider(@NonNull SyncProvider provider) { mSyncErrorPresenter.present(provider); mCompositeDisposable.add(mSyncErrorInteractor.getErrorStream() .doOnNext(syncErrorType -> { analytics.record(new DefaultDataPointEvent(Events.Sync.DisplaySyncError).addDataPoint(new DataPoint(SyncErrorType.class.getName(), syncErrorType))); Logger.info(this, "Received sync error: {}.", syncErrorType); }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(syncErrorType -> mSyncErrorPresenter.present(syncErrorType))); } }