Removes dead code and cleans up annotations Nullable/NonNull annotations.

This commit is contained in:
2021-07-05 22:41:49 -07:00
parent bf6220b339
commit 35659810f9
62 changed files with 290 additions and 255 deletions

43
.idea/misc.xml generated
View File

@@ -1,5 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="NullableNotNullManager">
<option name="myDefaultNullable" value="androidx.annotation.Nullable" />
<option name="myDefaultNotNull" value="androidx.annotation.NonNull" />
<option name="myNullables">
<value>
<list size="14">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
<item index="1" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
<item index="2" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
<item index="3" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
<item index="4" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
<item index="5" class="java.lang.String" itemvalue="com.android.annotations.Nullable" />
<item index="6" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
<item index="7" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
<item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
<item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
<item index="10" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
<item index="11" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.Nullable" />
<item index="12" class="java.lang.String" itemvalue="io.reactivex.annotations.Nullable" />
<item index="13" class="java.lang.String" itemvalue="io.reactivex.rxjava3.annotations.Nullable" />
</list>
</value>
</option>
<option name="myNotNulls">
<value>
<list size="13">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
<item index="1" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
<item index="2" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
<item index="3" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
<item index="4" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
<item index="5" class="java.lang.String" itemvalue="com.android.annotations.NonNull" />
<item index="6" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
<item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
<item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
<item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
<item index="10" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.NonNull" />
<item index="11" class="java.lang.String" itemvalue="io.reactivex.annotations.NonNull" />
<item index="12" class="java.lang.String" itemvalue="io.reactivex.rxjava3.annotations.NonNull" />
</list>
</value>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>

View File

