From 3f45186c94cab8d9752590f3867f532a56ce5476 Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Thu, 3 Sep 2020 14:40:50 +0700 Subject: [PATCH 1/3] fix(android): Disable "INSTALL" button if no languages selected --- .../tavultesoft/kmapro/PackageActivity.java | 2 +- .../kmapro/SelectLanguageActivity.java | 2 +- .../kmapro/SelectLanguageFragment.java | 40 +++++++++++++++-- .../res/color/ms_custom_button_text_color.xml | 6 +++ .../res/layout/activity_package_installer.xml | 2 +- .../res/layout/bottom_navigation_layout.xml | 43 ------------------- 6 files changed, 46 insertions(+), 49 deletions(-) create mode 100644 android/KMAPro/kMAPro/src/main/res/color/ms_custom_button_text_color.xml delete mode 100644 android/KMAPro/kMAPro/src/main/res/layout/bottom_navigation_layout.xml diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/PackageActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/PackageActivity.java index 0efd43269e..50f2832b59 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/PackageActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/PackageActivity.java @@ -178,7 +178,7 @@ public class PackageActivity extends AppCompatActivity implements @Override public void onError(VerificationError verificationError) { - Toast.makeText(this, "onError" + verificationError.getErrorMessage(), Toast.LENGTH_SHORT).show(); + Toast.makeText(this, verificationError.getErrorMessage(), Toast.LENGTH_SHORT).show(); } @Override diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java index 449bd4c8d8..6cec116461 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java @@ -79,7 +79,7 @@ public class SelectLanguageActivity extends AppCompatActivity implements @Override public void onError(VerificationError verificationError) { - Toast.makeText(this, "onError" + verificationError.getErrorMessage(), Toast.LENGTH_SHORT).show(); + Toast.makeText(this, "SelectLanguageActivity: " + verificationError.getErrorMessage(), Toast.LENGTH_SHORT).show(); } @Override diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageFragment.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageFragment.java index d4ea75e1d1..eaf75a308f 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageFragment.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageFragment.java @@ -56,6 +56,8 @@ public final class SelectLanguageFragment extends Fragment implements BlockingSt private static String languageID = null; private ArrayList languageList = null; private ArrayList addKeyboardsList = null; + private String title_no_install = null; + private TextView textView; private File packagePath; private OnLanguagesSelectedListener callback; @@ -110,7 +112,7 @@ public final class SelectLanguageFragment extends Fragment implements BlockingSt final String keyboardID = keyboard.getKeyboardID(); final String keyboardName = keyboard.getKeyboardName(); String title_install = String.format(getString(R.string.title_select_languages_for_package), keyboardName); - String title_no_install = getString(R.string.all_languages_installed); + title_no_install = getString(R.string.all_languages_installed); final Toolbar toolbar = v.findViewById(R.id.list_toolbar); ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar); @@ -132,7 +134,7 @@ public final class SelectLanguageFragment extends Fragment implements BlockingSt } } - final TextView textView = v.findViewById(R.id.bar_title); + textView = v.findViewById(R.id.bar_title); textView.setText(title_no_install); if (titleFont != null) { textView.setTypeface(titleFont, Typeface.BOLD); @@ -218,12 +220,41 @@ public final class SelectLanguageFragment extends Fragment implements BlockingSt addKeyboardsList.add(k); } } + + // Disable install button if no languages selected or all languages already installed + checkLanguages(); } }); return v; } + /** + * Validates a language has been selected in the "Select Language" step. + * @return VerificationError + */ + public VerificationError checkLanguages() { + StepperLayout mStepperLayout = (StepperLayout) getActivity().findViewById(R.id.stepperLayout); + + // Only applies if stepper is in "Select Language" step + if ((isInstallingPackage && mStepperLayout.getCurrentStepPosition() == 1) || + (!isInstallingPackage && mStepperLayout.getCurrentStepPosition() == 0)) { + if (languageList.size() == 0 && addKeyboardsList.size() == 0) { + mStepperLayout.setNextButtonVerificationFailed(true); + return new VerificationError("No languages selected"); + } else if (textView.getText().equals(title_no_install)) { + mStepperLayout.setNextButtonVerificationFailed(true); + return new VerificationError("All languages already installed"); + } else { + mStepperLayout.setNextButtonVerificationFailed(false); + } + } else { + mStepperLayout.setNextButtonVerificationFailed(false); + } + + return null; + } + @Override public void onNextClicked(final StepperLayout.OnNextClickedCallback callback) { // Send data to calling Activity @@ -254,13 +285,16 @@ public final class SelectLanguageFragment extends Fragment implements BlockingSt } @Override public VerificationError verifyStep() { - return null; + return checkLanguages(); } + @Override public void onSelected() { + checkLanguages(); } @Override public void onError(@NonNull VerificationError error) { + // do nothing } } diff --git a/android/KMAPro/kMAPro/src/main/res/color/ms_custom_button_text_color.xml b/android/KMAPro/kMAPro/src/main/res/color/ms_custom_button_text_color.xml new file mode 100644 index 0000000000..b11bc35da0 --- /dev/null +++ b/android/KMAPro/kMAPro/src/main/res/color/ms_custom_button_text_color.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/android/KMAPro/kMAPro/src/main/res/layout/activity_package_installer.xml b/android/KMAPro/kMAPro/src/main/res/layout/activity_package_installer.xml index aeab3be828..a46115c1cc 100644 --- a/android/KMAPro/kMAPro/src/main/res/layout/activity_package_installer.xml +++ b/android/KMAPro/kMAPro/src/main/res/layout/activity_package_installer.xml @@ -19,7 +19,7 @@ app:ms_showBackButtonOnFirstStep="true" app:ms_backButtonColor="@color/keyman_blue" app:ms_backButtonText="@string/label_back" - app:ms_nextButtonColor="@color/keyman_blue" + app:ms_nextButtonColor="@color/ms_custom_button_text_color" app:ms_nextButtonText="@string/label_next" app:ms_completeButtonColor="@color/keyman_blue" app:ms_completeButtonText="@string/label_ok" diff --git a/android/KMAPro/kMAPro/src/main/res/layout/bottom_navigation_layout.xml b/android/KMAPro/kMAPro/src/main/res/layout/bottom_navigation_layout.xml deleted file mode 100644 index 448846453f..0000000000 --- a/android/KMAPro/kMAPro/src/main/res/layout/bottom_navigation_layout.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - From df7e3a0796f5fcd76df25631c61802c2c1abcd67 Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Thu, 3 Sep 2020 15:03:18 +0700 Subject: [PATCH 2/3] fix(android): Try to disable for SelectLanguageActivity --- .../kmapro/SelectLanguageActivity.java | 3 ++- .../kmapro/SelectLanguageFragment.java | 16 +++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java index 6cec116461..41ee06c7f9 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java @@ -79,7 +79,8 @@ public class SelectLanguageActivity extends AppCompatActivity implements @Override public void onError(VerificationError verificationError) { - Toast.makeText(this, "SelectLanguageActivity: " + verificationError.getErrorMessage(), Toast.LENGTH_SHORT).show(); + String msg = TAG + ": " + verificationError.getErrorMessage(); + Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } @Override diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageFragment.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageFragment.java index eaf75a308f..2c572846cb 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageFragment.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageFragment.java @@ -23,7 +23,6 @@ import androidx.fragment.app.Fragment; import com.stepstone.stepper.BlockingStep; import com.stepstone.stepper.StepperLayout; import com.stepstone.stepper.VerificationError; -import com.tavultesoft.kmea.KMManager; import com.tavultesoft.kmea.data.Keyboard; import com.tavultesoft.kmea.data.KeyboardController; import com.tavultesoft.kmea.packages.PackageProcessor; @@ -231,6 +230,7 @@ public final class SelectLanguageFragment extends Fragment implements BlockingSt /** * Validates a language has been selected in the "Select Language" step. + * Also enables/disables "NEXT" button accordingly. * @return VerificationError */ public VerificationError checkLanguages() { @@ -239,12 +239,13 @@ public final class SelectLanguageFragment extends Fragment implements BlockingSt // Only applies if stepper is in "Select Language" step if ((isInstallingPackage && mStepperLayout.getCurrentStepPosition() == 1) || (!isInstallingPackage && mStepperLayout.getCurrentStepPosition() == 0)) { - if (languageList.size() == 0 && addKeyboardsList.size() == 0) { - mStepperLayout.setNextButtonVerificationFailed(true); - return new VerificationError("No languages selected"); - } else if (textView.getText().equals(title_no_install)) { + // Two scenarios to disable "NEXT" button + if (title_no_install != null && textView.getText().equals(title_no_install)) { mStepperLayout.setNextButtonVerificationFailed(true); return new VerificationError("All languages already installed"); + } else if (languageList.size() == 0 && addKeyboardsList.size() == 0) { + mStepperLayout.setNextButtonVerificationFailed(true); + return new VerificationError("No languages selected"); } else { mStepperLayout.setNextButtonVerificationFailed(false); } @@ -282,6 +283,10 @@ public final class SelectLanguageFragment extends Fragment implements BlockingSt @Override public void onBackClicked(StepperLayout.OnBackClickedCallback callback) { callback.goToPrevStep(); + + // Re-enable "NEXT" button + StepperLayout mStepperLayout = (StepperLayout) getActivity().findViewById(R.id.stepperLayout); + mStepperLayout.setNextButtonVerificationFailed(false); } @Override public VerificationError verifyStep() { @@ -292,6 +297,7 @@ public final class SelectLanguageFragment extends Fragment implements BlockingSt public void onSelected() { checkLanguages(); } + @Override public void onError(@NonNull VerificationError error) { // do nothing From b2c4d0407a520d640f518b7a0764357702846583 Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Tue, 8 Sep 2020 15:09:38 +0700 Subject: [PATCH 3/3] fix(android/app): Pass keyboard to StepperAdapter Pass keyboard so SelectLanguageFragment can display correct keyboard info --- .../java/com/tavultesoft/kmapro/PackageActivity.java | 2 +- .../tavultesoft/kmapro/SelectLanguageActivity.java | 5 ++--- .../tavultesoft/kmapro/SelectLanguageFragment.java | 8 ++------ .../java/com/tavultesoft/kmapro/StepperAdapter.java | 11 +++++++++++ 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/PackageActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/PackageActivity.java index 50f2832b59..0cb115a33f 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/PackageActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/PackageActivity.java @@ -120,7 +120,7 @@ public class PackageActivity extends AppCompatActivity implements boolean isInstallingPackage = true; mStepperLayout = (StepperLayout) findViewById(R.id.stepperLayout); mStepperAdapter = new StepperAdapter(getSupportFragmentManager(), this, - isInstallingPackage, tempPackagePath, pkgTarget, pkgId, pkgName, hasWelcome, languageID, languageCount); + isInstallingPackage, tempPackagePath, pkgTarget, pkgId, pkgName, null, hasWelcome, languageID, languageCount); mStepperLayout.setAdapter(mStepperAdapter); mStepperLayout.setListener(this); } diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java index 41ee06c7f9..804dc43c35 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java @@ -66,7 +66,7 @@ public class SelectLanguageActivity extends AppCompatActivity implements mStepperLayout = (StepperLayout) findViewById(R.id.stepperLayout); mStepperAdapter = new StepperAdapter(getSupportFragmentManager(), this, - isInstallingPackage, packagePath, pkgTarget, packageID, pkgName, hasWelcome); + isInstallingPackage, packagePath, pkgTarget, packageID, pkgName, keyboard, hasWelcome); mStepperLayout.setAdapter(mStepperAdapter); mStepperLayout.setListener(this); @@ -79,8 +79,7 @@ public class SelectLanguageActivity extends AppCompatActivity implements @Override public void onError(VerificationError verificationError) { - String msg = TAG + ": " + verificationError.getErrorMessage(); - Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); + Toast.makeText(this, verificationError.getErrorMessage(), Toast.LENGTH_SHORT).show(); } @Override diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageFragment.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageFragment.java index 2c572846cb..0896c054ca 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageFragment.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageFragment.java @@ -53,8 +53,8 @@ public final class SelectLanguageFragment extends Fragment implements BlockingSt private static final boolean excludeInstalledLanguages = false; private static String packageID = null; private static String languageID = null; - private ArrayList languageList = null; - private ArrayList addKeyboardsList = null; + private ArrayList languageList = new ArrayList(); + private ArrayList addKeyboardsList = new ArrayList(); private String title_no_install = null; private TextView textView; private File packagePath; @@ -98,8 +98,6 @@ public final class SelectLanguageFragment extends Fragment implements BlockingSt packagePath = (File)bundle.getSerializable("packagePath"); packageID = bundle.getString("packageID"); languageID = bundle.getString("languageID"); - // Initialize the list of selected languages - languageList = new ArrayList(); JSONObject pkgInfo = kmpProcessor.loadPackageInfo(packagePath); Keyboard keyboard = bundle.containsKey("keyboard") ? (Keyboard)bundle.getSerializable("keyboard") : @@ -139,8 +137,6 @@ public final class SelectLanguageFragment extends Fragment implements BlockingSt textView.setTypeface(titleFont, Typeface.BOLD); } - addKeyboardsList = new ArrayList(); - List availableKeyboardsList = kmpProcessor.getKeyboardList( pkgInfo, packageID, keyboardID, isInstallingPackage, excludeInstalledLanguages); int position = KeyboardController.INDEX_NOT_FOUND; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/StepperAdapter.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/StepperAdapter.java index 0b9a6e4afa..d6993ef35b 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/StepperAdapter.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/StepperAdapter.java @@ -47,11 +47,13 @@ public class StepperAdapter extends AbstractFragmentStepAdapter { * @param pkgTarget * @param packageID * @param pkgName + * @param keyboard * @param hasWelcome */ public StepperAdapter(FragmentManager fm, Context context, boolean isInstallingPackage, File tempPackagePath, String pkgTarget, String packageID, String pkgName, + Keyboard keyboard, boolean hasWelcome) { super(fm, context); this.isInstallingPackage = isInstallingPackage; @@ -59,6 +61,7 @@ public class StepperAdapter extends AbstractFragmentStepAdapter { this.pkgTarget = pkgTarget; this.packageID = packageID; this.pkgName = pkgName; + this.keyboard = keyboard; this.hasWelcome = hasWelcome; this.languageID = null; // not filled this.languageCount = 0; @@ -67,6 +70,7 @@ public class StepperAdapter extends AbstractFragmentStepAdapter { public StepperAdapter(FragmentManager fm, Context context, boolean isInstallingPackage, File tempPackagePath, String pkgTarget, String packageID, String pkgName, + Keyboard keyboard, boolean hasWelcome, String languageID, int languageCount) { super(fm, context); @@ -75,6 +79,7 @@ public class StepperAdapter extends AbstractFragmentStepAdapter { this.pkgTarget = pkgTarget; this.packageID = packageID; this.pkgName = pkgName; + this.keyboard = keyboard; this.hasWelcome = hasWelcome; this.languageID = languageID; this.languageCount = languageCount; @@ -95,6 +100,9 @@ public class StepperAdapter extends AbstractFragmentStepAdapter { b1.putSerializable("packagePath", tempPackagePath); b1.putString("packageID", packageID); b1.putString("languageID", languageID); + if (keyboard != null) { + b1.putSerializable("keyboard", keyboard); + } step1.setArguments(b1); return step1; } @@ -107,6 +115,9 @@ public class StepperAdapter extends AbstractFragmentStepAdapter { b2.putSerializable("packagePath", tempPackagePath); b2.putString("packageID", packageID); b2.putString("languageID", languageID); + if (keyboard != null) { + b2.putSerializable("keyboard", keyboard); + } step2.setArguments(b2); return step2; } else {