fix: Principal Terma and Repay validation while applying for loan
diff --git a/app/src/main/java/com/mifos/apache/fineract/ui/online/loanaccounts/loanapplication/loandetails/LoanDetailsFragment.java b/app/src/main/java/com/mifos/apache/fineract/ui/online/loanaccounts/loanapplication/loandetails/LoanDetailsFragment.java
index 3870d88..12048a1 100644
--- a/app/src/main/java/com/mifos/apache/fineract/ui/online/loanaccounts/loanapplication/loandetails/LoanDetailsFragment.java
+++ b/app/src/main/java/com/mifos/apache/fineract/ui/online/loanaccounts/loanapplication/loandetails/LoanDetailsFragment.java
@@ -28,7 +28,9 @@
 import com.mifos.apache.fineract.ui.base.MifosBaseFragment;
 import com.mifos.apache.fineract.ui.base.Toaster;
 import com.mifos.apache.fineract.ui.online.loanaccounts.loanapplication.OnNavigationBarListener;
+import com.mifos.apache.fineract.utils.Utils;
 import com.mifos.apache.fineract.utils.ValidateIdentifierUtil;
+import com.mifos.apache.fineract.utils.ValidationUtil;
 import com.stepstone.stepper.Step;
 import com.stepstone.stepper.VerificationError;
 
@@ -66,15 +68,24 @@
     @BindView(R.id.et_principal_amount)
     EditText etPrincipalAmount;
 
+    @BindView(R.id.til_principal_amount)
+    TextInputLayout tilPrincipalAmount;
+
     @BindView(R.id.et_term)
     EditText etTerm;
 
+    @BindView(R.id.til_term)
+    TextInputLayout tilTerm;
+
     @BindView(R.id.sp_term_unit_type)
     AppCompatSpinner spTermUnitType;
 
     @BindView(R.id.et_repay)
     EditText etRepay;
 
+    @BindView(R.id.til_repay)
+    TextInputLayout tilRepay;
+
     @BindView(R.id.sp_repay_unit_type)
     AppCompatSpinner spRepayUnitType;
 
@@ -362,23 +373,25 @@
             Double value = Double.parseDouble(etTerm.getText().toString());
 
             if (etTerm.getText().toString().equals("")) {
-                etTerm.setError(getString(R.string.required));
-                etTerm.requestFocus();
+                ValidationUtil.showTextInputLayoutError(tilTerm, getString(R.string.required));
                 return false;
             } else if (!(minimum <= value)) {
-                etTerm.setError(getString(R.string.value_must_greater_or_equal_to, minimum));
-                etTerm.requestFocus();
+                ValidationUtil.showTextInputLayoutError(tilTerm,
+                        getString(R.string.value_must_greater_or_equal_to,
+                                Utils.getPrecision(minimum)));
                 return false;
             } else if (!(value <= maximum)) {
-                etTerm.setError(getString(R.string.value_must_less_than_or_equal_to, maximum));
-                etTerm.requestFocus();
+                ValidationUtil.showTextInputLayoutError(tilTerm,
+                        getString(R.string.value_must_less_than_or_equal_to,
+                                Utils.getPrecision(maximum)));
                 return false;
             }
         } catch (NumberFormatException e) {
-            etTerm.setError(getString(R.string.required));
-            etTerm.requestFocus();
+            ValidationUtil.showTextInputLayoutError(tilTerm,
+                    getString(R.string.required));
             return false;
         }
+        ValidationUtil.hideTextInputLayoutError(tilTerm);
         return true;
     }
 
@@ -390,36 +403,33 @@
             Double value = Double.parseDouble(etPrincipalAmount.getText().toString());
 
             if (etPrincipalAmount.getText().toString().equals("")) {
-                etPrincipalAmount.setError(getString(R.string.required));
-                etPrincipalAmount.requestFocus();
+                ValidationUtil.isEmpty(getActivity(),
+                        etPrincipalAmount.getText().toString().trim(), tilPrincipalAmount);
                 return false;
             } else if (!(minimum <= value)) {
-                etPrincipalAmount.setError(
-                        getString(R.string.value_must_greater_or_equal_to, minimum));
-                etPrincipalAmount.requestFocus();
+                ValidationUtil.showTextInputLayoutError(tilPrincipalAmount,
+                        getString(R.string.value_must_greater_or_equal_to,
+                                Utils.getPrecision(minimum)));
                 return false;
             } else if (!(value <= maximum)) {
-                etPrincipalAmount.setError(
-                        getString(R.string.value_must_less_than_or_equal_to, maximum));
-                etPrincipalAmount.requestFocus();
+                ValidationUtil.showTextInputLayoutError(tilPrincipalAmount,
+                        getString(R.string.value_must_less_than_or_equal_to,
+                                Utils.getPrecision(maximum)));
                 return false;
             }
         } catch (NumberFormatException e) {
-            etPrincipalAmount.setError(getString(R.string.required));
-            etPrincipalAmount.requestFocus();
+            ValidationUtil.showTextInputLayoutError(tilPrincipalAmount,
+                    getString(R.string.required));
             return false;
         }