@@ -6,6 +6,7 @@ import android.os.Bundle;
import android.view.MenuItem; import android.view.MenuItem;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController; import androidx.navigation.NavController;
import androidx.navigation.NavDirections; import androidx.navigation.NavDirections;
@@ -54,9 +55,7 @@ public class MainActivity extends AppCompatActivity {
.build(); .build();
NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment); NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
NavController navController = navHostFragment.getNavController(); NavController navController = navHostFragment.getNavController();
navController.addOnDestinationChangedListener((controller, destination, arguments) -> { navController.addOnDestinationChangedListener(FlipperInitializer::sendNavigationEvent);
FlipperInitializer.sendNavigationEvent(controller, destination, arguments);
});
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration); NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
NavigationUI.setupWithNavController(navView, navController); NavigationUI.setupWithNavController(navView, navController);
onNewIntent(getIntent()); onNewIntent(getIntent());
@@ -68,14 +67,15 @@ public class MainActivity extends AppCompatActivity {
String json = readMonsterJSONFromIntent(intent); String json = readMonsterJSONFromIntent(intent);
if (!StringHelper.isNullOrEmpty(json)) { if (!StringHelper.isNullOrEmpty(json)) {
NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment); NavHostFragment navHostFragment = Objects.requireNonNull((NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment));
NavController navController = navHostFragment.getNavController(); NavController navController = navHostFragment.getNavController();
NavDirections action = MobileNavigationDirections.actionGlobalMonsterImportFragment(json); NavDirections action = MobileNavigationDirections.actionGlobalMonsterImportFragment(json);
navController.navigate(action); navController.navigate(action);
} }
} }
private String readMonsterJSONFromIntent(Intent intent) { @Nullable
private String readMonsterJSONFromIntent(@NonNull Intent intent) {
String action = intent.getAction(); String action = intent.getAction();
Bundle extras = intent.getExtras(); Bundle extras = intent.getExtras();
String type = intent.getType(); String type = intent.getType();
@@ -86,7 +86,7 @@ public class MainActivity extends AppCompatActivity {
} else if ("android.intent.action.VIEW".equals(action) && ("text/plain".equals(type) || "application/octet-stream".equals(type))) { } else if ("android.intent.action.VIEW".equals(action) && ("text/plain".equals(type) || "application/octet-stream".equals(type))) {
uri = intent.getData(); uri = intent.getData();
} else { } else {
Logger.logError(String.format("unexpected launch configuration action: %s, type: %s, uri: %s", action, type, uri)); Logger.logError(String.format("unexpected launch configuration action: %s, type: %s", action, type));
} }
if (uri == null) { if (uri == null) {
return null; return null;
@@ -98,6 +98,7 @@ public class MainActivity extends AppCompatActivity {
return json; return json;
} }
@Nullable
private String readContentsOfUri(Uri uri) { private String readContentsOfUri(Uri uri) {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
try (InputStream inputStream = try (InputStream inputStream =

View File

@@ -1,5 +1,7 @@
package com.majinnaibu.monstercards.data; package com.majinnaibu.monstercards.data;
import androidx.annotation.NonNull;
import com.majinnaibu.monstercards.data.enums.AbilityScore; import com.majinnaibu.monstercards.data.enums.AbilityScore;
import com.majinnaibu.monstercards.data.enums.AdvantageType; import com.majinnaibu.monstercards.data.enums.AdvantageType;
import com.majinnaibu.monstercards.data.enums.ArmorType; import com.majinnaibu.monstercards.data.enums.ArmorType;
@@ -12,6 +14,7 @@ import com.majinnaibu.monstercards.models.Trait;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public final class DevContent { public final class DevContent {
@NonNull
public static Monster createSampleMonster() { public static Monster createSampleMonster() {
Monster monster = new Monster(); Monster monster = new Monster();
// Name // Name

View File

@@ -47,7 +47,7 @@ public class MonsterRepository {
.observeOn(AndroidSchedulers.mainThread()); .observeOn(AndroidSchedulers.mainThread());
} }
public Flowable<Monster> getMonster(UUID monsterId) { public Flowable<Monster> getMonster(@NonNull UUID monsterId) {
return m_db.monsterDAO() return m_db.monsterDAO()
.loadAllByIds(new String[]{monsterId.toString()}) .loadAllByIds(new String[]{monsterId.toString()})
.map( .map(

View File

@@ -1,5 +1,6 @@
package com.majinnaibu.monstercards.data.converters; package com.majinnaibu.monstercards.data.converters;
import androidx.annotation.NonNull;
import androidx.room.TypeConverter; import androidx.room.TypeConverter;
import com.majinnaibu.monstercards.data.enums.ArmorType; import com.majinnaibu.monstercards.data.enums.ArmorType;
@@ -7,7 +8,7 @@ import com.majinnaibu.monstercards.data.enums.ArmorType;
public class ArmorTypeConverter { public class ArmorTypeConverter {
@TypeConverter @TypeConverter
public static String fromArmorType(ArmorType armorType) { public static String fromArmorType(@NonNull ArmorType armorType) {
return armorType.stringValue; return armorType.stringValue;
} }

View File

@@ -1,5 +1,6 @@
package com.majinnaibu.monstercards.data.converters; package com.majinnaibu.monstercards.data.converters;
import androidx.annotation.NonNull;
import androidx.room.TypeConverter; import androidx.room.TypeConverter;
import com.majinnaibu.monstercards.data.enums.ChallengeRating; import com.majinnaibu.monstercards.data.enums.ChallengeRating;
@@ -7,7 +8,7 @@ import com.majinnaibu.monstercards.data.enums.ChallengeRating;
public class ChallengeRatingConverter { public class ChallengeRatingConverter {
@TypeConverter @TypeConverter
public static String fromChallengeRating(ChallengeRating challengeRating) { public static String fromChallengeRating(@NonNull ChallengeRating challengeRating) {
return challengeRating.stringValue; return challengeRating.stringValue;
} }

View File

@@ -1,13 +1,15 @@
package com.majinnaibu.monstercards.data.converters; package com.majinnaibu.monstercards.data.converters;
import androidx.annotation.NonNull;
import androidx.room.TypeConverter; import androidx.room.TypeConverter;
import java.util.UUID; import java.util.UUID;
public class UUIDConverter { public class UUIDConverter {
@NonNull
@TypeConverter @TypeConverter
public static String fromUUID(UUID uuid) { public static String fromUUID(@NonNull UUID uuid) {
return uuid.toString(); return uuid.toString();
} }

View File

@@ -5,7 +5,7 @@ public enum AbilityScore {
STRENGTH("strength", "Strength", "STR"), STRENGTH("strength", "Strength", "STR"),
DEXTERITY("dexterity", "Dexterity", "DEX"), DEXTERITY("dexterity", "Dexterity", "DEX"),
CONSTITUTION("constitution", "Constitution", "CON"), CONSTITUTION("constitution", "Constitution", "CON"),
INTELLIGENCE("intellligence", "Intelligence", "INT"), INTELLIGENCE("intelligence", "Intelligence", "INT"),
WISDOM("wisdom", "Wisdom", "WIS"), WISDOM("wisdom", "Wisdom", "WIS"),
CHARISMA("charisma", "Charisma", "CHA"), CHARISMA("charisma", "Charisma", "CHA"),
; ;

View File

@@ -3,7 +3,7 @@ package com.majinnaibu.monstercards.data.enums;
public enum ProficiencyType { public enum ProficiencyType {
NONE("none", "None", ""), NONE("none", "None", ""),
PROFICIENT("proficient", "Proficient", "P"), PROFICIENT("proficient", "Proficient", "P"),
EXPERTISE("experties", "Expertise", "Ex"), EXPERTISE("expertise", "Expertise", "Ex"),
; ;
public final String displayName; public final String displayName;

View File

@@ -1,9 +1,11 @@
package com.majinnaibu.monstercards.helpers; package com.majinnaibu.monstercards.helpers;
import androidx.annotation.NonNull;
import java.util.Objects; import java.util.Objects;
public final class ArrayHelper { public final class ArrayHelper {
public static int indexOf(Object[] array, Object target) { public static int indexOf(@NonNull Object[] array, Object target) {
for (int index = 0; index < array.length; index++) { for (int index = 0; index < array.length; index++) {
if (Objects.equals(array[index], target)) { if (Objects.equals(array[index], target)) {
return index; return index;

View File

@@ -4,9 +4,6 @@ import org.commonmark.node.Document;
import org.commonmark.node.Node; import org.commonmark.node.Node;
import org.commonmark.node.Paragraph; import org.commonmark.node.Paragraph;
import org.commonmark.parser.Parser; import org.commonmark.parser.Parser;
import org.commonmark.renderer.NodeRenderer;
import org.commonmark.renderer.html.HtmlNodeRendererContext;
import org.commonmark.renderer.html.HtmlNodeRendererFactory;
import org.commonmark.renderer.html.HtmlRenderer; import org.commonmark.renderer.html.HtmlRenderer;
public final class CommonMarkHelper { public final class CommonMarkHelper {
@@ -27,12 +24,4 @@ public final class CommonMarkHelper {
HtmlRenderer renderer = HtmlRenderer.builder().build(); HtmlRenderer renderer = HtmlRenderer.builder().build();
return renderer.render(document); return renderer.render(document);
} }
private static final class MyNodeRendererFactory implements HtmlNodeRendererFactory {
@Override
public NodeRenderer create(HtmlNodeRendererContext context) {
return null;
}
}
} }

View File

@@ -1,5 +1,7 @@
package com.majinnaibu.monstercards.helpers; package com.majinnaibu.monstercards.helpers;
import androidx.annotation.NonNull;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
@@ -15,17 +17,16 @@ import com.majinnaibu.monstercards.models.Monster;
import com.majinnaibu.monstercards.models.Skill; import com.majinnaibu.monstercards.models.Skill;
import com.majinnaibu.monstercards.models.Trait; import com.majinnaibu.monstercards.models.Trait;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Set; import java.util.Set;
public class MonsterImportHelper { public class MonsterImportHelper {
@NonNull
public static Monster fromJSON(String json) { public static Monster fromJSON(String json) {
JsonParser parser = new JsonParser(); JsonObject rootDict = JsonParser.parseString(json).getAsJsonObject();
JsonObject rootDict = parser.parse(json).getAsJsonObject();
Monster monster = new Monster(); Monster monster = new Monster();
monster.name = Helpers.getString(rootDict, "name"); monster.name = Helpers.getString(rootDict, "name");
@@ -110,7 +111,7 @@ public class MonsterImportHelper {
return getString(dict, name, ""); return getString(dict, name, "");
} }
public static String getString(@NotNull JsonObject dict, String name, String defaultValue) { public static String getString(@NonNull JsonObject dict, String name, String defaultValue) {
if (dict.has(name)) { if (dict.has(name)) {
return dict.get(name).getAsString(); return dict.get(name).getAsString();
} }
@@ -122,13 +123,19 @@ public class MonsterImportHelper {
return getInt(dict, name, 0); return getInt(dict, name, 0);
} }
public static int getInt(@NotNull JsonObject dict, String name, int defaultValue) { public static int getInt(@NonNull JsonObject dict, String name, int defaultValue) {
if (dict.has(name)) { if (dict.has(name)) {
JsonElement element = dict.get(name); JsonElement element = dict.get(name);
if (element.isJsonPrimitive()) { if (element.isJsonPrimitive()) {
JsonPrimitive rawValue = element.getAsJsonPrimitive();//dict.getAsJsonPrimitive(name); JsonPrimitive rawValue = element.getAsJsonPrimitive();
if (rawValue.isNumber()) { if (rawValue.isNumber()) {
return rawValue.getAsInt(); return rawValue.getAsInt();
} else {
try {
return rawValue.getAsInt();
} catch (Exception ex) {
return defaultValue;
}
} }
} }
} }
@@ -139,22 +146,29 @@ public class MonsterImportHelper {
return getBool(dict, name, false); return getBool(dict, name, false);
} }
public static boolean getBool(@NotNull JsonObject dict, String name, boolean defaultValue) { public static boolean getBool(@NonNull JsonObject dict, String name, boolean defaultValue) {
if (dict.has(name)) { if (dict.has(name)) {
JsonElement element = dict.get(name); JsonElement element = dict.get(name);
if (element.isJsonPrimitive()) { if (element.isJsonPrimitive()) {
JsonPrimitive rawValue = element.getAsJsonPrimitive(); JsonPrimitive rawValue = element.getAsJsonPrimitive();
if (rawValue.isBoolean()) { if (rawValue.isBoolean()) {
return rawValue.getAsBoolean(); return rawValue.getAsBoolean();
} else {
try {
return rawValue.getAsBoolean();
} catch (Exception ex) {
return defaultValue;
}
} }
} }
} }
return defaultValue; return defaultValue;
} }
@NotNull @NonNull
public static String formatDistance(String name, int distance) { public static String formatDistance(String name, int distance) {
return String.format("%s %d ft.", name, distance); // TODO: consider moving this to a string resource so it can be localized
return String.format(Locale.getDefault(), "%s %d ft.", name, distance);
} }
public static void addSense(Monster monster, JsonObject root, String name) { public static void addSense(Monster monster, JsonObject root, String name) {
@@ -164,8 +178,8 @@ public class MonsterImportHelper {
} }
} }
@NotNull @NonNull
public static List<Trait> getListOfTraits(@NotNull JsonObject dict, String name) { public static List<Trait> getListOfTraits(@NonNull JsonObject dict, String name) {
ArrayList<Trait> traits = new ArrayList<>(); ArrayList<Trait> traits = new ArrayList<>();
if (dict.has(name)) { if (dict.has(name)) {
JsonElement arrayElement = dict.get(name); JsonElement arrayElement = dict.get(name);
@@ -187,7 +201,7 @@ public class MonsterImportHelper {
return traits; return traits;
} }
public static void addSavingThrows(Monster monster, JsonObject root) { public static void addSavingThrows(Monster monster, @NonNull JsonObject root) {
if (root.has("sthrows")) { if (root.has("sthrows")) {
JsonElement arrayElement = root.get("sthrows"); JsonElement arrayElement = root.get("sthrows");
if (arrayElement.isJsonArray()) { if (arrayElement.isJsonArray()) {
@@ -217,7 +231,8 @@ public class MonsterImportHelper {
} }
} }
public static Set<Skill> getSetOfSkills(JsonObject root) { @NonNull
public static Set<Skill> getSetOfSkills(@NonNull JsonObject root) {
HashSet<Skill> skills = new HashSet<>(); HashSet<Skill> skills = new HashSet<>();
if (root.has("skills")) { if (root.has("skills")) {
JsonElement arrayElement = root.get("skills"); JsonElement arrayElement = root.get("skills");
@@ -241,11 +256,13 @@ public class MonsterImportHelper {
return skills; return skills;
} }
@NonNull
public static Set<String> getSetOfDamageTypes(JsonObject rootDict, String name) { public static Set<String> getSetOfDamageTypes(JsonObject rootDict, String name) {
return getSetOfDamageTypes(rootDict, name, null); return getSetOfDamageTypes(rootDict, name, null);
} }
public static Set<String> getSetOfDamageTypes(JsonObject root, String name, String type) { @NonNull
public static Set<String> getSetOfDamageTypes(@NonNull JsonObject root, String name, String type) {
HashSet<String> damageTypes = new HashSet<>(); HashSet<String> damageTypes = new HashSet<>();
if (root.has(name)) { if (root.has(name)) {
JsonElement arrayElement = root.get(name); JsonElement arrayElement = root.get(name);
@@ -268,7 +285,8 @@ public class MonsterImportHelper {
return damageTypes; return damageTypes;
} }
public static Set<Language> getSetOfLanguages(JsonObject root, String name) { @NonNull
public static Set<Language> getSetOfLanguages(@NonNull JsonObject root, String name) {
HashSet<Language> languages = new HashSet<>(); HashSet<Language> languages = new HashSet<>();
if (root.has(name)) { if (root.has(name)) {
JsonElement arrayElement = root.get(name); JsonElement arrayElement = root.get(name);

View File

@@ -1,5 +1,8 @@
package com.majinnaibu.monstercards.helpers; package com.majinnaibu.monstercards.helpers;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.Collection; import java.util.Collection;
@SuppressWarnings({"RedundantIfStatement"}) @SuppressWarnings({"RedundantIfStatement"})
@@ -16,7 +19,8 @@ public final class StringHelper {
return false; return false;
} }
public static String join(String delimiter, Collection<String> strings) { @NonNull
public static String join(String delimiter, @NonNull Collection<String> strings) {
int length = strings.size(); int length = strings.size();
if (length < 1) { if (length < 1) {
return ""; return "";
@@ -36,7 +40,7 @@ public final class StringHelper {
} }
} }
public static String oxfordJoin(String delimiter, String lastDelimiter, String onlyDelimiter, Collection<String> strings) { public static String oxfordJoin(String delimiter, String lastDelimiter, String onlyDelimiter, @NonNull Collection<String> strings) {
int length = strings.size(); int length = strings.size();
if (length < 1) { if (length < 1) {
return ""; return "";
@@ -59,6 +63,7 @@ public final class StringHelper {
} }
} }
@Nullable
public static Integer parseInt(String s) { public static Integer parseInt(String s) {
try { try {
return Integer.parseInt(s); return Integer.parseInt(s);
@@ -67,7 +72,7 @@ public final class StringHelper {
} }
} }
public static boolean containsCaseInsensitive(String text, String search) { public static boolean containsCaseInsensitive(@NonNull String text, @NonNull String search) {
// TODO: find a locale independent way to do this // TODO: find a locale independent way to do this
return text.toLowerCase().contains(search.toLowerCase()); return text.toLowerCase().contains(search.toLowerCase());
} }

View File

@@ -1,5 +1,6 @@
package com.majinnaibu.monstercards.models; package com.majinnaibu.monstercards.models;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import java.util.Comparator; import java.util.Comparator;
@@ -43,7 +44,7 @@ public class Language implements Comparator<Language>, Comparable<Language> {
} }
@Override @Override
public int compare(Language o1, Language o2) { public int compare(@NonNull Language o1, Language o2) {
if (o1.mSpeaks && !o2.mSpeaks) { if (o1.mSpeaks && !o2.mSpeaks) {
return -1; return -1;
} }
@@ -54,7 +55,7 @@ public class Language implements Comparator<Language>, Comparable<Language> {
} }
@Override @Override
public boolean equals(@Nullable @org.jetbrains.annotations.Nullable Object obj) { public boolean equals(@Nullable Object obj) {
if (obj == null) { if (obj == null) {
return false; return false;
} }

View File

@@ -16,8 +16,6 @@ import com.majinnaibu.monstercards.data.enums.ProficiencyType;
import com.majinnaibu.monstercards.helpers.StringHelper; import com.majinnaibu.monstercards.helpers.StringHelper;
import com.majinnaibu.monstercards.utils.Logger; import com.majinnaibu.monstercards.utils.Logger;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
@@ -306,7 +304,7 @@ public class Monster {
return sb.toString(); return sb.toString();
} }
public int getAbilityScore(@NotNull AbilityScore abilityScore) { public int getAbilityScore(@NonNull AbilityScore abilityScore) {
switch (abilityScore) { switch (abilityScore) {
case STRENGTH: case STRENGTH:
return strengthScore; return strengthScore;
@@ -325,7 +323,7 @@ public class Monster {
} }
} }
public int getAbilityModifier(@NotNull AbilityScore abilityScore) { public int getAbilityModifier(@NonNull AbilityScore abilityScore) {
switch (abilityScore) { switch (abilityScore) {
case STRENGTH: case STRENGTH:
return getStrengthModifier(); return getStrengthModifier();
@@ -344,7 +342,7 @@ public class Monster {
} }
} }
public AdvantageType getSavingThrowAdvantageType(@NotNull AbilityScore abilityScore) { public AdvantageType getSavingThrowAdvantageType(@NonNull AbilityScore abilityScore) {
switch (abilityScore) { switch (abilityScore) {
case STRENGTH: case STRENGTH:
return strengthSavingThrowAdvantage; return strengthSavingThrowAdvantage;
@@ -363,7 +361,7 @@ public class Monster {
} }
} }
public ProficiencyType getSavingThrowProficiencyType(@NotNull AbilityScore abilityScore) { public ProficiencyType getSavingThrowProficiencyType(@NonNull AbilityScore abilityScore) {
switch (abilityScore) { switch (abilityScore) {
case STRENGTH: case STRENGTH:
return strengthSavingThrowProficiency; return strengthSavingThrowProficiency;
@@ -609,7 +607,7 @@ public class Monster {
} }
} }
public int getProficiencyBonus(@NotNull ProficiencyType proficiencyType) { public int getProficiencyBonus(@NonNull ProficiencyType proficiencyType) {
switch (proficiencyType) { switch (proficiencyType) {
case PROFICIENT: case PROFICIENT:
return getProficiencyBonus(); return getProficiencyBonus();
@@ -753,7 +751,7 @@ public class Monster {
return abilityDescriptions; return abilityDescriptions;
} }
public String getPlaceholderReplacedText(@NotNull String rawText) { public String getPlaceholderReplacedText(@NonNull String rawText) {
return rawText return rawText
.replaceAll("\\[STR SAVE]", String.format("%+d", getSpellSaveDC(AbilityScore.STRENGTH))) .replaceAll("\\[STR SAVE]", String.format("%+d", getSpellSaveDC(AbilityScore.STRENGTH)))
.replaceAll("\\[STR ATK]", String.format("%+d", getAttackBonus(AbilityScore.STRENGTH))) .replaceAll("\\[STR ATK]", String.format("%+d", getAttackBonus(AbilityScore.STRENGTH)))
@@ -818,7 +816,7 @@ public class Monster {
} }
@Override @Override
public boolean equals(@Nullable @org.jetbrains.annotations.Nullable Object obj) { public boolean equals(@Nullable Object obj) {
if (obj == null) { if (obj == null) {
return false; return false;
} }

View File

@@ -1,40 +0,0 @@
package com.majinnaibu.monstercards.models;
import java.util.Comparator;
public class SavingThrow implements Comparator<SavingThrow>, Comparable<SavingThrow> {
private String mName;
private int mOrder;
public SavingThrow(String name, int order) {
mName = name;
mOrder = order;
}
public String getName() {
return mName;
}
public void setName(String value) {
mName = value;
}
public int getOrder() {
return mOrder;
}
public void setOrder(int value) {
mOrder = value;
}
@Override
public int compareTo(SavingThrow o) {
return Integer.compare(this.getOrder(), o.getOrder());
}
@Override
public int compare(SavingThrow o1, SavingThrow o2) {
return o1.getOrder() - o2.getOrder();
}
}

View File

@@ -70,7 +70,7 @@ public class Skill implements Comparator<Skill>, Comparable<Skill> {
} }
@Override @Override
public boolean equals(@Nullable @org.jetbrains.annotations.Nullable Object obj) { public boolean equals(@Nullable Object obj) {
if (obj == null) { if (obj == null) {
return false; return false;
} }

View File

@@ -30,7 +30,7 @@ public class Trait implements Comparator<Trait>, Comparable<Trait> {
} }
@Override @Override
public boolean equals(@Nullable @org.jetbrains.annotations.Nullable Object obj) { public boolean equals(@Nullable Object obj) {
if (obj == null) { if (obj == null) {
return false; return false;
} }

View File

@@ -7,8 +7,6 @@ import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import com.majinnaibu.monstercards.R; import com.majinnaibu.monstercards.R;
@@ -23,12 +21,7 @@ public class CollectionsFragment extends MCFragment {
collectionsViewModel = new ViewModelProvider(this).get(CollectionsViewModel.class); collectionsViewModel = new ViewModelProvider(this).get(CollectionsViewModel.class);
View root = inflater.inflate(R.layout.fragment_collections, container, false); View root = inflater.inflate(R.layout.fragment_collections, container, false);
final TextView textView = root.findViewById(R.id.text_collections); final TextView textView = root.findViewById(R.id.text_collections);
collectionsViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() { collectionsViewModel.getText().observe(getViewLifecycleOwner(), textView::setText);
@Override
public void onChanged(@Nullable String s) {
textView.setText(s);
}
});
return root; return root;
} }
} }

View File

@@ -6,7 +6,7 @@ import androidx.lifecycle.ViewModel;
public class CollectionsViewModel extends ViewModel { public class CollectionsViewModel extends ViewModel {
private MutableLiveData<String> mText; private final MutableLiveData<String> mText;
public CollectionsViewModel() { public CollectionsViewModel() {
mText = new MutableLiveData<>(); mText = new MutableLiveData<>();

View File

@@ -35,11 +35,12 @@ public class AbilityScorePicker extends LinearLayout {
// TODO: use this as default but allow setting via attribute // TODO: use this as default but allow setting via attribute
mLabel = "Ability Score"; mLabel = "Ability Score";
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Stepper, 0, 0); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AbilityScorePicker, 0, 0);
String label = a.getString(R.styleable.Stepper_label); String label = a.getString(R.styleable.AbilityScorePicker_label);
if (label != null) { if (label != null) {
mLabel = label; mLabel = label;
} }
a.recycle();
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View root = inflater.inflate(R.layout.component_ability_score_picker, this, true); View root = inflater.inflate(R.layout.component_ability_score_picker, this, true);
@@ -124,7 +125,7 @@ public class AbilityScorePicker extends LinearLayout {
private final Spinner spinner; private final Spinner spinner;
private final TextView label; private final TextView label;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
spinner = root.findViewById(R.id.spinner); spinner = root.findViewById(R.id.spinner);
label = root.findViewById(R.id.label); label = root.findViewById(R.id.label);
} }

View File

@@ -88,7 +88,7 @@ public class AdvantagePicker extends ConstraintLayout {
final MaterialRadioButton advantage; final MaterialRadioButton advantage;
final MaterialRadioButton disadvantage; final MaterialRadioButton disadvantage;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
group = root.findViewById(R.id.group); group = root.findViewById(R.id.group);
none = root.findViewById(R.id.hasNoAdvantage); none = root.findViewById(R.id.hasNoAdvantage);
advantage = root.findViewById(R.id.hasAdvantage); advantage = root.findViewById(R.id.hasAdvantage);

View File

@@ -88,7 +88,7 @@ public class ProficiencyPicker extends ConstraintLayout {
final MaterialRadioButton proficient; final MaterialRadioButton proficient;
final MaterialRadioButton expertise; final MaterialRadioButton expertise;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
group = root.findViewById(R.id.group); group = root.findViewById(R.id.group);
none = root.findViewById(R.id.none); none = root.findViewById(R.id.none);
proficient = root.findViewById(R.id.proficient); proficient = root.findViewById(R.id.proficient);

View File

@@ -17,6 +17,7 @@ import com.majinnaibu.monstercards.R;
import java.util.Objects; import java.util.Objects;
@SuppressWarnings("unused")
public class Stepper extends ConstraintLayout { public class Stepper extends ConstraintLayout {
private final ViewHolder mHolder; private final ViewHolder mHolder;
private int mCurrentValue; private int mCurrentValue;
@@ -138,7 +139,7 @@ public class Stepper extends ConstraintLayout {
final Button increment; final Button increment;
final Button decrement; final Button decrement;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
text = root.findViewById(R.id.text); text = root.findViewById(R.id.text);
label = root.findViewById(R.id.label); label = root.findViewById(R.id.label);
increment = root.findViewById(R.id.increment); increment = root.findViewById(R.id.increment);

View File

@@ -20,12 +20,12 @@ import com.majinnaibu.monstercards.ui.shared.MCFragment;
import com.majinnaibu.monstercards.utils.Logger; import com.majinnaibu.monstercards.utils.Logger;
import java.util.List; import java.util.List;
import java.util.Locale;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.schedulers.Schedulers; import io.reactivex.rxjava3.schedulers.Schedulers;
public class DashboardFragment extends MCFragment { public class DashboardFragment extends MCFragment {
private static final String MODIFIER_FORMAT = "%+d";
private DashboardViewModel mViewModel; private DashboardViewModel mViewModel;
private ViewHolder mHolder; private ViewHolder mHolder;
private DashboardRecyclerViewAdapter mAdapter; private DashboardRecyclerViewAdapter mAdapter;
@@ -42,16 +42,14 @@ public class DashboardFragment extends MCFragment {
.getMonsters() .getMonsters()
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe(monsters -> { .subscribe(monsters -> mViewModel.setMonsters(monsters));
mViewModel.setMonsters(monsters);
});
return root; return root;
} }
private void setupRecyclerView(@NonNull RecyclerView recyclerView) { private void setupRecyclerView(@NonNull RecyclerView recyclerView) {
int columnCount = Math.max(1, (int) Math.floor(getResources().getConfiguration().screenWidthDp / 396)); int columnCount = Math.max(1, getResources().getConfiguration().screenWidthDp / 396);
Logger.logWTF(String.format("Setting column count to %d", columnCount)); Logger.logWTF(String.format(Locale.US, "Setting column count to %d", columnCount));
Context context = requireContext(); Context context = requireContext();
GridLayoutManager layoutManager = new GridLayoutManager(context, columnCount); GridLayoutManager layoutManager = new GridLayoutManager(context, columnCount);
recyclerView.setLayoutManager(layoutManager); recyclerView.setLayoutManager(layoutManager);

View File

@@ -11,6 +11,7 @@ import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListAdapter; import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.majinnaibu.monstercards.R;
import com.majinnaibu.monstercards.data.enums.AbilityScore; import com.majinnaibu.monstercards.data.enums.AbilityScore;
import com.majinnaibu.monstercards.data.enums.AdvantageType; import com.majinnaibu.monstercards.data.enums.AdvantageType;
import com.majinnaibu.monstercards.data.enums.ChallengeRating; import com.majinnaibu.monstercards.data.enums.ChallengeRating;
@@ -21,17 +22,17 @@ import com.majinnaibu.monstercards.models.Monster;
import com.majinnaibu.monstercards.models.Trait; import com.majinnaibu.monstercards.models.Trait;
import com.majinnaibu.monstercards.utils.Logger; import com.majinnaibu.monstercards.utils.Logger;
import org.jetbrains.annotations.NotNull; import java.util.Locale;
public class DashboardRecyclerViewAdapter extends ListAdapter<Monster, DashboardRecyclerViewAdapter.ViewHolder> { public class DashboardRecyclerViewAdapter extends ListAdapter<Monster, DashboardRecyclerViewAdapter.ViewHolder> {
private static final DiffUtil.ItemCallback<Monster> DIFF_CALLBACK = new DiffUtil.ItemCallback<Monster>() { private static final DiffUtil.ItemCallback<Monster> DIFF_CALLBACK = new DiffUtil.ItemCallback<Monster>() {
@Override @Override
public boolean areItemsTheSame(@NonNull @NotNull Monster oldItem, @NonNull @NotNull Monster newItem) { public boolean areItemsTheSame(@NonNull Monster oldItem, @NonNull Monster newItem) {
return oldItem.id.equals(newItem.id); return oldItem.id.equals(newItem.id);
} }
@Override @Override
public boolean areContentsTheSame(@NonNull @NotNull Monster oldItem, @NonNull @NotNull Monster newItem) { public boolean areContentsTheSame(@NonNull Monster oldItem, @NonNull Monster newItem) {
return oldItem.equals(newItem); return oldItem.equals(newItem);
} }
}; };
@@ -43,14 +44,13 @@ public class DashboardRecyclerViewAdapter extends ListAdapter<Monster, Dashboard
} }
@NonNull @NonNull
@NotNull
@Override @Override
public ViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) { public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(CardMonsterBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); return new ViewHolder(CardMonsterBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
} }
@Override @Override
public void onBindViewHolder(@NonNull @NotNull ViewHolder holder, int position) { public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Logger.logUnimplementedMethod(); Logger.logUnimplementedMethod();
Monster monster = getItem(position); Monster monster = getItem(position);
holder.monster = monster; holder.monster = monster;
@@ -88,7 +88,7 @@ public class DashboardRecyclerViewAdapter extends ListAdapter<Monster, Dashboard
holder.armorClass.setText(String.valueOf(monster.getArmorClassValue())); holder.armorClass.setText(String.valueOf(monster.getArmorClassValue()));
holder.hitPoints.setText(String.valueOf(monster.getHitPointsValue())); holder.hitPoints.setText(String.valueOf(monster.getHitPointsValue()));
holder.challengeRating.setText("CR " + Helpers.getChallengeRatingAbbreviation(monster.challengeRating)); holder.challengeRating.setText(holder.challengeRating.getResources().getString(R.string.label_challenge_rating_with_value, Helpers.getChallengeRatingAbbreviation(monster.challengeRating)));
int numActions = monster.actions.size(); int numActions = monster.actions.size();
if (numActions > 0) { if (numActions > 0) {
@@ -170,7 +170,7 @@ public class DashboardRecyclerViewAdapter extends ListAdapter<Monster, Dashboard
public final TextView challengeRating; public final TextView challengeRating;
public Monster monster; public Monster monster;
public ViewHolder(CardMonsterBinding binding) { public ViewHolder(@NonNull CardMonsterBinding binding) {
super(binding.getRoot()); super(binding.getRoot());
name = binding.name; name = binding.name;
meta = binding.meta; meta = binding.meta;
@@ -214,11 +214,13 @@ public class DashboardRecyclerViewAdapter extends ListAdapter<Monster, Dashboard
} }
public static class Helpers { public static class Helpers {
@NonNull
public static String getModifierString(int value) { public static String getModifierString(int value) {
return String.format("%+d", value); return String.format(Locale.getDefault(), "%+d", value);
} }
public static String getAbilityScoreAbbreviation(AbilityScore abilityScore) { @NonNull
public static String getAbilityScoreAbbreviation(@NonNull AbilityScore abilityScore) {
switch (abilityScore) { switch (abilityScore) {
case STRENGTH: case STRENGTH:
return "S"; return "S";
@@ -238,7 +240,8 @@ public class DashboardRecyclerViewAdapter extends ListAdapter<Monster, Dashboard
} }
} }
public static String getChallengeRatingAbbreviation(ChallengeRating challengeRating) { @NonNull
public static String getChallengeRatingAbbreviation(@NonNull ChallengeRating challengeRating) {
Logger.logUnimplementedMethod(); Logger.logUnimplementedMethod();
switch (challengeRating) { switch (challengeRating) {
case CUSTOM: case CUSTOM:
@@ -317,7 +320,8 @@ public class DashboardRecyclerViewAdapter extends ListAdapter<Monster, Dashboard
} }
} }
public static String getProficiencyAbbreviation(ProficiencyType proficiency) { @NonNull
public static String getProficiencyAbbreviation(@NonNull ProficiencyType proficiency) {
switch (proficiency) { switch (proficiency) {
case NONE: case NONE:
return ""; return "";
@@ -331,7 +335,8 @@ public class DashboardRecyclerViewAdapter extends ListAdapter<Monster, Dashboard
} }
} }
public static String getAdvantageAbbreviation(AdvantageType advantage) { @NonNull
public static String getAdvantageAbbreviation(@NonNull AdvantageType advantage) {
switch (advantage) { switch (advantage) {
case NONE: case NONE:
return ""; return "";

View File

@@ -5,6 +5,7 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.NavBackStackEntry; import androidx.navigation.NavBackStackEntry;
import androidx.navigation.NavController; import androidx.navigation.NavController;
@@ -14,6 +15,8 @@ import com.majinnaibu.monstercards.R;
import com.majinnaibu.monstercards.ui.components.Stepper; import com.majinnaibu.monstercards.ui.components.Stepper;
import com.majinnaibu.monstercards.ui.shared.MCFragment; import com.majinnaibu.monstercards.ui.shared.MCFragment;
import java.util.Locale;
public class EditAbilityScoresFragment extends MCFragment { public class EditAbilityScoresFragment extends MCFragment {
private final String ABILITY_SCORE_FORMAT = "%d (%+d)"; private final String ABILITY_SCORE_FORMAT = "%d (%+d)";
private EditMonsterViewModel mViewModel; private EditMonsterViewModel mViewModel;
@@ -24,7 +27,7 @@ public class EditAbilityScoresFragment extends MCFragment {
} }
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment); NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation); NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
@@ -34,27 +37,27 @@ public class EditAbilityScoresFragment extends MCFragment {
mViewModel.getStrength().observe(getViewLifecycleOwner(), value -> mHolder.strength.setValue(value)); mViewModel.getStrength().observe(getViewLifecycleOwner(), value -> mHolder.strength.setValue(value));
mHolder.strength.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setStrength(newValue)); mHolder.strength.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setStrength(newValue));
mHolder.strength.setOnFormatValueCallback(value -> String.format(ABILITY_SCORE_FORMAT, value, getModifier(value))); mHolder.strength.setOnFormatValueCallback(value -> String.format(Locale.getDefault(), ABILITY_SCORE_FORMAT, value, getModifier(value)));
mViewModel.getDexterity().observe(getViewLifecycleOwner(), value -> mHolder.dexterity.setValue(value)); mViewModel.getDexterity().observe(getViewLifecycleOwner(), value -> mHolder.dexterity.setValue(value));
mHolder.dexterity.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setDexterity(newValue)); mHolder.dexterity.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setDexterity(newValue));
mHolder.dexterity.setOnFormatValueCallback(value -> String.format(ABILITY_SCORE_FORMAT, value, getModifier(value))); mHolder.dexterity.setOnFormatValueCallback(value -> String.format(Locale.getDefault(), ABILITY_SCORE_FORMAT, value, getModifier(value)));
mViewModel.getConstitution().observe(getViewLifecycleOwner(), value -> mHolder.constitution.setValue(value)); mViewModel.getConstitution().observe(getViewLifecycleOwner(), value -> mHolder.constitution.setValue(value));
mHolder.constitution.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setConstitution(newValue)); mHolder.constitution.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setConstitution(newValue));
mHolder.constitution.setOnFormatValueCallback(value -> String.format(ABILITY_SCORE_FORMAT, value, getModifier(value))); mHolder.constitution.setOnFormatValueCallback(value -> String.format(Locale.getDefault(), ABILITY_SCORE_FORMAT, value, getModifier(value)));
mViewModel.getIntelligence().observe(getViewLifecycleOwner(), value -> mHolder.intelligence.setValue(value)); mViewModel.getIntelligence().observe(getViewLifecycleOwner(), value -> mHolder.intelligence.setValue(value));
mHolder.intelligence.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setIntelligence(newValue)); mHolder.intelligence.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setIntelligence(newValue));
mHolder.intelligence.setOnFormatValueCallback(value -> String.format(ABILITY_SCORE_FORMAT, value, getModifier(value))); mHolder.intelligence.setOnFormatValueCallback(value -> String.format(Locale.getDefault(), ABILITY_SCORE_FORMAT, value, getModifier(value)));
mViewModel.getWisdom().observe(getViewLifecycleOwner(), value -> mHolder.wisdom.setValue(value)); mViewModel.getWisdom().observe(getViewLifecycleOwner(), value -> mHolder.wisdom.setValue(value));
mHolder.wisdom.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setWisdom(newValue)); mHolder.wisdom.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setWisdom(newValue));
mHolder.wisdom.setOnFormatValueCallback(value -> String.format(ABILITY_SCORE_FORMAT, value, getModifier(value))); mHolder.wisdom.setOnFormatValueCallback(value -> String.format(Locale.getDefault(), ABILITY_SCORE_FORMAT, value, getModifier(value)));
mViewModel.getCharisma().observe(getViewLifecycleOwner(), value -> mHolder.charisma.setValue(value)); mViewModel.getCharisma().observe(getViewLifecycleOwner(), value -> mHolder.charisma.setValue(value));
mHolder.charisma.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setCharisma(newValue)); mHolder.charisma.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setCharisma(newValue));
mHolder.charisma.setOnFormatValueCallback(value -> String.format(ABILITY_SCORE_FORMAT, value, getModifier(value))); mHolder.charisma.setOnFormatValueCallback(value -> String.format(Locale.getDefault(), ABILITY_SCORE_FORMAT, value, getModifier(value)));
return root; return root;
} }
@@ -67,7 +70,7 @@ public class EditAbilityScoresFragment extends MCFragment {
final Stepper wisdom; final Stepper wisdom;
final Stepper charisma; final Stepper charisma;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
strength = root.findViewById(R.id.strength); strength = root.findViewById(R.id.strength);
dexterity = root.findViewById(R.id.dexterity); dexterity = root.findViewById(R.id.dexterity);
constitution = root.findViewById(R.id.constitution); constitution = root.findViewById(R.id.constitution);

View File

@@ -30,7 +30,7 @@ public class EditArmorFragment extends MCFragment {
private ViewHolder mHolder; private ViewHolder mHolder;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment); NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation); NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
@@ -93,7 +93,7 @@ public class EditArmorFragment extends MCFragment {
private final Stepper shieldBonus; private final Stepper shieldBonus;
private final EditText customArmor; private final EditText customArmor;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
armorType = root.findViewById(R.id.armorType); armorType = root.findViewById(R.id.armorType);
naturalArmorBonus = root.findViewById(R.id.naturalArmorBonus); naturalArmorBonus = root.findViewById(R.id.naturalArmorBonus);
hasShield = root.findViewById(R.id.hasShield); hasShield = root.findViewById(R.id.hasShield);

View File

@@ -6,6 +6,7 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.EditText; import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.NavBackStackEntry; import androidx.navigation.NavBackStackEntry;
import androidx.navigation.NavController; import androidx.navigation.NavController;
@@ -28,7 +29,7 @@ public class EditBasicInfoFragment extends MCFragment {
} }
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment); NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation); NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
@@ -73,7 +74,7 @@ public class EditBasicInfoFragment extends MCFragment {
private final Stepper hitDice; private final Stepper hitDice;
private final SwitchMaterial hasCustomHitPoints; private final SwitchMaterial hasCustomHitPoints;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
name = root.findViewById(R.id.name); name = root.findViewById(R.id.name);
size = root.findViewById(R.id.size); size = root.findViewById(R.id.size);
type = root.findViewById(R.id.type); type = root.findViewById(R.id.type);

View File

@@ -28,7 +28,7 @@ public class EditChallengeRatingFragment extends MCFragment {
private ViewHolder mHolder; private ViewHolder mHolder;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment); NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation); NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
@@ -82,7 +82,7 @@ public class EditChallengeRatingFragment extends MCFragment {
final EditText customChallengeRatingDescription; final EditText customChallengeRatingDescription;
final EditText customProficiencyBonus; final EditText customProficiencyBonus;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
challengeRating = root.findViewById(R.id.challengeRating); challengeRating = root.findViewById(R.id.challengeRating);
customChallengeRatingDescription = root.findViewById(R.id.customChallengeRatingDescription); customChallengeRatingDescription = root.findViewById(R.id.customChallengeRatingDescription);
customProficiencyBonus = root.findViewById(R.id.customProficiencyBonus); customProficiencyBonus = root.findViewById(R.id.customProficiencyBonus);

View File

@@ -44,7 +44,7 @@ public class EditLanguageFragment extends MCFragment {
@Nullable @Nullable
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment); NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation); NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
mEditMonsterViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class); mEditMonsterViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
@@ -80,7 +80,7 @@ public class EditLanguageFragment extends MCFragment {
EditText name; EditText name;
SwitchCompat canSpeak; SwitchCompat canSpeak;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
name = root.findViewById(R.id.name); name = root.findViewById(R.id.name);
canSpeak = root.findViewById(R.id.canSpeak); canSpeak = root.findViewById(R.id.canSpeak);
} }

View File

@@ -1,5 +1,6 @@
package com.majinnaibu.monstercards.ui.editmonster; package com.majinnaibu.monstercards.ui.editmonster;
import androidx.annotation.NonNull;
import androidx.lifecycle.LiveData; import androidx.lifecycle.LiveData;
import com.majinnaibu.monstercards.models.Language; import com.majinnaibu.monstercards.models.Language;
@@ -18,7 +19,7 @@ public class EditLanguageViewModel extends ChangeTrackedViewModel {
mLanguage = new ChangeTrackedLiveData<>(makeLanguage(), this::makeDirty); mLanguage = new ChangeTrackedLiveData<>(makeLanguage(), this::makeDirty);
} }
public void copyFromLanguage(Language language) { public void copyFromLanguage(@NonNull Language language) {
mName.resetValue(language.getName()); mName.resetValue(language.getName());
mCanSpeak.resetValue(language.getSpeaks()); mCanSpeak.resetValue(language.getSpeaks());
makeClean(); makeClean();
@@ -58,9 +59,10 @@ public class EditLanguageViewModel extends ChangeTrackedViewModel {
return getCanSpeakValue(false); return getCanSpeakValue(false);
} }
@NonNull
private Language makeLanguage() { private Language makeLanguage() {
Boolean boxedValue = mCanSpeak.getValue(); Boolean boxedValue = mCanSpeak.getValue();
boolean canSpeak = boxedValue != null && boxedValue; boolean canSpeak = boxedValue != null && boxedValue;
return new Language(mName.getValue(), canSpeak); return new Language(mName.getValue(), canSpeak);
} }
} }

View File

@@ -30,13 +30,13 @@ public class EditLanguagesFragment extends MCFragment {
private EditMonsterViewModel mViewModel; private EditMonsterViewModel mViewModel;
private ViewHolder mHolder; private ViewHolder mHolder;
private void navigateToEditLanguage(Language language) { private void navigateToEditLanguage(@NonNull Language language) {
NavDirections action = EditLanguagesFragmentDirections.actionEditLanguagesFragmentToEditLanguageFragment(language.getName(), language.getSpeaks()); NavDirections action = EditLanguagesFragmentDirections.actionEditLanguagesFragmentToEditLanguageFragment(language.getName(), language.getSpeaks());
Navigation.findNavController(requireView()).navigate(action); Navigation.findNavController(requireView()).navigate(action);
} }
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment); NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation); NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
@@ -93,7 +93,7 @@ public class EditLanguagesFragment extends MCFragment {
RecyclerView list; RecyclerView list;
FloatingActionButton addLanguage; FloatingActionButton addLanguage;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
this.list = root.findViewById(R.id.list); this.list = root.findViewById(R.id.list);
this.addLanguage = root.findViewById(R.id.add_language); this.addLanguage = root.findViewById(R.id.add_language);
} }

View File

@@ -6,6 +6,7 @@ import android.view.ViewGroup;
import android.widget.EditText; import android.widget.EditText;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.majinnaibu.monstercards.databinding.FragmentEditLanguagesListHeaderBinding; import com.majinnaibu.monstercards.databinding.FragmentEditLanguagesListHeaderBinding;
@@ -13,9 +14,8 @@ import com.majinnaibu.monstercards.databinding.FragmentEditLanguagesListItemBind
import com.majinnaibu.monstercards.models.Language; import com.majinnaibu.monstercards.models.Language;
import com.majinnaibu.monstercards.ui.components.Stepper; import com.majinnaibu.monstercards.ui.components.Stepper;
import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
import java.util.Locale;
public class EditLanguagesRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public class EditLanguagesRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final List<Language> mValues; private final List<Language> mValues;
@@ -29,18 +29,18 @@ public class EditLanguagesRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
private final int ITEM_VIEW_TYPE = 2; private final int ITEM_VIEW_TYPE = 2;
private final String DISTANCE_IN_FEET_FORMAT = "%d ft."; private final String DISTANCE_IN_FEET_FORMAT = "%d ft.";
public EditLanguagesRecyclerViewAdapter(List<Language> items, ItemCallback onClick, int telepathyRange, Stepper.OnValueChangeListener telepathyRangeChangedListener, String undderstandsBut, TextWatcher understandsButChangedListener) { public EditLanguagesRecyclerViewAdapter(List<Language> items, ItemCallback onClick, int telepathyRange, Stepper.OnValueChangeListener telepathyRangeChangedListener, String understandsBut, TextWatcher understandsButChangedListener) {
mValues = items; mValues = items;
mOnClick = onClick; mOnClick = onClick;
mTelepathyRange = telepathyRange; mTelepathyRange = telepathyRange;
mOnTelepathyRangeChanged = telepathyRangeChangedListener; mOnTelepathyRangeChanged = telepathyRangeChangedListener;
mUnderstandsBut = undderstandsBut; mUnderstandsBut = understandsBut;
mOnUnderstandsButChanged = understandsButChangedListener; mOnUnderstandsButChanged = understandsButChangedListener;
} }
@NotNull @NonNull
@Override @Override
public RecyclerView.ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) { public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == HEADER_VIEW_TYPE) { if (viewType == HEADER_VIEW_TYPE) {
return new HeaderViewHolder(FragmentEditLanguagesListHeaderBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); return new HeaderViewHolder(FragmentEditLanguagesListHeaderBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
} }
@@ -48,10 +48,10 @@ public class EditLanguagesRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
} }
@Override @Override
public void onBindViewHolder(@NotNull final RecyclerView.ViewHolder holder, int position) { public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) {
if (holder instanceof HeaderViewHolder) { if (holder instanceof HeaderViewHolder) {
HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder; HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder;
headerViewHolder.telepathy.setOnFormatValueCallback(value -> String.format(DISTANCE_IN_FEET_FORMAT, value)); headerViewHolder.telepathy.setOnFormatValueCallback(value -> String.format(Locale.getDefault(), DISTANCE_IN_FEET_FORMAT, value));
headerViewHolder.telepathy.setValue(mTelepathyRange); headerViewHolder.telepathy.setValue(mTelepathyRange);
headerViewHolder.telepathy.setOnValueChangeListener(mOnTelepathyRangeChanged); headerViewHolder.telepathy.setOnValueChangeListener(mOnTelepathyRangeChanged);
headerViewHolder.understandsBut.setText(mUnderstandsBut); headerViewHolder.understandsBut.setText(mUnderstandsBut);
@@ -89,7 +89,7 @@ public class EditLanguagesRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
public final Stepper telepathy; public final Stepper telepathy;
public final EditText understandsBut; public final EditText understandsBut;
public HeaderViewHolder(FragmentEditLanguagesListHeaderBinding binding) { public HeaderViewHolder(@NonNull FragmentEditLanguagesListHeaderBinding binding) {
super(binding.getRoot()); super(binding.getRoot());
telepathy = binding.telepathy; telepathy = binding.telepathy;
understandsBut = binding.understandsBut; understandsBut = binding.understandsBut;
@@ -100,12 +100,12 @@ public class EditLanguagesRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
public final TextView mContentView; public final TextView mContentView;
public Language mItem; public Language mItem;
public ItemViewHolder(FragmentEditLanguagesListItemBinding binding) { public ItemViewHolder(@NonNull FragmentEditLanguagesListItemBinding binding) {
super(binding.getRoot()); super(binding.getRoot());
mContentView = binding.content; mContentView = binding.content;
} }
@NotNull @NonNull
@Override @Override
public String toString() { public String toString() {
return super.toString() + " '" + mContentView.getText() + "'"; return super.toString() + " '" + mContentView.getText() + "'";

View File

@@ -247,7 +247,7 @@ public class EditMonsterFragment extends MCFragment {
TextView lairActions; TextView lairActions;
TextView regionalActions; TextView regionalActions;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
basicInfoButton = root.findViewById(R.id.basicInfo); basicInfoButton = root.findViewById(R.id.basicInfo);
armorButton = root.findViewById(R.id.armor); armorButton = root.findViewById(R.id.armor);
speedButton = root.findViewById(R.id.speed); speedButton = root.findViewById(R.id.speed);

View File

@@ -158,7 +158,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
mRegionalActions = new ChangeTrackedLiveData<>(new ArrayList<>(), this::makeDirty); mRegionalActions = new ChangeTrackedLiveData<>(new ArrayList<>(), this::makeDirty);
} }
public void copyFromMonster(Monster monster) { public void copyFromMonster(@NonNull Monster monster) {
mMonsterId.resetValue(monster.id); mMonsterId.resetValue(monster.id);
mName.resetValue(monster.name); mName.resetValue(monster.name);
mSize.resetValue(monster.size); mSize.resetValue(monster.size);
@@ -787,7 +787,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
return monster; return monster;
} }
public LiveData<List<Trait>> getTraits(TraitType type) { public LiveData<List<Trait>> getTraits(@NonNull TraitType type) {
switch (type) { switch (type) {
case ABILITY: case ABILITY:
return mAbilities; return mAbilities;
@@ -807,7 +807,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
} }
} }
public void removeTrait(TraitType type, int position) { public void removeTrait(@NonNull TraitType type, int position) {
switch (type) { switch (type) {
case ABILITY: case ABILITY:
Helpers.removeFromList(mAbilities, position); Helpers.removeFromList(mAbilities, position);
@@ -833,7 +833,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
} }
} }
public void replaceTrait(TraitType type, Trait oldTrait, Trait newTrait) { public void replaceTrait(@NonNull TraitType type, Trait oldTrait, Trait newTrait) {
switch (type) { switch (type) {
case ABILITY: case ABILITY:
Helpers.replaceItemInList(mAbilities, oldTrait, newTrait); Helpers.replaceItemInList(mAbilities, oldTrait, newTrait);
@@ -858,7 +858,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
} }
} }
public Trait addNewTrait(TraitType type) { public Trait addNewTrait(@NonNull TraitType type) {
Trait newAction = new Trait("", ""); Trait newAction = new Trait("", "");
switch (type) { switch (type) {
case ABILITY: case ABILITY:
@@ -879,7 +879,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
} }
} }
public LiveData<List<String>> getStrings(StringType type) { public LiveData<List<String>> getStrings(@NonNull StringType type) {
switch (type) { switch (type) {
case CONDITION_IMMUNITY: case CONDITION_IMMUNITY:
return mConditionImmunities; return mConditionImmunities;
@@ -897,7 +897,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
} }
} }
public void removeString(StringType type, int position) { public void removeString(@NonNull StringType type, int position) {
switch (type) { switch (type) {
case CONDITION_IMMUNITY: case CONDITION_IMMUNITY:
Helpers.removeFromList(mConditionImmunities, position); Helpers.removeFromList(mConditionImmunities, position);
@@ -920,7 +920,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
} }
} }
public String addNewString(StringType type) { public String addNewString(@NonNull StringType type) {
String newString = ""; String newString = "";
switch (type) { switch (type) {
case CONDITION_IMMUNITY: case CONDITION_IMMUNITY:
@@ -939,7 +939,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
} }
} }
public void replaceString(StringType type, String oldValue, String newValue) { public void replaceString(@NonNull StringType type, String oldValue, String newValue) {
switch (type) { switch (type) {
case CONDITION_IMMUNITY: case CONDITION_IMMUNITY:
Helpers.replaceItemInList(mConditionImmunities, oldValue, newValue); Helpers.replaceItemInList(mConditionImmunities, oldValue, newValue);
@@ -961,7 +961,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
} }
} }
public boolean moveTrait(TraitType type, int from, int to) { public boolean moveTrait(@NonNull TraitType type, int from, int to) {
switch (type) { switch (type) {
case ABILITY: case ABILITY:
return Helpers.moveItemInList(mAbilities, from, to); return Helpers.moveItemInList(mAbilities, from, to);
@@ -989,7 +989,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
return addItemToList(listData, newItem, null); return addItemToList(listData, newItem, null);
} }
static <T> T addItemToList(MutableLiveData<List<T>> listData, T newItem, Comparator<? super T> comparator) { static <T> T addItemToList(@NonNull MutableLiveData<List<T>> listData, T newItem, Comparator<? super T> comparator) {
ArrayList<T> newList = new ArrayList<>(listData.getValue()); ArrayList<T> newList = new ArrayList<>(listData.getValue());
newList.add(newItem); newList.add(newItem);
if (comparator != null) { if (comparator != null) {
@@ -999,14 +999,14 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
return newItem; return newItem;
} }
static <T> void removeFromList(MutableLiveData<List<T>> listData, int position) { static <T> void removeFromList(@NonNull MutableLiveData<List<T>> listData, int position) {
List<T> oldList = listData.getValue(); List<T> oldList = listData.getValue();
ArrayList<T> newList = new ArrayList<>(oldList); ArrayList<T> newList = new ArrayList<>(oldList);
newList.remove(position); newList.remove(position);
listData.setValue(newList); listData.setValue(newList);
} }
static <T> void replaceItemInList(MutableLiveData<List<T>> listData, int position, T newItem, Comparator<? super T> comparator) { static <T> void replaceItemInList(@NonNull MutableLiveData<List<T>> listData, int position, T newItem, Comparator<? super T> comparator) {
List<T> oldList = listData.getValue(); List<T> oldList = listData.getValue();
if (oldList == null) { if (oldList == null) {
oldList = new ArrayList<>(); oldList = new ArrayList<>();
@@ -1036,7 +1036,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
replaceItemInList(listData, position, newItem, null); replaceItemInList(listData, position, newItem, null);
} }
static <T> void replaceItemInList(MutableLiveData<List<T>> listData, T oldItem, T newItem, Comparator<? super T> comparator) { static <T> void replaceItemInList(@NonNull MutableLiveData<List<T>> listData, T oldItem, T newItem, Comparator<? super T> comparator) {
List<T> oldList = listData.getValue(); List<T> oldList = listData.getValue();
if (oldList == null) { if (oldList == null) {
oldList = new ArrayList<>(); oldList = new ArrayList<>();
@@ -1071,7 +1071,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
return value; return value;
} }
static <T> boolean moveItemInList(ChangeTrackedLiveData<List<T>> listData, int from, int to) { static <T> boolean moveItemInList(@NonNull ChangeTrackedLiveData<List<T>> listData, int from, int to) {
List<T> oldList = listData.getValue(); List<T> oldList = listData.getValue();
if (oldList == null) { if (oldList == null) {
oldList = new ArrayList<>(); oldList = new ArrayList<>();

View File

@@ -5,6 +5,7 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.NavBackStackEntry; import androidx.navigation.NavBackStackEntry;
import androidx.navigation.NavController; import androidx.navigation.NavController;
@@ -20,7 +21,7 @@ public class EditSavingThrowsFragment extends MCFragment {
private ViewHolder mViewHolder; private ViewHolder mViewHolder;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment); NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation); NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
@@ -75,7 +76,7 @@ public class EditSavingThrowsFragment extends MCFragment {
AdvantagePicker charismaAdvantage; AdvantagePicker charismaAdvantage;
ProficiencyPicker charismaProficiency; ProficiencyPicker charismaProficiency;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
strengthAdvantage = root.findViewById(R.id.strengthAdvantage); strengthAdvantage = root.findViewById(R.id.strengthAdvantage);
strengthProficiency = root.findViewById(R.id.strengthProficiency); strengthProficiency = root.findViewById(R.id.strengthProficiency);
dexterityAdvantage = root.findViewById(R.id.dexterityAdvantage); dexterityAdvantage = root.findViewById(R.id.dexterityAdvantage);

View File

@@ -89,7 +89,7 @@ public class EditSkillFragment extends MCFragment {
ProficiencyPicker proficiency; ProficiencyPicker proficiency;
EditText name; EditText name;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
abilityScore = root.findViewById(R.id.abilityScore); abilityScore = root.findViewById(R.id.abilityScore);
advantage = root.findViewById(R.id.advantage); advantage = root.findViewById(R.id.advantage);
proficiency = root.findViewById(R.id.proficiency); proficiency = root.findViewById(R.id.proficiency);

View File

@@ -1,5 +1,6 @@
package com.majinnaibu.monstercards.ui.editmonster; package com.majinnaibu.monstercards.ui.editmonster;
import androidx.annotation.NonNull;
import androidx.lifecycle.LiveData; import androidx.lifecycle.LiveData;
import com.majinnaibu.monstercards.data.enums.AbilityScore; import com.majinnaibu.monstercards.data.enums.AbilityScore;
@@ -25,7 +26,7 @@ public class EditSkillViewModel extends ChangeTrackedViewModel {
mSkill = new ChangeTrackedLiveData<>(makeSkill(), this::makeDirty); mSkill = new ChangeTrackedLiveData<>(makeSkill(), this::makeDirty);
} }
public void copyFromSkill(Skill skill) { public void copyFromSkill(@NonNull Skill skill) {
mAbilityScore.resetValue(skill.abilityScore); mAbilityScore.resetValue(skill.abilityScore);
mAdvantageType.resetValue(skill.advantageType); mAdvantageType.resetValue(skill.advantageType);
mProficiencyType.resetValue(skill.proficiencyType); mProficiencyType.resetValue(skill.proficiencyType);
@@ -73,6 +74,7 @@ public class EditSkillViewModel extends ChangeTrackedViewModel {
mSkill.setValue(makeSkill()); mSkill.setValue(makeSkill());
} }
@NonNull
private Skill makeSkill() { private Skill makeSkill() {
return new Skill(mName.getValue(), mAbilityScore.getValue(), mAdvantageType.getValue(), mProficiencyType.getValue()); return new Skill(mName.getValue(), mAbilityScore.getValue(), mAdvantageType.getValue(), mProficiencyType.getValue());
} }

View File

@@ -31,13 +31,13 @@ public class EditSkillsFragment extends MCFragment {
private EditMonsterViewModel mViewModel; private EditMonsterViewModel mViewModel;
private ViewHolder mHolder; private ViewHolder mHolder;
private void navigateToEditSkill(Skill skill) { private void navigateToEditSkill(@NonNull Skill skill) {
NavDirections action = EditSkillsFragmentDirections.actionEditSkillsFragmentToEditSkillFragment(skill.name, skill.abilityScore, skill.proficiencyType, skill.advantageType); NavDirections action = EditSkillsFragmentDirections.actionEditSkillsFragmentToEditSkillFragment(skill.name, skill.abilityScore, skill.proficiencyType, skill.advantageType);
Navigation.findNavController(requireView()).navigate(action); Navigation.findNavController(requireView()).navigate(action);
} }
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment); NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation); NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
@@ -84,7 +84,7 @@ public class EditSkillsFragment extends MCFragment {
RecyclerView list; RecyclerView list;
FloatingActionButton addSkill; FloatingActionButton addSkill;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
this.list = root.findViewById(R.id.list); this.list = root.findViewById(R.id.list);
this.addSkill = root.findViewById(R.id.add_skill); this.addSkill = root.findViewById(R.id.add_skill);
} }

View File

@@ -4,13 +4,12 @@ import android.view.LayoutInflater;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.majinnaibu.monstercards.databinding.FragmentEditSkillsListItemBinding; import com.majinnaibu.monstercards.databinding.FragmentEditSkillsListItemBinding;
import com.majinnaibu.monstercards.models.Skill; import com.majinnaibu.monstercards.models.Skill;
import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
/** /**
@@ -25,14 +24,14 @@ public class EditSkillsRecyclerViewAdapter extends RecyclerView.Adapter<EditSkil
mOnClick = onClick; mOnClick = onClick;
} }
@NotNull @NonNull
@Override @Override
public ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) { public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(FragmentEditSkillsListItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); return new ViewHolder(FragmentEditSkillsListItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
} }
@Override @Override
public void onBindViewHolder(final ViewHolder holder, int position) { public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
holder.mItem = mValues.get(position); holder.mItem = mValues.get(position);
holder.mContentView.setText(mValues.get(position).name); holder.mContentView.setText(mValues.get(position).name);
holder.itemView.setOnClickListener(v -> { holder.itemView.setOnClickListener(v -> {
@@ -55,15 +54,15 @@ public class EditSkillsRecyclerViewAdapter extends RecyclerView.Adapter<EditSkil
public final TextView mContentView; public final TextView mContentView;
public Skill mItem; public Skill mItem;
public ViewHolder(FragmentEditSkillsListItemBinding binding) { public ViewHolder(@NonNull FragmentEditSkillsListItemBinding binding) {
super(binding.getRoot()); super(binding.getRoot());
mContentView = binding.content; mContentView = binding.content;
} }
@NotNull @NonNull
@Override @Override
public String toString() { public String toString() {
return super.toString() + " '" + mContentView.getText() + "'"; return super.toString() + " '" + mContentView.getText() + "'";
} }
} }
} }

View File

@@ -6,6 +6,7 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.EditText; import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.SwitchCompat; import androidx.appcompat.widget.SwitchCompat;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.NavBackStackEntry; import androidx.navigation.NavBackStackEntry;
@@ -22,7 +23,7 @@ public class EditSpeedFragment extends MCFragment {
private ViewHolder mHolder; private ViewHolder mHolder;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment); NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation); NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
@@ -74,7 +75,7 @@ public class EditSpeedFragment extends MCFragment {
final SwitchCompat hasCustomSpeed; final SwitchCompat hasCustomSpeed;
final EditText customSpeed; final EditText customSpeed;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
baseSpeed = root.findViewById(R.id.baseSpeed); baseSpeed = root.findViewById(R.id.baseSpeed);
burrowSpeed = root.findViewById(R.id.burrowSpeed); burrowSpeed = root.findViewById(R.id.burrowSpeed);
climbSpeed = root.findViewById(R.id.climbSpeed); climbSpeed = root.findViewById(R.id.climbSpeed);

View File

@@ -28,7 +28,7 @@ public class EditStringFragment extends MCFragment {
private StringType mStringType; private StringType mStringType;
@Override @Override
public void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) {
mViewModel = new ViewModelProvider(this).get(EditStringViewModel.class); mViewModel = new ViewModelProvider(this).get(EditStringViewModel.class);
if (getArguments() != null) { if (getArguments() != null) {
EditStringFragmentArgs args = EditStringFragmentArgs.fromBundle(getArguments()); EditStringFragmentArgs args = EditStringFragmentArgs.fromBundle(getArguments());
@@ -43,7 +43,6 @@ public class EditStringFragment extends MCFragment {
} }
@Nullable @Nullable
@org.jetbrains.annotations.Nullable
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment); NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
@@ -69,7 +68,8 @@ public class EditStringFragment extends MCFragment {
return root; return root;
} }
private String getTitleForStringType(StringType type) { @NonNull
private String getTitleForStringType(@NonNull StringType type) {
switch (type) { switch (type) {
case CONDITION_IMMUNITY: case CONDITION_IMMUNITY:
return getString(R.string.title_editConditionImmunity); return getString(R.string.title_editConditionImmunity);
@@ -95,7 +95,7 @@ public class EditStringFragment extends MCFragment {
private static class ViewHolder { private static class ViewHolder {
EditText description; EditText description;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
description = root.findViewById(R.id.description); description = root.findViewById(R.id.description);
} }
} }

View File

@@ -26,8 +26,6 @@ import com.majinnaibu.monstercards.ui.shared.MCFragment;
import com.majinnaibu.monstercards.ui.shared.SwipeToDeleteCallback; import com.majinnaibu.monstercards.ui.shared.SwipeToDeleteCallback;
import com.majinnaibu.monstercards.utils.Logger; import com.majinnaibu.monstercards.utils.Logger;
import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
public class EditStringsFragment extends MCFragment { public class EditStringsFragment extends MCFragment {
@@ -36,7 +34,7 @@ public class EditStringsFragment extends MCFragment {
private StringType mStringType; private StringType mStringType;
@Override @Override
public void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) {
Bundle arguments = getArguments(); Bundle arguments = getArguments();
if (arguments != null) { if (arguments != null) {
EditStringsFragmentArgs args = EditStringsFragmentArgs.fromBundle(arguments); EditStringsFragmentArgs args = EditStringsFragmentArgs.fromBundle(arguments);
@@ -48,9 +46,8 @@ public class EditStringsFragment extends MCFragment {
} }
@Nullable @Nullable
@org.jetbrains.annotations.Nullable
@Override @Override
public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment); NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation); NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
mViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class); mViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
@@ -62,6 +59,7 @@ public class EditStringsFragment extends MCFragment {
return root; return root;
} }
@NonNull
private String getTitleForStringType(StringType type) { private String getTitleForStringType(StringType type) {
switch (type) { switch (type) {
case CONDITION_IMMUNITY: case CONDITION_IMMUNITY:
@@ -123,7 +121,7 @@ public class EditStringsFragment extends MCFragment {
RecyclerView list; RecyclerView list;
FloatingActionButton addItem; FloatingActionButton addItem;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
list = root.findViewById(R.id.list); list = root.findViewById(R.id.list);
addItem = root.findViewById(R.id.add_item); addItem = root.findViewById(R.id.add_item);
} }

View File

@@ -4,12 +4,11 @@ import android.view.LayoutInflater;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.majinnaibu.monstercards.databinding.FragmentEditStringsListItemBinding; import com.majinnaibu.monstercards.databinding.FragmentEditStringsListItemBinding;
import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
public class EditStringsRecyclerViewAdapter extends RecyclerView.Adapter<EditStringsRecyclerViewAdapter.ViewHolder> { public class EditStringsRecyclerViewAdapter extends RecyclerView.Adapter<EditStringsRecyclerViewAdapter.ViewHolder> {
@@ -21,14 +20,14 @@ public class EditStringsRecyclerViewAdapter extends RecyclerView.Adapter<EditStr
mOnClick = onClick; mOnClick = onClick;
} }
@NotNull @NonNull
@Override @Override
public ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) { public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(FragmentEditStringsListItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); return new ViewHolder(FragmentEditStringsListItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
} }
@Override @Override
public void onBindViewHolder(final ViewHolder holder, int position) { public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
holder.mItem = mValues.get(position); holder.mItem = mValues.get(position);
holder.mContentView.setText(mValues.get(position)); holder.mContentView.setText(mValues.get(position));
holder.itemView.setOnClickListener(v -> { holder.itemView.setOnClickListener(v -> {
@@ -51,12 +50,12 @@ public class EditStringsRecyclerViewAdapter extends RecyclerView.Adapter<EditStr
public final TextView mContentView; public final TextView mContentView;
public String mItem; public String mItem;
public ViewHolder(FragmentEditStringsListItemBinding binding) { public ViewHolder(@NonNull FragmentEditStringsListItemBinding binding) {
super(binding.getRoot()); super(binding.getRoot());
mContentView = binding.content; mContentView = binding.content;
} }
@NotNull @NonNull
@Override @Override
public String toString() { public String toString() {
return super.toString() + " '" + mContentView.getText() + "'"; return super.toString() + " '" + mContentView.getText() + "'";

View File

@@ -29,7 +29,7 @@ public class EditTraitFragment extends MCFragment {
private TraitType mTraitType; private TraitType mTraitType;
@Override @Override
public void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) {
mViewModel = new ViewModelProvider(this).get(EditTraitViewModel.class); mViewModel = new ViewModelProvider(this).get(EditTraitViewModel.class);
if (getArguments() != null) { if (getArguments() != null) {
EditTraitFragmentArgs args = EditTraitFragmentArgs.fromBundle(getArguments()); EditTraitFragmentArgs args = EditTraitFragmentArgs.fromBundle(getArguments());
@@ -44,7 +44,7 @@ public class EditTraitFragment extends MCFragment {
} }
@Nullable @Nullable
@org.jetbrains.annotations.Nullable
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment); NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
@@ -102,7 +102,7 @@ public class EditTraitFragment extends MCFragment {
EditText description; EditText description;
EditText name; EditText name;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
description = root.findViewById(R.id.description); description = root.findViewById(R.id.description);
name = root.findViewById(R.id.name); name = root.findViewById(R.id.name);
} }

View File

@@ -1,5 +1,6 @@
package com.majinnaibu.monstercards.ui.editmonster; package com.majinnaibu.monstercards.ui.editmonster;
import androidx.annotation.NonNull;
import androidx.lifecycle.LiveData; import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
@@ -49,12 +50,13 @@ public class EditTraitViewModel extends ChangeTrackedViewModel {
return mAbility.getValue(); return mAbility.getValue();
} }
public void copyFromTrait(Trait trait) { public void copyFromTrait(@NonNull Trait trait) {
makeClean(); makeClean();
mName.resetValue(trait.name); mName.resetValue(trait.name);
mDescription.resetValue(trait.description); mDescription.resetValue(trait.description);
} }
@NonNull
private Trait makeAbility() { private Trait makeAbility() {
return new Trait(mName.getValue(), mDescription.getValue()); return new Trait(mName.getValue(), mDescription.getValue());
} }

View File

@@ -27,8 +27,6 @@ import com.majinnaibu.monstercards.ui.shared.MCFragment;
import com.majinnaibu.monstercards.ui.shared.SwipeToDeleteCallback; import com.majinnaibu.monstercards.ui.shared.SwipeToDeleteCallback;
import com.majinnaibu.monstercards.utils.Logger; import com.majinnaibu.monstercards.utils.Logger;
import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
public class EditTraitsFragment extends MCFragment { public class EditTraitsFragment extends MCFragment {
@@ -39,7 +37,7 @@ public class EditTraitsFragment extends MCFragment {
@Override @Override
public void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) {
if (getArguments() != null) { if (getArguments() != null) {
EditTraitsFragmentArgs args = EditTraitsFragmentArgs.fromBundle(getArguments()); EditTraitsFragmentArgs args = EditTraitsFragmentArgs.fromBundle(getArguments());
mTraitType = args.getTraitType(); mTraitType = args.getTraitType();
@@ -50,9 +48,8 @@ public class EditTraitsFragment extends MCFragment {
} }
@Nullable @Nullable
@org.jetbrains.annotations.Nullable
@Override @Override
public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment); NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation); NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
mViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class); mViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
@@ -64,6 +61,7 @@ public class EditTraitsFragment extends MCFragment {
return root; return root;
} }
@NonNull
private String getTitleForTraitType(TraitType type) { private String getTitleForTraitType(TraitType type) {
switch (type) { switch (type) {
case ABILITY: case ABILITY:
@@ -116,7 +114,7 @@ public class EditTraitsFragment extends MCFragment {
}); });
} }
protected void navigateToEditTrait(Trait trait) { protected void navigateToEditTrait(@NonNull Trait trait) {
NavDirections action = EditTraitsFragmentDirections.actionEditTraitListFragmentToEditTraitFragment(trait.description, trait.name, mTraitType); NavDirections action = EditTraitsFragmentDirections.actionEditTraitListFragmentToEditTraitFragment(trait.description, trait.name, mTraitType);
Navigation.findNavController(requireView()).navigate(action); Navigation.findNavController(requireView()).navigate(action);
} }
@@ -125,7 +123,7 @@ public class EditTraitsFragment extends MCFragment {
RecyclerView list; RecyclerView list;
FloatingActionButton addTrait; FloatingActionButton addTrait;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
list = root.findViewById(R.id.list); list = root.findViewById(R.id.list);
addTrait = root.findViewById(R.id.add_trait); addTrait = root.findViewById(R.id.add_trait);
} }

View File

@@ -12,18 +12,16 @@ import androidx.recyclerview.widget.RecyclerView;
import com.majinnaibu.monstercards.databinding.FragmentEditTraitsListItemBinding; import com.majinnaibu.monstercards.databinding.FragmentEditTraitsListItemBinding;
import com.majinnaibu.monstercards.models.Trait; import com.majinnaibu.monstercards.models.Trait;
import org.jetbrains.annotations.NotNull;
public class EditTraitsRecyclerViewAdapter extends ListAdapter<Trait, EditTraitsRecyclerViewAdapter.ViewHolder> { public class EditTraitsRecyclerViewAdapter extends ListAdapter<Trait, EditTraitsRecyclerViewAdapter.ViewHolder> {
private static final DiffUtil.ItemCallback<Trait> DIFF_CALLBACK = new DiffUtil.ItemCallback<Trait>() { private static final DiffUtil.ItemCallback<Trait> DIFF_CALLBACK = new DiffUtil.ItemCallback<Trait>() {
@Override @Override
public boolean areItemsTheSame(@NonNull @NotNull Trait oldItem, @NonNull @NotNull Trait newItem) { public boolean areItemsTheSame(@NonNull Trait oldItem, @NonNull Trait newItem) {
return oldItem.equals(newItem); return oldItem.equals(newItem);
} }
@Override @Override
public boolean areContentsTheSame(@NonNull @NotNull Trait oldItem, @NonNull @NotNull Trait newItem) { public boolean areContentsTheSame(@NonNull Trait oldItem, @NonNull Trait newItem) {
return oldItem.equals(newItem); return oldItem.equals(newItem);
} }
}; };
@@ -34,14 +32,14 @@ public class EditTraitsRecyclerViewAdapter extends ListAdapter<Trait, EditTraits
mOnClick = onClick; mOnClick = onClick;
} }
@NotNull @NonNull
@Override @Override
public ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) { public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(FragmentEditTraitsListItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); return new ViewHolder(FragmentEditTraitsListItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
} }
@Override @Override
public void onBindViewHolder(final ViewHolder holder, int position) { public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
holder.mItem = getItem(position); holder.mItem = getItem(position);
holder.mContentView.setText(holder.mItem.name); holder.mContentView.setText(holder.mItem.name);
holder.itemView.setOnClickListener(v -> { holder.itemView.setOnClickListener(v -> {
@@ -59,12 +57,12 @@ public class EditTraitsRecyclerViewAdapter extends ListAdapter<Trait, EditTraits
public final TextView mContentView; public final TextView mContentView;
public Trait mItem; public Trait mItem;
public ViewHolder(FragmentEditTraitsListItemBinding binding) { public ViewHolder(@NonNull FragmentEditTraitsListItemBinding binding) {
super(binding.getRoot()); super(binding.getRoot());
mContentView = binding.content; mContentView = binding.content;
} }
@NotNull @NonNull
@Override @Override
public String toString() { public String toString() {
return super.toString() + " '" + mContentView.getText() + "'"; return super.toString() + " '" + mContentView.getText() + "'";

View File

@@ -114,7 +114,7 @@ public class LibraryFragment extends MCFragment {
}); });
} }
protected void navigateToMonsterDetail(UUID monsterId) { protected void navigateToMonsterDetail(@NonNull UUID monsterId) {
NavDirections action = LibraryFragmentDirections.actionNavigationLibraryToNavigationMonster(monsterId.toString()); NavDirections action = LibraryFragmentDirections.actionNavigationLibraryToNavigationMonster(monsterId.toString());
Navigation.findNavController(requireView()).navigate(action); Navigation.findNavController(requireView()).navigate(action);
} }

View File

@@ -27,7 +27,7 @@ public class LibraryRecyclerViewAdapter extends RecyclerView.Adapter<LibraryRecy
private final Flowable<List<Monster>> mItemsObservable; private final Flowable<List<Monster>> mItemsObservable;
private final View.OnClickListener mOnClickListener = new View.OnClickListener() { private final View.OnClickListener mOnClickListener = new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(@NonNull View view) {
Monster monster = (Monster) view.getTag(); Monster monster = (Monster) view.getTag();
if (mOnClick != null) { if (mOnClick != null) {
mOnClick.onItemCallback(monster); mOnClick.onItemCallback(monster);

View File

@@ -99,7 +99,7 @@ public class MonsterDetailFragment extends MCFragment {
return root; return root;
} }
private void setupLabeledTextView(TextView view, String text, int titleId) { private void setupLabeledTextView(@NonNull TextView view, String text, int titleId) {
String title = getString(titleId); String title = getString(titleId);
String fullText = String.format("<b>%s</b> %s", title, text); String fullText = String.format("<b>%s</b> %s", title, text);
view.setText(Html.fromHtml(fullText)); view.setText(Html.fromHtml(fullText));
@@ -214,7 +214,7 @@ public class MonsterDetailFragment extends MCFragment {
final TextView regionalEffects_label; final TextView regionalEffects_label;
final ImageView regionalEffects_divider; final ImageView regionalEffects_divider;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
name = root.findViewById(R.id.name); name = root.findViewById(R.id.name);
meta = root.findViewById(R.id.meta); meta = root.findViewById(R.id.meta);
armorClass = root.findViewById(R.id.armorClass); armorClass = root.findViewById(R.id.armorClass);

View File

@@ -1,5 +1,6 @@
package com.majinnaibu.monstercards.ui.monster; package com.majinnaibu.monstercards.ui.monster;
import androidx.annotation.NonNull;
import androidx.lifecycle.LiveData; import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModel;
@@ -180,7 +181,7 @@ public class MonsterDetailViewModel extends ViewModel {
return mMonsterId; return mMonsterId;
} }
public void setMonster(Monster monster) { public void setMonster(@NonNull Monster monster) {
mMonster = monster; mMonster = monster;
mAbilities.setValue(mMonster.getAbilityDescriptions()); mAbilities.setValue(mMonster.getAbilityDescriptions());
mActions.setValue(mMonster.getActionDescriptions()); mActions.setValue(mMonster.getActionDescriptions());

View File

@@ -88,7 +88,7 @@ public class MonsterImportFragment extends MCFragment {
return root; return root;
} }
private void setupLabeledTextView(TextView view, String text, int titleId) { private void setupLabeledTextView(@NonNull TextView view, String text, int titleId) {
String title = getString(titleId); String title = getString(titleId);
String fullText = String.format("<b>%s</b> %s", title, text); String fullText = String.format("<b>%s</b> %s", title, text);
view.setText(Html.fromHtml(fullText)); view.setText(Html.fromHtml(fullText));
@@ -184,7 +184,7 @@ public class MonsterImportFragment extends MCFragment {
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
private void navigateToEditMonster(UUID monsterId) { private void navigateToEditMonster(@NonNull UUID monsterId) {
NavController navController = Navigation.findNavController(requireView()); NavController navController = Navigation.findNavController(requireView());
NavDirections action; NavDirections action;
action = MonsterImportFragmentDirections.actionMonsterImportFragmentToNavigationLibrary(); action = MonsterImportFragmentDirections.actionMonsterImportFragmentToNavigationLibrary();
@@ -234,7 +234,7 @@ public class MonsterImportFragment extends MCFragment {
final TextView regionalEffects_label; final TextView regionalEffects_label;
final ImageView regionalEffects_divider; final ImageView regionalEffects_divider;
ViewHolder(View root) { ViewHolder(@NonNull View root) {
this.root = root; this.root = root;
name = root.findViewById(R.id.name); name = root.findViewById(R.id.name);
meta = root.findViewById(R.id.meta); meta = root.findViewById(R.id.meta);

View File

@@ -1,5 +1,6 @@
package com.majinnaibu.monstercards.ui.monster; package com.majinnaibu.monstercards.ui.monster;
import androidx.annotation.NonNull;
import androidx.lifecycle.LiveData; import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModel;
@@ -183,7 +184,7 @@ public class MonsterImportViewModel extends ViewModel {
return mMonster; return mMonster;
} }
public void setMonster(Monster monster) { public void setMonster(@NonNull Monster monster) {
mMonster = monster; mMonster = monster;
mAbilities.setValue(mMonster.getAbilityDescriptions()); mAbilities.setValue(mMonster.getAbilityDescriptions());
mActions.setValue(mMonster.getActionDescriptions()); mActions.setValue(mMonster.getActionDescriptions());

View File

@@ -13,8 +13,6 @@ import com.majinnaibu.monstercards.data.MonsterRepository;
import com.majinnaibu.monstercards.models.Monster; import com.majinnaibu.monstercards.models.Monster;
import com.majinnaibu.monstercards.utils.Logger; import com.majinnaibu.monstercards.utils.Logger;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -52,7 +50,7 @@ public class SearchResultsRecyclerViewAdapter extends RecyclerView.Adapter<Searc
throwable -> Logger.logError("Error performing search", throwable)); throwable -> Logger.logError("Error performing search", throwable));
} }
@NotNull @NonNull
@Override @Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()) View view = LayoutInflater.from(parent.getContext())
@@ -61,7 +59,7 @@ public class SearchResultsRecyclerViewAdapter extends RecyclerView.Adapter<Searc
} }
@Override @Override
public void onBindViewHolder(final ViewHolder holder, int position) { public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
Monster monster = mValues.get(position); Monster monster = mValues.get(position);
holder.mContentView.setText(monster.name); holder.mContentView.setText(monster.name);
holder.itemView.setTag(monster); holder.itemView.setTag(monster);

View File

@@ -25,7 +25,7 @@ public class SwipeToDeleteCallback extends ItemTouchHelper.SimpleCallback {
private final OnMoveCallback mOnMove; private final OnMoveCallback mOnMove;
private final Context mContext; private final Context mContext;
public SwipeToDeleteCallback(Context context, OnSwipeCallback onDelete, OnMoveCallback onMove) { public SwipeToDeleteCallback(@NonNull Context context, OnSwipeCallback onDelete, OnMoveCallback onMove) {
super(onMove == null ? 0 : ItemTouchHelper.UP | ItemTouchHelper.DOWN, onDelete == null ? 0 : ItemTouchHelper.LEFT); super(onMove == null ? 0 : ItemTouchHelper.UP | ItemTouchHelper.DOWN, onDelete == null ? 0 : ItemTouchHelper.LEFT);
mOnDelete = onDelete; mOnDelete = onDelete;
mOnMove = onMove; mOnMove = onMove;

View File

@@ -4,6 +4,7 @@ import androidx.lifecycle.MutableLiveData;
import java.util.Objects; import java.util.Objects;
@SuppressWarnings("unused")
public class ChangeTrackedLiveData<T> extends MutableLiveData<T> { public class ChangeTrackedLiveData<T> extends MutableLiveData<T> {
private final OnValueChangedCallback<T> mOnValueChangedCallback; private final OnValueChangedCallback<T> mOnValueChangedCallback;
private final OnValueDirtiedCallback mOnValueDirtiedCallback; private final OnValueDirtiedCallback mOnValueDirtiedCallback;

View File

@@ -2,6 +2,7 @@ package com.majinnaibu.monstercards.utils;
import android.util.Log; import android.util.Log;
@SuppressWarnings("unused")
public class Logger { public class Logger {
public static final String LOG_TAG = "MonsterCards"; public static final String LOG_TAG = "MonsterCards";
@@ -37,7 +38,7 @@ public class Logger {
StackTraceElement stackTraceElement = throwable.getStackTrace()[0]; StackTraceElement stackTraceElement = throwable.getStackTrace()[0];
String location = stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber(); String location = stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber();
String message = String.format("Unexpected error occured at %s.", location); String message = String.format("Unexpected error occurred at %s.", location);
Log.wtf(LOG_TAG, message, throwable); Log.wtf(LOG_TAG, message, throwable);
} }
@@ -55,7 +56,7 @@ public class Logger {
StackTraceElement stackTraceElement = throwable.getStackTrace()[0]; StackTraceElement stackTraceElement = throwable.getStackTrace()[0];
String location = stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber(); String location = stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber();
String message = String.format("Unexpected error occured at %s.", location); String message = String.format("Unexpected error occurred at %s.", location);
Log.e(LOG_TAG, message, throwable); Log.e(LOG_TAG, message, throwable);
} }
@@ -73,7 +74,7 @@ public class Logger {
StackTraceElement stackTraceElement = throwable.getStackTrace()[0]; StackTraceElement stackTraceElement = throwable.getStackTrace()[0];
String location = stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber(); String location = stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber();
String message = String.format("Unexpected error occured at %s.", location); String message = String.format("Unexpected error occurred at %s.", location);
Log.w(LOG_TAG, message, throwable); Log.w(LOG_TAG, message, throwable);
} }
@@ -91,7 +92,7 @@ public class Logger {
StackTraceElement stackTraceElement = throwable.getStackTrace()[0]; StackTraceElement stackTraceElement = throwable.getStackTrace()[0];
String location = stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber(); String location = stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber();
String message = String.format("Unexpected error occured at %s.", location); String message = String.format("Unexpected error occurred at %s.", location);
Log.i(LOG_TAG, message, throwable); Log.i(LOG_TAG, message, throwable);
} }
@@ -109,7 +110,7 @@ public class Logger {
StackTraceElement stackTraceElement = throwable.getStackTrace()[0]; StackTraceElement stackTraceElement = throwable.getStackTrace()[0];
String location = stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber(); String location = stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber();
String message = String.format("Unexpected error occured at %s.", location); String message = String.format("Unexpected error occurred at %s.", location);
Log.d(LOG_TAG, message, throwable); Log.d(LOG_TAG, message, throwable);
} }
@@ -127,7 +128,7 @@ public class Logger {
StackTraceElement stackTraceElement = throwable.getStackTrace()[0]; StackTraceElement stackTraceElement = throwable.getStackTrace()[0];
String location = stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber(); String location = stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber();
String message = String.format("Unexpected error occured at %s.", location); String message = String.format("Unexpected error occurred at %s.", location);
Log.v(LOG_TAG, message, throwable); Log.v(LOG_TAG, message, throwable);
} }

View File

@@ -3,6 +3,7 @@ package com.majinnaibu.monstercards.utils;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
@SuppressWarnings("unused")
public class TextChangedListener implements TextWatcher { public class TextChangedListener implements TextWatcher {
private final BeforeTextChangedCallback mBeforeTextChangedCallback; private final BeforeTextChangedCallback mBeforeTextChangedCallback;

View File

@@ -1,9 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<attr name="label" format="string" localization="suggested" />
<declare-styleable name="Stepper"> <declare-styleable name="Stepper">
<attr name="stepAmount" format="integer" /> <attr name="stepAmount" format="integer" />
<attr name="minValue" format="integer" /> <attr name="minValue" format="integer" />
<attr name="maxValue" format="integer" /> <attr name="maxValue" format="integer" />
<attr name="label" format="string" localization="suggested" /> <attr name="label" />
</declare-styleable> </declare-styleable>
</resources> <declare-styleable name="AbilityScorePicker">
<attr name="label" />
</declare-styleable>
</resources>

View File

@@ -34,6 +34,7 @@
<string name="label_can_hover">Can Hover</string> <string name="label_can_hover">Can Hover</string>
<string name="label_can_speak_language">Can Speak</string> <string name="label_can_speak_language">Can Speak</string>
<string name="label_challenge_rating">Challenge Rating</string> <string name="label_challenge_rating">Challenge Rating</string>
<string name="label_challenge_rating_with_value">CR %s</string>
<string name="label_challengeRating_icon">CR</string> <string name="label_challengeRating_icon">CR</string>
<string name="label_charisma">Charisma</string> <string name="label_charisma">Charisma</string>
<string name="label_climb_speed">Climb Speed</string> <string name="label_climb_speed">Climb Speed</string>