GuidedStep: More example of editing

Example of switching text when editing.
Example of error checking and next action.
Example of InputType.
Example of enable/disable action.

Change-Id: Iea5108cb3f3d487be0a8cd892568c3e053ee3d0d
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepActivity.java
index 63149b4..7dda7ff 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepActivity.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepActivity.java
@@ -27,6 +27,7 @@
 import android.support.v17.leanback.widget.GuidedAction;
 import android.support.v17.leanback.widget.GuidanceStylist;
 import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
+import android.text.InputType;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.ViewGroup;
@@ -44,7 +45,8 @@
 
     private static final int FIRST_NAME = 3;
     private static final int LAST_NAME = 4;
-    private static final int PAYMENT = 5;
+    private static final int PASSWORD = 5;
+    private static final int PAYMENT = 6;
 
     private static final int OPTION_CHECK_SET_ID = 10;
     private static final int DEFAULT_OPTION = 0;
@@ -109,6 +111,31 @@
                 .build());
     }
 
+    private static void addEditableAction(List<GuidedAction> actions, long id, String title,
+            String editTitle, int editInputType, String desc, String editDesc) {
+        actions.add(new GuidedAction.Builder()
+                .id(id)
+                .title(title)
+                .editTitle(editTitle)
+                .editInputType(editInputType)
+                .description(desc)
+                .editDescription(editDesc)
+                .editable(true)
+                .build());
+    }
+
+    private static void addEditableDescriptionAction(List<GuidedAction> actions, long id,
+            String title, String desc, String editDescription, int descriptionEditInputType) {
+        actions.add(new GuidedAction.Builder()
+                .id(id)
+                .title(title)
+                .description(desc)
+                .editDescription(editDescription)
+                .descriptionEditInputType(descriptionEditInputType)
+                .descriptionEditable(true)
+                .build());
+    }
+
     private static void addCheckedAction(List<GuidedAction> actions, int iconResId, Context context,
             String title, String desc) {
         actions.add(new GuidedAction.Builder()
@@ -171,8 +198,12 @@
         public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
             addEditableAction(actions, FIRST_NAME, "Pat", "Your first name");
             addEditableAction(actions, LAST_NAME, "Smith", "Your last name");
-            addEditableAction(actions, PAYMENT, "Payment", "", "Input credit card number");
+            addEditableAction(actions, PAYMENT, "Payment", "", InputType.TYPE_CLASS_NUMBER,
+                    "Input credit card number", "Input credit card number");
+            addEditableDescriptionAction(actions, PASSWORD, "Password", "", "",
+                    InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
             addAction(actions, CONTINUE, "Continue", "Continue");
+            actions.get(actions.size() - 1).setEnabled(false);
         }
 
         @Override
@@ -184,16 +215,52 @@
         }
 
         @Override
-        public void onGuidedActionEdited(GuidedAction action) {
-            CharSequence editTitle = action.getEditTitle();
-            if (TextUtils.isDigitsOnly(editTitle) && editTitle.length() == 16) {
-                editTitle = editTitle.subSequence(editTitle.length() - 4, editTitle.length());
-                action.setDescription("Visa XXXX-XXXX-XXXX-"+editTitle);
-            } else if (editTitle.length() == 0){
-                action.setDescription("Input credit card number");
-            } else {
-                action.setDescription("Error credit card number");
+        public long onGuidedActionEditedAndProceed(GuidedAction action) {
+            if (action.getId() == PAYMENT) {
+                CharSequence editTitle = action.getEditTitle();
+                if (TextUtils.isDigitsOnly(editTitle) && editTitle.length() == 16) {
+                    editTitle = editTitle.subSequence(editTitle.length() - 4, editTitle.length());
+                    action.setDescription("Visa XXXX-XXXX-XXXX-"+editTitle);
+                    updateContinue(isPasswordValid());
+                    return GuidedAction.ACTION_ID_NEXT;
+                } else if (editTitle.length() == 0){
+                    action.setDescription("Input credit card number");
+                    updateContinue(false);
+                    return GuidedAction.ACTION_ID_CURRENT;
+                } else {
+                    action.setDescription("Error credit card number");
+                    updateContinue(false);
+                    return GuidedAction.ACTION_ID_CURRENT;
+                }
+            } else if (action.getId() == PASSWORD) {
+                CharSequence password = action.getEditDescription();
+                if (password.length() > 0) {
+                    if (isPaymentValid()) {
+                        updateContinue(true);
+                        return GuidedAction.ACTION_ID_NEXT;
+                    } else {
+                        updateContinue(false);
+                        return GuidedAction.ACTION_ID_CURRENT;
+                    }
+                } else {
+                    updateContinue(false);
+                    return GuidedAction.ACTION_ID_CURRENT;
+                }
             }
+            return GuidedAction.ACTION_ID_NEXT;
+        }
+
+        boolean isPaymentValid() {
+            return findActionById(PAYMENT).getDescription().subSequence(0, 4).toString().equals("Visa");
+        }
+
+        boolean isPasswordValid() {
+            return findActionById(PASSWORD).getEditDescription().length() > 0;
+        }
+
+        void updateContinue(boolean enabled) {
+            findActionById(CONTINUE).setEnabled(enabled);
+            notifyActionChanged(findActionPositionById(CONTINUE));
         }
     }
 
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepSupportActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepSupportActivity.java
index 432c6c0..1fb7cfa 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepSupportActivity.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepSupportActivity.java
@@ -29,6 +29,7 @@
 import android.support.v17.leanback.widget.GuidedAction;
 import android.support.v17.leanback.widget.GuidanceStylist;
 import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
+import android.text.InputType;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.ViewGroup;
@@ -46,7 +47,8 @@
 
     private static final int FIRST_NAME = 3;
     private static final int LAST_NAME = 4;
-    private static final int PAYMENT = 5;
+    private static final int PASSWORD = 5;
+    private static final int PAYMENT = 6;
 
     private static final int OPTION_CHECK_SET_ID = 10;
     private static final int DEFAULT_OPTION = 0;
@@ -111,6 +113,31 @@
                 .build());
     }
 