+        ValidationUtil.hideTextInputLayoutError(tilPrincipalAmount);
         return true;
     }
 
     @Override
     public boolean validateRepay() {
-        if (etRepay.getText().toString().equals("")) {
-            etRepay.setError(getString(R.string.required));
-            etRepay.requestFocus();
-            return false;
-        }
-        return true;
+        return ValidationUtil.isEmpty(getActivity(),
+                etRepay.getText().toString().trim(), tilRepay);
     }
 
     @Override
diff --git a/app/src/main/java/com/mifos/apache/fineract/utils/ValidationUtil.java b/app/src/main/java/com/mifos/apache/fineract/utils/ValidationUtil.java
index eba04ad..8f686e8 100644
--- a/app/src/main/java/com/mifos/apache/fineract/utils/ValidationUtil.java
+++ b/app/src/main/java/com/mifos/apache/fineract/utils/ValidationUtil.java
@@ -46,7 +46,18 @@
                     context.getString(R.string.required));
             return false;
         }
-        ValidateIdentifierUtil.showTextInputLayoutError(inputLayout, null);
+        hideTextInputLayoutError(inputLayout);
         return true;
     }
+
+    public static void showTextInputLayoutError(TextInputLayout textInputLayout,
+            String errorMessage) {
+        textInputLayout.setErrorEnabled(true);
+        textInputLayout.setError(errorMessage);
+    }
+
+    public static void hideTextInputLayoutError(TextInputLayout textInputLayout) {
+        textInputLayout.setErrorEnabled(false);
+        textInputLayout.setError(null);
+    }
 }
diff --git a/app/src/main/res/layout/fragment_loan_details.xml b/app/src/main/res/layout/fragment_loan_details.xml
index 9301261..382eb4b 100644
--- a/app/src/main/res/layout/fragment_loan_details.xml
+++ b/app/src/main/res/layout/fragment_loan_details.xml
@@ -50,7 +50,7 @@
                 <android.support.design.widget.TextInputLayout
                     android:id="@+id/til_short_name"
                     android:layout_height="wrap_content"
-                    android:layout_marginTop="@dimen/layout_padding_4dp"
+                    android:layout_marginTop="@dimen/layout_padding_16dp"
                     android:layout_width="match_parent"
                     app:errorEnabled="true">
 
@@ -63,6 +63,7 @@
                 </android.support.design.widget.TextInputLayout>
 
                 <android.support.design.widget.TextInputLayout
+                    android:id="@+id/til_principal_amount"
                     android:layout_height="wrap_content"
                     android:layout_marginTop="@dimen/layout_padding_4dp"
                     android:layout_width="match_parent">
@@ -83,6 +84,7 @@
                     android:weightSum="2">
 
                     <android.support.design.widget.TextInputLayout
+                        android:id="@+id/til_term"
                         android:layout_height="match_parent"
                         android:layout_marginTop="@dimen/layout_padding_4dp"
                         android:layout_weight="1"
@@ -114,6 +116,7 @@
                     android:weightSum="2">
 
                     <android.support.design.widget.TextInputLayout
+                        android:id="@+id/til_repay"
                         android:layout_height="match_parent"
                         android:layout_marginTop="@dimen/layout_padding_4dp"
                         android:layout_weight="1"
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index fd88ccb..520833a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -201,8 +201,8 @@
     <string name="empty_customer_activities">There is no activities to show</string>
 
     <!--Edit Text validations-->
-    <string name="value_must_greater_or_equal_to">Value must be greater than or equal to&#160; %1$f</string>
-    <string name="value_must_less_than_or_equal_to">Value must be less than or equal to&#160; %1$f</string>
+    <string name="value_must_greater_or_equal_to">Value must be greater than or equal to&#160; %1$s</string>
+    <string name="value_must_less_than_or_equal_to">Value must be less than or equal to&#160; %1$s</string>
     <string name="amount_should_be_not_empty">Amount should not be empty</string>
     <string name="description_should_not_be_empty">Description should not be empty</string>
     <string name="customer_name_should_not_be_empty">Customer name should not be empty</string>