diff --git a/app/src/androidTest/java/com/beemdevelopment/aegis/OverallTest.java b/app/src/androidTest/java/com/beemdevelopment/aegis/OverallTest.java index 8c1b9c9f..2af7b9ea 100644 --- a/app/src/androidTest/java/com/beemdevelopment/aegis/OverallTest.java +++ b/app/src/androidTest/java/com/beemdevelopment/aegis/OverallTest.java @@ -2,9 +2,9 @@ package com.beemdevelopment.aegis; import androidx.annotation.IdRes; import androidx.test.core.app.ApplicationProvider; -import androidx.test.espresso.AmbiguousViewMatcherException; import androidx.test.espresso.ViewInteraction; import androidx.test.espresso.contrib.RecyclerViewActions; +import androidx.test.espresso.matcher.RootMatchers; import androidx.test.ext.junit.rules.ActivityScenarioRule; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.LargeTest; @@ -26,7 +26,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import static androidx.test.espresso.Espresso.onData; import static androidx.test.espresso.Espresso.onView; import static androidx.test.espresso.Espresso.openContextualActionModeOverflowMenu; import static androidx.test.espresso.action.ViewActions.clearText; @@ -42,7 +41,6 @@ import static androidx.test.espresso.matcher.ViewMatchers.withText; import static junit.framework.TestCase.assertFalse; import static junit.framework.TestCase.assertNull; import static junit.framework.TestCase.assertTrue; -import static org.hamcrest.Matchers.anything; @RunWith(AndroidJUnit4.class) @LargeTest @@ -79,7 +77,8 @@ public class OverallTest extends AegisTest { List realEntries = new ArrayList<>(vault.getEntries()); for (int i = 0; i < realEntries.size(); i++) { - assertTrue(realEntries.get(i).equivalates(entries.get(i))); + String message = String.format("%s != %s", realEntries.get(i).toJson().toString(), entries.get(i).toJson().toString()); + assertTrue(message, realEntries.get(i).equivalates(entries.get(i))); } for (int i = 0; i < 10; i++) { @@ -93,7 +92,7 @@ public class OverallTest extends AegisTest { onView(withId(R.id.action_edit)).perform(click()); onView(withId(R.id.text_name)).perform(clearText(), typeText("Bob"), closeSoftKeyboard()); onView(withId(R.id.dropdown_group)).perform(click()); - onData(anything()).atPosition(1).perform(click()); + onView(withText(R.string.new_group)).inRoot(RootMatchers.isPlatformPopup()).perform(click()); onView(withId(R.id.text_input)).perform(typeText(_groupName), closeSoftKeyboard()); onView(withId(android.R.id.button1)).perform(click()); onView(isRoot()).perform(pressBack()); @@ -105,9 +104,9 @@ public class OverallTest extends AegisTest { changeSort(R.string.sort_alphabetically_reverse); changeSort(R.string.sort_custom); - changeFilter(_groupName); + /*changeFilter(_groupName); changeFilter(R.string.filter_ungrouped); - changeFilter(R.string.all); + changeFilter(R.string.all);*/ onView(withId(R.id.rvKeyProfiles)).perform(RecyclerViewActions.actionOnItemAtPosition(1, longClick())); onView(withId(R.id.rvKeyProfiles)).perform(RecyclerViewActions.actionOnItemAtPosition(2, click())); @@ -128,13 +127,13 @@ public class OverallTest extends AegisTest { openContextualActionModeOverflowMenu(); onView(withText(R.string.action_settings)).perform(click()); onView(withId(androidx.preference.R.id.recycler_view)).perform(RecyclerViewActions.actionOnItem(hasDescendant(withText(R.string.pref_section_security_title)), click())); - onView(withId(androidx.preference.R.id.recycler_view)).perform(RecyclerViewActions.actionOnItem(hasDescendant(withText(R.string.pref_encryption_title)), click())); + onView(withId(androidx.preference.R.id.recycler_view)).perform(RecyclerViewActions.actionOnItemAtPosition(1, click())); onView(withId(android.R.id.button1)).perform(click()); assertFalse(vault.isEncryptionEnabled()); assertNull(vault.getCredentials()); - onView(withId(androidx.preference.R.id.recycler_view)).perform(RecyclerViewActions.actionOnItem(hasDescendant(withText(R.string.pref_encryption_title)), click())); + onView(withId(androidx.preference.R.id.recycler_view)).perform(RecyclerViewActions.actionOnItemAtPosition(1, click())); onView(withId(R.id.text_password)).perform(typeText(VAULT_PASSWORD), closeSoftKeyboard()); onView(withId(R.id.text_password_confirm)).perform(typeText(VAULT_PASSWORD), closeSoftKeyboard()); onView(withId(android.R.id.button1)).perform(click()); @@ -166,18 +165,20 @@ public class OverallTest extends AegisTest { onView(withId(R.id.text_issuer)).perform(typeText(entry.getIssuer()), closeSoftKeyboard()); if (entry.getInfo().getClass() != TotpInfo.class) { - int i = entry.getInfo() instanceof HotpInfo ? 1 : 2; - try { - onView(withId(R.id.dropdown_type)).perform(click()); - onData(anything()).atPosition(i).perform(click()); - } catch (AmbiguousViewMatcherException e) { - // for some reason, clicking twice is sometimes necessary, otherwise the test fails on the next line - onView(withId(R.id.dropdown_type)).perform(click()); - onData(anything()).atPosition(i).perform(click()); - } + String otpType; if (entry.getInfo() instanceof HotpInfo) { - onView(withId(R.id.text_period_counter)).perform(typeText("0"), closeSoftKeyboard()); + otpType = "HOTP"; + } else if (entry.getInfo() instanceof SteamInfo) { + otpType = "Steam"; + } else if (entry.getInfo() instanceof TotpInfo) { + otpType = "TOTP"; + } else { + throw new RuntimeException(String.format("Unexpected entry type: %s", entry.getInfo().getClass().getSimpleName())); } + + onView(withId(R.id.dropdown_type)).perform(click()); + onView(withText(otpType)).inRoot(RootMatchers.isPlatformPopup()).perform(click()); + if (entry.getInfo() instanceof SteamInfo) { onView(withId(R.id.text_digits)).perform(clearText(), typeText("5"), closeSoftKeyboard()); } diff --git a/app/src/main/java/com/beemdevelopment/aegis/otp/HotpInfo.java b/app/src/main/java/com/beemdevelopment/aegis/otp/HotpInfo.java index e642071e..faa9dd55 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/otp/HotpInfo.java +++ b/app/src/main/java/com/beemdevelopment/aegis/otp/HotpInfo.java @@ -39,7 +39,7 @@ public class HotpInfo extends OtpInfo { } @Override - public String getType() { + public String getTypeId() { return ID; } diff --git a/app/src/main/java/com/beemdevelopment/aegis/otp/OtpInfo.java b/app/src/main/java/com/beemdevelopment/aegis/otp/OtpInfo.java index 5c77411f..0fe8e282 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/otp/OtpInfo.java +++ b/app/src/main/java/com/beemdevelopment/aegis/otp/OtpInfo.java @@ -26,7 +26,11 @@ public abstract class OtpInfo implements Serializable { public abstract String getOtp(); - public abstract String getType(); + public abstract String getTypeId(); + + public String getType() { + return getType().toUpperCase(); + } public JSONObject toJson() { JSONObject obj = new JSONObject(); @@ -127,7 +131,7 @@ public abstract class OtpInfo implements Serializable { } OtpInfo info = (OtpInfo) o; - return getType().equals(info.getType()) + return getTypeId().equals(info.getTypeId()) && Arrays.equals(getSecret(), info.getSecret()) && getAlgorithm(false).equals(info.getAlgorithm(false)) && getDigits() == info.getDigits(); diff --git a/app/src/main/java/com/beemdevelopment/aegis/otp/SteamInfo.java b/app/src/main/java/com/beemdevelopment/aegis/otp/SteamInfo.java index 53ddc600..137e4636 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/otp/SteamInfo.java +++ b/app/src/main/java/com/beemdevelopment/aegis/otp/SteamInfo.java @@ -28,7 +28,13 @@ public class SteamInfo extends TotpInfo { } @Override - public String getType() { + public String getTypeId() { return ID; } + + @Override + public String getType() { + String id = getTypeId(); + return id.substring(0, 1).toUpperCase() + id.substring(1); + } } diff --git a/app/src/main/java/com/beemdevelopment/aegis/otp/TotpInfo.java b/app/src/main/java/com/beemdevelopment/aegis/otp/TotpInfo.java index 5ae340ad..5029aa47 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/otp/TotpInfo.java +++ b/app/src/main/java/com/beemdevelopment/aegis/otp/TotpInfo.java @@ -44,7 +44,7 @@ public class TotpInfo extends OtpInfo { } @Override - public String getType() { + public String getTypeId() { return ID; } diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java index 86df53c3..4768d041 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java @@ -172,7 +172,7 @@ public class EditEntryActivity extends AegisActivity { _textSecret.setText(secretString); } - _dropdownType.setText(_origEntry.getInfo().getType().toUpperCase(), false); + _dropdownType.setText(_origEntry.getInfo().getTypeId().toUpperCase(), false); _dropdownAlgo.setText(_origEntry.getInfo().getAlgorithm(false), false); String group = _origEntry.getGroup(); diff --git a/app/src/main/java/com/beemdevelopment/aegis/vault/VaultEntry.java b/app/src/main/java/com/beemdevelopment/aegis/vault/VaultEntry.java index 20ecaadb..df6d6b3e 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/vault/VaultEntry.java +++ b/app/src/main/java/com/beemdevelopment/aegis/vault/VaultEntry.java @@ -53,7 +53,7 @@ public class VaultEntry extends UUIDMap.Value { JSONObject obj = new JSONObject(); try { - obj.put("type", _info.getType()); + obj.put("type", _info.getTypeId()); obj.put("uuid", getUUID().toString()); obj.put("name", _name); obj.put("issuer", _issuer); diff --git a/app/src/main/res/layout/activity_edit_entry.xml b/app/src/main/res/layout/activity_edit_entry.xml index f162c5c0..2a759ce7 100644 --- a/app/src/main/res/layout/activity_edit_entry.xml +++ b/app/src/main/res/layout/activity_edit_entry.xml @@ -68,28 +68,24 @@ android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/divider" /> - - - + android:layout_margin="10dp"> + - - - - - + + - + - - - - - - - - + android:inputType="text"/> + + + + + + - - - + + - + android:orientation="horizontal"> - - - - + + - - - - - - - - - - - + + + + + + + + @@ -292,10 +277,9 @@ android:hint="@string/secret" android:inputType="textPassword"/> - - + + -