+    private static void addEditableAction(List<GuidedAction> actions, long id, String title,
+            String editTitle, int editInputType, String desc, String editDesc) {
+        actions.add(new GuidedAction.Builder()
+                .id(id)
+                .title(title)
+                .editTitle(editTitle)
+                .editInputType(editInputType)
+                .description(desc)
+                .editDescription(editDesc)
+                .editable(true)
+                .build());
+    }
+
+    private static void addEditableDescriptionAction(List<GuidedAction> actions, long id,
+            String title, String desc, String editDescription, int descriptionEditInputType) {
+        actions.add(new GuidedAction.Builder()
+                .id(id)
+                .title(title)
+                .description(desc)
+                .editDescription(editDescription)
+                .descriptionEditInputType(descriptionEditInputType)
+                .descriptionEditable(true)
+                .build());
+    }
+
     private static void addCheckedAction(List<GuidedAction> actions, int iconResId, Context context,
             String title, String desc) {
         actions.add(new GuidedAction.Builder()
@@ -173,8 +200,12 @@
         public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
             addEditableAction(actions, FIRST_NAME, "Pat", "Your first name");
             addEditableAction(actions, LAST_NAME, "Smith", "Your last name");
-            addEditableAction(actions, PAYMENT, "Payment", "", "Input credit card number");
+            addEditableAction(actions, PAYMENT, "Payment", "", InputType.TYPE_CLASS_NUMBER,
+                    "Input credit card number", "Input credit card number");
+            addEditableDescriptionAction(actions, PASSWORD, "Password", "", "",
+                    InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
             addAction(actions, CONTINUE, "Continue", "Continue");
+            actions.get(actions.size() - 1).setEnabled(false);
         }
 
         @Override
@@ -186,16 +217,52 @@
         }
 
         @Override
-        public void onGuidedActionEdited(GuidedAction action) {
-            CharSequence editTitle = action.getEditTitle();
-            if (TextUtils.isDigitsOnly(editTitle) && editTitle.length() == 16) {
-                editTitle = editTitle.subSequence(editTitle.length() - 4, editTitle.length());
-                action.setDescription("Visa XXXX-XXXX-XXXX-"+editTitle);
-            } else if (editTitle.length() == 0){
-                action.setDescription("Input credit card number");
-            } else {
-                action.setDescription("Error credit card number");
+        public long onGuidedActionEditedAndProceed(GuidedAction action) {
+            if (action.getId() == PAYMENT) {
+                CharSequence editTitle = action.getEditTitle();
+                if (TextUtils.isDigitsOnly(editTitle) && editTitle.length() == 16) {
+                    editTitle = editTitle.subSequence(editTitle.length() - 4, editTitle.length());
+                    action.setDescription("Visa XXXX-XXXX-XXXX-"+editTitle);
+                    updateContinue(isPasswordValid());
+                    return GuidedAction.ACTION_ID_NEXT;
+                } else if (editTitle.length() == 0){
+                    action.setDescription("Input credit card number");
+                    updateContinue(false);
+                    return GuidedAction.ACTION_ID_CURRENT;
+                } else {
+                    action.setDescription("Error credit card number");
+                    updateContinue(false);
+                    return GuidedAction.ACTION_ID_CURRENT;
+                }
+            } else if (action.getId() == PASSWORD) {
+                CharSequence password = action.getEditDescription();
+                if (password.length() > 0) {
+                    if (isPaymentValid()) {
+                        updateContinue(true);
+                        return GuidedAction.ACTION_ID_NEXT;
+                    } else {
+                        updateContinue(false);
+                        return GuidedAction.ACTION_ID_CURRENT;
+                    }
+                } else {
+                    updateContinue(false);
+                    return GuidedAction.ACTION_ID_CURRENT;
+                }
             }
+            return GuidedAction.ACTION_ID_NEXT;
+        }
+
+        boolean isPaymentValid() {
+            return findActionById(PAYMENT).getDescription().subSequence(0, 4).toString().equals("Visa");
+        }
+
+        boolean isPasswordValid() {
+            return findActionById(PASSWORD).getEditDescription().length() > 0;
+        }
+
+        void updateContinue(boolean enabled) {
+            findActionById(CONTINUE).setEnabled(enabled);
+            notifyActionChanged(findActionPositionById(CONTINUE));
         }
     }