/* * Copyright (C) 2017 MINDORKS NEXTGEN PRIVATE LIMITED * 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 * * https://mindorks.com/license/apache-v2 * * 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.mindorks.framework.mvp.ui.base; /** * Created by janisharali on 27/01/17. */ import android.util.Log; import com.androidnetworking.common.ANConstants; import com.androidnetworking.error.ANError; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonSyntaxException; import com.mindorks.framework.mvp.R; import com.mindorks.framework.mvp.data.DataManager; import com.mindorks.framework.mvp.data.network.model.ApiError; import com.mindorks.framework.mvp.utils.AppConstants; import com.mindorks.framework.mvp.utils.rx.SchedulerProvider; import javax.inject.Inject; import javax.net.ssl.HttpsURLConnection; import io.reactivex.disposables.CompositeDisposable; /** * Base class that implements the Presenter interface and provides a base implementation for * onAttach() and onDetach(). It also handles keeping a reference to the mvpView that * can be accessed from the children classes by calling getMvpView(). */ public class BasePresenter<V extends MvpView> implements MvpPresenter<V> { private static final String TAG = "BasePresenter"; private final DataManager mDataManager; private final SchedulerProvider mSchedulerProvider; private final CompositeDisposable mCompositeDisposable; private V mMvpView; @Inject public BasePresenter(DataManager dataManager, SchedulerProvider schedulerProvider, CompositeDisposable compositeDisposable) { this.mDataManager = dataManager; this.mSchedulerProvider = schedulerProvider; this.mCompositeDisposable = compositeDisposable; } @Override public void onAttach(V mvpView) { mMvpView = mvpView; } @Override public void onDetach() { mCompositeDisposable.dispose(); mMvpView = null; } public boolean isViewAttached() { return mMvpView != null; } public V getMvpView() { return mMvpView; } public void checkViewAttached() { if (!isViewAttached()) throw new MvpViewNotAttachedException(); } public DataManager getDataManager() { return mDataManager; } public SchedulerProvider getSchedulerProvider() { return mSchedulerProvider; } public CompositeDisposable getCompositeDisposable() { return mCompositeDisposable; } @Override public void handleApiError(ANError error) { if (error == null || error.getErrorBody() == null) { getMvpView().onError(R.string.api_default_error); return; } if (error.getErrorCode() == AppConstants.API_STATUS_CODE_LOCAL_ERROR && error.getErrorDetail().equals(ANConstants.CONNECTION_ERROR)) { getMvpView().onError(R.string.connection_error); return; } if (error.getErrorCode() == AppConstants.API_STATUS_CODE_LOCAL_ERROR && error.getErrorDetail().equals(ANConstants.REQUEST_CANCELLED_ERROR)) { getMvpView().onError(R.string.api_retry_error); return; } final GsonBuilder builder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation(); final Gson gson = builder.create(); try { ApiError apiError = gson.fromJson(error.getErrorBody(), ApiError.class); if (apiError == null || apiError.getMessage() == null) { getMvpView().onError(R.string.api_default_error); return; } switch (error.getErrorCode()) { case HttpsURLConnection.HTTP_UNAUTHORIZED: case HttpsURLConnection.HTTP_FORBIDDEN: setUserAsLoggedOut(); getMvpView().openActivityOnTokenExpire(); case HttpsURLConnection.HTTP_INTERNAL_ERROR: case HttpsURLConnection.HTTP_NOT_FOUND: default: getMvpView().onError(apiError.getMessage()); } } catch (JsonSyntaxException | NullPointerException e) { Log.e(TAG, "handleApiError", e); getMvpView().onError(R.string.api_default_error); } } @Override public void setUserAsLoggedOut() { getDataManager().setAccessToken(null); } public static class MvpViewNotAttachedException extends RuntimeException { public MvpViewNotAttachedException() { super("Please call Presenter.onAttach(MvpView) before" + " requesting data to the Presenter"); } } }