Merge pull request #166 from therajanmaurya/restFails

Feat: Show Error UI, If loan account failed to fetch
diff --git a/app/src/main/java/org/apache/fineract/ui/base/FineractBaseFragment.java b/app/src/main/java/org/apache/fineract/ui/base/FineractBaseFragment.java
index d606dcc..ba97a75 100644
--- a/app/src/main/java/org/apache/fineract/ui/base/FineractBaseFragment.java
+++ b/app/src/main/java/org/apache/fineract/ui/base/FineractBaseFragment.java
@@ -3,16 +3,21 @@
 import android.app.Activity;
 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.View;
 import android.view.inputmethod.InputMethodManager;
 
+import org.apache.fineract.ui.uierrorhandler.FineractUIErrorHandler;
+import org.apache.fineract.ui.uierrorhandler.UIType;
 import org.apache.fineract.utils.ProgressBarHandler;
 
 public class FineractBaseFragment extends Fragment {
 
     private BaseActivityCallback callback;
     private ProgressBarHandler progressBarHandler;
+    private FineractUIErrorHandler fineractUIErrorHandler;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -51,6 +56,26 @@
         progressBarHandler.hide();
     }
 
+    protected void initializeFineractUIErrorHandler(Context context, View view) {
+        fineractUIErrorHandler = new FineractUIErrorHandler(context, view);
+    }
+
+    protected void showFineractEmptyUI(@NonNull String featureName, @Nullable String subFeatureName,
+            @NonNull Integer featureImage) {
+        fineractUIErrorHandler.showEmptyOrErrorOrNoConnectionUI(UIType.EMPTY_UI, featureName,
+                subFeatureName, featureImage);
+    }
+
+    protected void showFineractErrorUI(@NonNull String featureName) {
+        fineractUIErrorHandler.showEmptyOrErrorOrNoConnectionUI(UIType.ERROR_UI, featureName, null,
+                null);
+    }
+
+    protected void showFineractNoInternetUI() {
+        fineractUIErrorHandler.showEmptyOrErrorOrNoConnectionUI(UIType.NO_INTERNET, null, null,
+                null);
+    }
+
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
diff --git a/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/depositaccountslist/DepositAccountsFragment.java b/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/depositaccountslist/DepositAccountsFragment.java
index 75cf73e..fdaa38d 100644
--- a/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/depositaccountslist/DepositAccountsFragment.java
+++ b/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/depositaccountslist/DepositAccountsFragment.java
@@ -16,12 +16,8 @@
 import org.apache.fineract.ui.base.FineractBaseFragment;
 import org.apache.fineract.ui.base.OnItemClickListener;
 import org.apache.fineract.ui.online.depositaccounts.createdepositaccount.DepositAction;
-import org.apache.fineract.ui.online.depositaccounts.createdepositaccount.createdepositactivity
-        .CreateDepositActivity;
-import org.apache.fineract.ui.online.depositaccounts.depositaccountdetails
-        .DepositAccountDetailsFragment;
-import org.apache.fineract.ui.uierrorhandler.FineractUIErrorHandler;
-import org.apache.fineract.ui.uierrorhandler.UIType;
+import org.apache.fineract.ui.online.depositaccounts.createdepositaccount.createdepositactivity.CreateDepositActivity;
+import org.apache.fineract.ui.online.depositaccounts.depositaccountdetails.DepositAccountDetailsFragment;
 import org.apache.fineract.utils.ConstantKeys;
 
 import java.util.ArrayList;
@@ -56,7 +52,6 @@
 
     private String customerIdentifier;
     private List<DepositAccount> customerDepositAccounts;
-    private FineractUIErrorHandler mifosUIErrorHandler;
 
     public static DepositAccountsFragment newInstance(String customerIdentifier) {
         DepositAccountsFragment fragment = new DepositAccountsFragment();
@@ -81,7 +76,7 @@
         rootView = inflater.inflate(R.layout.fragment_customer_deposit, container, false);
         ((FineractBaseActivity) getActivity()).getActivityComponent().inject(this);
         ButterKnife.bind(this, rootView);
-        mifosUIErrorHandler = new FineractUIErrorHandler(getActivity(), rootView);
+        initializeFineractUIErrorHandler(getActivity(), rootView);
         setToolbarTitle(getString(R.string.deposit_accounts));
 
         customerDepositPresenter.attachView(this);
@@ -133,8 +128,7 @@
     @Override
     public void showEmptyDepositAccounts() {
         showRecyclerView(false);
-        mifosUIErrorHandler.showEmptyOrErrorUI(UIType.EMPTY_UI,
-                getString(R.string.deposit_accounts),
+        showFineractEmptyUI(getString(R.string.deposit_accounts),
                 getString(R.string.deposit_account),
                 R.drawable.ic_monetization_on_black_24dp);
     }
@@ -142,9 +136,7 @@
     @Override
     public void showError(String errorMessage) {
         showRecyclerView(false);
-        mifosUIErrorHandler.showEmptyOrErrorUI(UIType.ERROR_UI,
-                getString(R.string.deposit_accounts),
-                null, null);
+        showFineractErrorUI(getString(R.string.deposit_accounts));
     }
 
     @Override
diff --git a/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loandetails/CustomerLoanDetailsFragment.java b/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loandetails/CustomerLoanDetailsFragment.java
index ca8cd6c..f31cf7a 100644
--- a/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loandetails/CustomerLoanDetailsFragment.java
+++ b/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loandetails/CustomerLoanDetailsFragment.java
@@ -4,6 +4,7 @@
 import android.os.Bundle;
 import android.support.annotation.Nullable;
 import android.support.design.widget.CoordinatorLayout;
+import android.support.v4.widget.NestedScrollView;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
@@ -60,24 +61,18 @@
     @BindView(R.id.tv_loan_current_status)
     TextView tvLoanCurrentStatus;
 
-    @BindView(R.id.cl_customer_loan_details)
-    CoordinatorLayout clCustomerLoanDetails;
+    @BindView(R.id.ncv_customer_loan_details)
+    NestedScrollView ncvCustomerLoanDetails;
 
     @BindView(R.id.layout_disburse_btn)
     RelativeLayout layoutDisburseButton;
 
-    @BindView(R.id.rl_error)
-    RelativeLayout rlError;
-
     @BindView(R.id.tv_alert_text_1)
     TextView tvAlertText1;
 
     @BindView(R.id.tv_alert_text_2)
     TextView tvAlertText2;
 
-    @BindView(R.id.tv_error)
-    TextView tvError;
-
     @BindView(R.id.tv_customer_deposit_account)
     TextView tvCustomerDepositAccount;
 
@@ -87,6 +82,9 @@
     @BindView(R.id.tv_last_modified_by)
     TextView tvLastModifiedBy;
 
+    @BindView(R.id.layout_error)
+    View layoutError;
+
     @Inject
     CustomerLoanDetailsPresenter customerLoanDetailsPresenter;
 
@@ -127,6 +125,7 @@
         rootView = inflater.inflate(R.layout.fragment_customer_loan_details, container, false);
         ((FineractBaseActivity) getActivity()).getActivityComponent().inject(this);
         ButterKnife.bind(this, rootView);
+        initializeFineractUIErrorHandler(getActivity(), rootView);
         customerLoanDetailsPresenter.attachView(this);
 
         customerLoanDetailsPresenter.fetchCustomerLoanDetails(productIdentifier, caseIdentifier);
@@ -134,10 +133,10 @@
         return rootView;
     }
 
-    @OnClick(R.id.iv_retry)
-    void onRetry() {
-        clCustomerLoanDetails.setVisibility(View.GONE);
-        rlError.setVisibility(View.GONE);
+    @OnClick(R.id.btn_try_again)
+    void tryAgainOnError() {
+        ncvCustomerLoanDetails.setVisibility(View.GONE);
+        layoutError.setVisibility(View.GONE);
         customerLoanDetailsPresenter.fetchCustomerLoanDetails(productIdentifier, caseIdentifier);
     }
 
@@ -160,8 +159,8 @@
     @Override
     public void showLoanAccountDetails(LoanAccount loanAccount) {
         this.loanAccount = loanAccount;
-        clCustomerLoanDetails.setVisibility(View.VISIBLE);
-        rlError.setVisibility(View.GONE);
+        ncvCustomerLoanDetails.setVisibility(View.VISIBLE);
+        layoutError.setVisibility(View.GONE);
         setToolbarTitle(loanAccount.getIdentifier());
 
         tvPaymentAmount.setText(
@@ -250,10 +249,9 @@
 
     @Override
     public void showError(String message) {
-        clCustomerLoanDetails.setVisibility(View.GONE);
-        rlError.setVisibility(View.VISIBLE);
-        tvError.setText(message);
-        Toaster.show(rootView, message);
+        ncvCustomerLoanDetails.setVisibility(View.GONE);
+        layoutError.setVisibility(View.VISIBLE);
+        showFineractErrorUI(getString(R.string.loan_account));
     }
 
     @Override
diff --git a/app/src/main/java/org/apache/fineract/ui/uierrorhandler/FineractUIErrorHandler.java b/app/src/main/java/org/apache/fineract/ui/uierrorhandler/FineractUIErrorHandler.java
index 26e11cf..9f84055 100644
--- a/app/src/main/java/org/apache/fineract/ui/uierrorhandler/FineractUIErrorHandler.java
+++ b/app/src/main/java/org/apache/fineract/ui/uierrorhandler/FineractUIErrorHandler.java
@@ -3,6 +3,7 @@
 import android.content.Context;
 import android.support.annotation.Nullable;
 import android.view.View;
+import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -20,8 +21,11 @@
     private ImageView ivEmptyFeatureImage;
     private TextView tvFeatureName;
     private TextView tvSubFeatureName;
+    private Button btnTryAgain;
     private LinearLayout llEmptyUI;
     private LinearLayout llErrorToLoad;
+    private LinearLayout llNoInternet;
+    private LinearLayout llError;
     private TextView tvErrorFeatureName;
 
     private Context context;
@@ -33,7 +37,7 @@
         initializeUI();
     }
 
-    public void showEmptyOrErrorUI(UIType errorType, String featureName,
+    public void showEmptyOrErrorOrNoConnectionUI(UIType errorType, String featureName,
             @Nullable String subFeatureName, @Nullable Integer featureImage) {
         switch (errorType) {
             case EMPTY_UI:
@@ -45,9 +49,19 @@
                 llErrorToLoad.setVisibility(View.GONE);
                 break;
             case ERROR_UI:
-                llErrorToLoad.setVisibility(View.VISIBLE);
-                tvErrorFeatureName.setText(featureName);
                 llEmptyUI.setVisibility(View.GONE);
+                llNoInternet.setVisibility(View.GONE);
+                llError.setVisibility(View.VISIBLE);
+                llErrorToLoad.setVisibility(View.VISIBLE);
+                btnTryAgain.setText(context.getString(R.string.try_again));
+                tvErrorFeatureName.setText(featureName);
+                break;
+            case NO_INTERNET:
+                llEmptyUI.setVisibility(View.GONE);
+                llError.setVisibility(View.GONE);
+                llNoInternet.setVisibility(View.VISIBLE);
+                llErrorToLoad.setVisibility(View.VISIBLE);
+                btnTryAgain.setText(context.getString(R.string.retry));
                 break;
         }
     }
@@ -58,6 +72,9 @@
         tvSubFeatureName = ButterKnife.findById(view, R.id.tv_empty_sub_feature_name);
         llEmptyUI = ButterKnife.findById(view, R.id.ll_empty_ui);
         llErrorToLoad = ButterKnife.findById(view, R.id.ll_error_to_load);
+        llNoInternet = ButterKnife.findById(view, R.id.ll_no_internet);
+        llError = ButterKnife.findById(view, R.id.ll_error);
+        btnTryAgain = ButterKnife.findById(view, R.id.btn_try_again);
         tvErrorFeatureName = ButterKnife.findById(view, R.id.tv_error_feature_name);
     }
 }
diff --git a/app/src/main/java/org/apache/fineract/ui/uierrorhandler/UIType.java b/app/src/main/java/org/apache/fineract/ui/uierrorhandler/UIType.java
index 1c56892..243d3c9 100644
--- a/app/src/main/java/org/apache/fineract/ui/uierrorhandler/UIType.java
+++ b/app/src/main/java/org/apache/fineract/ui/uierrorhandler/UIType.java
@@ -8,5 +8,7 @@
 
     EMPTY_UI,
 
-    ERROR_UI
+    ERROR_UI,
+
+    NO_INTERNET
 }
diff --git a/app/src/main/res/drawable/ic_portable_wifi_off_black_24dp.xml b/app/src/main/res/drawable/ic_portable_wifi_off_black_24dp.xml
new file mode 100644
index 0000000..6a3e06f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_portable_wifi_off_black_24dp.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M17.56,14.24c0.28,-0.69 0.44,-1.45 0.44,-2.24 0,-3.31 -2.69,-6 -6,-6 -0.79,0 -1.55,0.16 -2.24,0.44l1.62,1.62c0.2,-0.03 0.41,-0.06 0.62,-0.06 2.21,0 4,1.79 4,4 0,0.21 -0.02,0.42 -0.05,0.63l1.61,1.61zM12,4c4.42,0 8,3.58 8,8 0,1.35 -0.35,2.62 -0.95,3.74l1.47,1.47C21.46,15.69 22,13.91 22,12c0,-5.52 -4.48,-10 -10,-10 -1.91,0 -3.69,0.55 -5.21,1.47l1.46,1.46C9.37,4.34 10.65,4 12,4zM3.27,2.5L2,3.77l2.1,2.1C2.79,7.57 2,9.69 2,12c0,3.7 2.01,6.92 4.99,8.65l1,-1.73C5.61,17.53 4,14.96 4,12c0,-1.76 0.57,-3.38 1.53,-4.69l1.43,1.44C6.36,9.68 6,10.8 6,12c0,2.22 1.21,4.15 3,5.19l1,-1.74c-1.19,-0.7 -2,-1.97 -2,-3.45 0,-0.65 0.17,-1.25 0.44,-1.79l1.58,1.58L10,12c0,1.1 0.9,2 2,2l0.21,-0.02 0.01,0.01 7.51,7.51L21,20.23 4.27,3.5l-1,-1z"/>
+</vector>
diff --git a/app/src/main/res/layout/fragment_customer_loan_details.xml b/app/src/main/res/layout/fragment_customer_loan_details.xml
index dfd0927..c8c3d52 100644
--- a/app/src/main/res/layout/fragment_customer_loan_details.xml
+++ b/app/src/main/res/layout/fragment_customer_loan_details.xml
@@ -6,8 +6,7 @@
     android:id="@+id/cl_customer_loan_details"
     android:layout_height="match_parent"
     android:layout_width="match_parent"
-    android:orientation="vertical"
-    android:visibility="invisible">
+    android:orientation="vertical">
 
     <android.support.v4.widget.NestedScrollView
         xmlns:android="http://schemas.android.com/apk/res/android"
@@ -16,6 +15,7 @@
         android:id="@+id/ncv_customer_loan_details"
         android:layout_height="match_parent"
         android:layout_width="match_parent"
+        android:visibility="invisible"
         app:layout_behavior="@string/appbar_scrolling_view_behavior">
 
         <LinearLayout
@@ -229,17 +229,17 @@
                     </LinearLayout>
 
                     <View
-                        android:layout_width="match_parent"
-                        android:layout_height="0.2dp"
                         android:background="#E7DFDF"
-                        android:layout_marginTop="@dimen/layout_padding_16dp"/>
+                        android:layout_height="0.2dp"
+                        android:layout_marginTop="@dimen/layout_padding_16dp"
+                        android:layout_width="match_parent"/>
 
                     <LinearLayout
                         android:layout_height="wrap_content"
                         android:layout_width="wrap_content"
                         android:orientation="horizontal"
-                        android:paddingTop="@dimen/layout_padding_8dp"
-                        android:paddingBottom="@dimen/layout_padding_16dp">
+                        android:paddingBottom="@dimen/layout_padding_16dp"
+                        android:paddingTop="@dimen/layout_padding_8dp">
 
                         <LinearLayout
                             android:layout_height="wrap_content"
@@ -511,8 +511,8 @@
         android:visibility="gone"/>
 
     <include
-        layout="@layout/layout_error"
-        android:id="@+id/rl_error"
+        layout="@layout/layout_exception_handler"
+        android:id="@+id/layout_error"
         android:visibility="gone"/>
 
 </android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_exception_handler.xml b/app/src/main/res/layout/layout_exception_handler.xml
index 8b97843..9bbd38e 100644
--- a/app/src/main/res/layout/layout_exception_handler.xml
+++ b/app/src/main/res/layout/layout_exception_handler.xml
@@ -8,12 +8,12 @@
     android:layout_width="match_parent">
 
     <LinearLayout
-        android:id="@+id/ll_error_to_load"
         android:gravity="center"
+        android:id="@+id/ll_error_to_load"
         android:layout_height="match_parent"
         android:layout_width="match_parent"
         android:orientation="vertical"
-        android:visibility="gone">
+        android:visibility="visible">
 
         <ImageView
             android:contentDescription="@string/status_image"
@@ -24,23 +24,69 @@
             android:tint="@color/grey_500"
             app:srcCompat="@drawable/ic_cloud_off_black_24dp"/>
 
-        <TextView
-            style="@style/Base.TextAppearance.AppCompat.Medium"
+        <!--Views for Any error occurred while make REST API call-->
+        <LinearLayout
+            android:id="@+id/ll_error"
             android:layout_height="wrap_content"
             android:layout_width="wrap_content"
-            android:text="@string/error_sorry_not_able_to_load"
-            android:textColor="@color/grey_500"
-            android:textSize="@dimen/text_size_14sp"
-            android:typeface="monospace" />
+            android:orientation="vertical">
 
-        <TextView
-            android:id="@+id/tv_error_feature_name"
+            <TextView
+                style="@style/Base.TextAppearance.AppCompat.Medium"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="@string/error_sorry_not_able_to_load"
+                android:textColor="@color/grey_500"
+                android:textSize="@dimen/text_size_14sp"
+                android:typeface="monospace"/>
+
+            <TextView
+                android:id="@+id/tv_error_feature_name"
+                android:layout_gravity="center"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:textColor="@color/grey_500"
+                android:textSize="@dimen/text_size_14sp"
+                tools:text="Deposit Accounts"/>
+
+        </LinearLayout>
+
+        <!--Views for No Internet connection-->
+        <LinearLayout
+            android:id="@+id/ll_no_internet"
             android:layout_height="wrap_content"
             android:layout_width="wrap_content"
-            android:textColor="@color/grey_500"
-            android:textSize="@dimen/text_size_14sp"
-            tools:text="Deposit Accounts"/>
+            android:orientation="vertical"
+            android:visibility="gone">
 
+            <TextView
+                style="@style/Base.TextAppearance.AppCompat.Large"
+                android:layout_gravity="center"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="@string/oh_no"
+                android:textColor="@color/grey_500"
+                android:typeface="monospace"/>
+
+            <TextView
+                android:layout_gravity="center"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="@string/no_internet_connection"
+                android:textColor="@color/grey_500"
+                android:textSize="@dimen/text_size_14sp"/>
+
+            <TextView
+                android:layout_gravity="center"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="@string/or_try_again"
+                android:textColor="@color/grey_500"
+                android:textSize="@dimen/text_size_14sp"/>
+
+        </LinearLayout>
+
+        <!--Button to retry again-->
         <Button
             android:id="@+id/btn_try_again"
             android:layout_height="wrap_content"
@@ -48,21 +94,21 @@
             android:layout_width="wrap_content"
             android:paddingLeft="@dimen/layout_padding_24dp"
             android:paddingRight="@dimen/layout_padding_24dp"
-            android:text="@string/try_again" />
+            android:text="@string/try_again"/>
 
     </LinearLayout>
 
     <LinearLayout
-        android:id="@+id/ll_empty_ui"
         android:gravity="center"
+        android:id="@+id/ll_empty_ui"
         android:layout_height="match_parent"
         android:layout_width="match_parent"
         android:orientation="vertical"
         android:visibility="gone">
 
         <ImageView
-            android:id="@+id/iv_empty_feature_image"
             android:contentDescription="@string/status_image"
+            android:id="@+id/iv_empty_feature_image"
             android:layout_gravity="center|center_horizontal"
             android:layout_height="70dp"
             android:layout_marginBottom="@dimen/layout_padding_16dp"
@@ -71,8 +117,8 @@
             app:srcCompat="@drawable/ic_monetization_on_black_24dp"/>
 
         <TextView
-            android:id="@+id/tv_empty_feature_name"
             style="@style/Base.TextAppearance.AppCompat.Medium"
+            android:id="@+id/tv_empty_feature_name"
             android:layout_height="wrap_content"
             android:layout_width="wrap_content"
             android:textColor="@color/grey_500"
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 2105404..e0f86e4 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -9,7 +9,8 @@
     <string name="login">Login</string>
     <string name="fineract_account">Fineract Account</string>
     <string name="welcome">Welcome</string>
-    <string name="no_internet_connection">No Internet Connection!</string>
+    <string name="no_internet_connection">No Internet found. Check your connection</string>
+    <string name="or_try_again">or try again</string>
     <string name="wrong_username_or_password">Wrong username or password</string>
     <string name="customer">Customer</string>
     <string name="dashboard">Dashboard</string>
@@ -19,6 +20,7 @@
     <string name="financial_products">Financial products</string>
     <string name="manage_loan_accounts">Manage loan accounts</string>
     <string name="loan_accounts">Loan accounts</string>
+    <string name="loan_account">Loan account</string>
     <string name="deposit_accounts">Deposit accounts</string>
     <string name="roles_and_permissions">Roles/Permissions</string>
     <string name="manage_deposit_accounts">Manage deposit accounts</string>
@@ -172,6 +174,8 @@
     <string name="logout">Logout</string>
     <string name="manage_roles">Manage roles</string>
     <string name="try_again">Try Again</string>
+    <string name="retry">Retry</string>
+    <string name="oh_no">Oh no!</string>
     <string name="empty_ui_message">No %1$s Found</string>
     <string name="empty_ui_sub_message">Tap to add %1$s</string>