Compare commits
10 Commits
053a640631
...
7a63a11e93
| Author | SHA1 | Date | |
|---|---|---|---|
| 7a63a11e93 | |||
| 837005965b | |||
| 90766aaa66 | |||
| 453b606160 | |||
| de2275113f | |||
| 35659810f9 | |||
|
|
bf6220b339 | ||
|
|
7b09098833 | ||
|
|
26df28512c | ||
|
|
f47881b9ad |
43
.idea/misc.xml
generated
43
.idea/misc.xml
generated
@@ -1,5 +1,48 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<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">
|
||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||
</component>
|
||||
|
||||
@@ -21,7 +21,7 @@ def gson_version = '2.8.6'
|
||||
|
||||
android {
|
||||
compileSdkVersion 30
|
||||
buildToolsVersion '30.0.2'
|
||||
buildToolsVersion '30.0.3'
|
||||
|
||||
defaultConfig {
|
||||
applicationId "com.majinnaibu.monstercards"
|
||||
@@ -70,21 +70,21 @@ dependencies {
|
||||
implementation fileTree(dir: "libs", include: ["*.jar"])
|
||||
|
||||
// Google
|
||||
implementation 'androidx.appcompat:appcompat:1.2.0'
|
||||
implementation 'com.google.android.material:material:1.3.0'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
|
||||
implementation 'androidx.appcompat:appcompat:1.3.1'
|
||||
implementation 'com.google.android.material:material:1.4.0'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
|
||||
implementation "androidx.navigation:navigation-fragment:$nav_version"
|
||||
implementation "androidx.navigation:navigation-ui:$nav_version"
|
||||
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
|
||||
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
|
||||
implementation 'androidx.recyclerview:recyclerview:1.1.0'
|
||||
implementation 'androidx.recyclerview:recyclerview:1.2.1'
|
||||
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
|
||||
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
|
||||
|
||||
// Testing
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
||||
|
||||
// Room DB
|
||||
implementation "io.reactivex.rxjava3:rxjava:$rxjava_version"
|
||||
@@ -106,4 +106,4 @@ dependencies {
|
||||
// Other 3rd Party
|
||||
implementation 'com.atlassian.commonmark:commonmark:0.15.2'
|
||||
implementation "com.google.code.gson:gson:$gson_version"
|
||||
}
|
||||
}
|
||||
|
||||
13
app/proguard-rules.pro
vendored
13
app/proguard-rules.pro
vendored
@@ -18,4 +18,15 @@
|
||||
|
||||
# If you keep the line number information, uncomment this to
|
||||
# hide the original source file name.
|
||||
#-renamesourcefileattribute SourceFile
|
||||
#-renamesourcefileattribute SourceFile
|
||||
|
||||
-keep enum com.majinnaibu.monstercards.data.enums.AbilityScore
|
||||
-keep enum com.majinnaibu.monstercards.data.enums.ProficiencyType
|
||||
-keep enum com.majinnaibu.monstercards.data.enums.AdvantageType
|
||||
-keep enum com.majinnaibu.monstercards.data.enums.TraitType
|
||||
-keep enum com.majinnaibu.monstercards.data.enums.StringType
|
||||
-keepclassmembers,allowoptimization enum * {
|
||||
<fields>;
|
||||
public static **[] values();
|
||||
public static ** valueOf(java.lang.String);
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import android.os.Bundle;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.navigation.NavController;
|
||||
import androidx.navigation.NavDirections;
|
||||
@@ -54,9 +55,7 @@ public class MainActivity extends AppCompatActivity {
|
||||
.build();
|
||||
NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
|
||||
NavController navController = navHostFragment.getNavController();
|
||||
navController.addOnDestinationChangedListener((controller, destination, arguments) -> {
|
||||
FlipperInitializer.sendNavigationEvent(controller, destination, arguments);
|
||||
});
|
||||
navController.addOnDestinationChangedListener(FlipperInitializer::sendNavigationEvent);
|
||||
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
|
||||
NavigationUI.setupWithNavController(navView, navController);
|
||||
onNewIntent(getIntent());
|
||||
@@ -68,14 +67,15 @@ public class MainActivity extends AppCompatActivity {
|
||||
|
||||
String json = readMonsterJSONFromIntent(intent);
|
||||
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();
|
||||
NavDirections action = MobileNavigationDirections.actionGlobalMonsterImportFragment(json);
|
||||
navController.navigate(action);
|
||||
}
|
||||
}
|
||||
|
||||
private String readMonsterJSONFromIntent(Intent intent) {
|
||||
@Nullable
|
||||
private String readMonsterJSONFromIntent(@NonNull Intent intent) {
|
||||
String action = intent.getAction();
|
||||
Bundle extras = intent.getExtras();
|
||||
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))) {
|
||||
uri = intent.getData();
|
||||
} 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) {
|
||||
return null;
|
||||
@@ -98,6 +98,7 @@ public class MainActivity extends AppCompatActivity {
|
||||
return json;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private String readContentsOfUri(Uri uri) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
try (InputStream inputStream =
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.majinnaibu.monstercards.data;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.majinnaibu.monstercards.data.enums.AbilityScore;
|
||||
import com.majinnaibu.monstercards.data.enums.AdvantageType;
|
||||
import com.majinnaibu.monstercards.data.enums.ArmorType;
|
||||
@@ -12,6 +14,7 @@ import com.majinnaibu.monstercards.models.Trait;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public final class DevContent {
|
||||
@NonNull
|
||||
public static Monster createSampleMonster() {
|
||||
Monster monster = new Monster();
|
||||
// Name
|
||||
|
||||
@@ -47,7 +47,7 @@ public class MonsterRepository {
|
||||
.observeOn(AndroidSchedulers.mainThread());
|
||||
}
|
||||
|
||||
public Flowable<Monster> getMonster(UUID monsterId) {
|
||||
public Flowable<Monster> getMonster(@NonNull UUID monsterId) {
|
||||
return m_db.monsterDAO()
|
||||
.loadAllByIds(new String[]{monsterId.toString()})
|
||||
.map(
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.majinnaibu.monstercards.data.converters;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.room.TypeConverter;
|
||||
|
||||
import com.majinnaibu.monstercards.data.enums.ArmorType;
|
||||
@@ -7,7 +8,7 @@ import com.majinnaibu.monstercards.data.enums.ArmorType;
|
||||
public class ArmorTypeConverter {
|
||||
|
||||
@TypeConverter
|
||||
public static String fromArmorType(ArmorType armorType) {
|
||||
public static String fromArmorType(@NonNull ArmorType armorType) {
|
||||
return armorType.stringValue;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.majinnaibu.monstercards.data.converters;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.room.TypeConverter;
|
||||
|
||||
import com.majinnaibu.monstercards.data.enums.ChallengeRating;
|
||||
@@ -7,7 +8,7 @@ import com.majinnaibu.monstercards.data.enums.ChallengeRating;
|
||||
public class ChallengeRatingConverter {
|
||||
|
||||
@TypeConverter
|
||||
public static String fromChallengeRating(ChallengeRating challengeRating) {
|
||||
public static String fromChallengeRating(@NonNull ChallengeRating challengeRating) {
|
||||
return challengeRating.stringValue;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
package com.majinnaibu.monstercards.data.converters;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.room.TypeConverter;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public class UUIDConverter {
|
||||
|
||||
@NonNull
|
||||
@TypeConverter
|
||||
public static String fromUUID(UUID uuid) {
|
||||
public static String fromUUID(@NonNull UUID uuid) {
|
||||
return uuid.toString();
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ public enum AbilityScore {
|
||||
STRENGTH("strength", "Strength", "STR"),
|
||||
DEXTERITY("dexterity", "Dexterity", "DEX"),
|
||||
CONSTITUTION("constitution", "Constitution", "CON"),
|
||||
INTELLIGENCE("intellligence", "Intelligence", "INT"),
|
||||
INTELLIGENCE("intelligence", "Intelligence", "INT"),
|
||||
WISDOM("wisdom", "Wisdom", "WIS"),
|
||||
CHARISMA("charisma", "Charisma", "CHA"),
|
||||
;
|
||||
|
||||
@@ -3,7 +3,7 @@ package com.majinnaibu.monstercards.data.enums;
|
||||
public enum ProficiencyType {
|
||||
NONE("none", "None", ""),
|
||||
PROFICIENT("proficient", "Proficient", "P"),
|
||||
EXPERTISE("experties", "Expertise", "Ex"),
|
||||
EXPERTISE("expertise", "Expertise", "Ex"),
|
||||
;
|
||||
|
||||
public final String displayName;
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
package com.majinnaibu.monstercards.helpers;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
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++) {
|
||||
if (Objects.equals(array[index], target)) {
|
||||
return index;
|
||||
|
||||
@@ -4,9 +4,6 @@ import org.commonmark.node.Document;
|
||||
import org.commonmark.node.Node;
|
||||
import org.commonmark.node.Paragraph;
|
||||
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;
|
||||
|
||||
public final class CommonMarkHelper {
|
||||
@@ -27,12 +24,4 @@ public final class CommonMarkHelper {
|
||||
HtmlRenderer renderer = HtmlRenderer.builder().build();
|
||||
return renderer.render(document);
|
||||
}
|
||||
|
||||
private static final class MyNodeRendererFactory implements HtmlNodeRendererFactory {
|
||||
|
||||
@Override
|
||||
public NodeRenderer create(HtmlNodeRendererContext context) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.majinnaibu.monstercards.helpers;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonElement;
|
||||
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.Trait;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
|
||||
public class MonsterImportHelper {
|
||||
@NonNull
|
||||
public static Monster fromJSON(String json) {
|
||||
JsonParser parser = new JsonParser();
|
||||
JsonObject rootDict = parser.parse(json).getAsJsonObject();
|
||||
JsonObject rootDict = JsonParser.parseString(json).getAsJsonObject();
|
||||
|
||||
Monster monster = new Monster();
|
||||
monster.name = Helpers.getString(rootDict, "name");
|
||||
@@ -110,7 +111,7 @@ public class MonsterImportHelper {
|
||||
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)) {
|
||||
return dict.get(name).getAsString();
|
||||
}
|
||||
@@ -122,13 +123,19 @@ public class MonsterImportHelper {
|
||||
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)) {
|
||||
JsonElement element = dict.get(name);
|
||||
if (element.isJsonPrimitive()) {
|
||||
JsonPrimitive rawValue = element.getAsJsonPrimitive();//dict.getAsJsonPrimitive(name);
|
||||
JsonPrimitive rawValue = element.getAsJsonPrimitive();
|
||||
if (rawValue.isNumber()) {
|
||||
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);
|
||||
}
|
||||
|
||||
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)) {
|
||||
JsonElement element = dict.get(name);
|
||||
if (element.isJsonPrimitive()) {
|
||||
JsonPrimitive rawValue = element.getAsJsonPrimitive();
|
||||
if (rawValue.isBoolean()) {
|
||||
return rawValue.getAsBoolean();
|
||||
} else {
|
||||
try {
|
||||
return rawValue.getAsBoolean();
|
||||
} catch (Exception ex) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@NonNull
|
||||
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) {
|
||||
@@ -164,8 +178,8 @@ public class MonsterImportHelper {
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static List<Trait> getListOfTraits(@NotNull JsonObject dict, String name) {
|
||||
@NonNull
|
||||
public static List<Trait> getListOfTraits(@NonNull JsonObject dict, String name) {
|
||||
ArrayList<Trait> traits = new ArrayList<>();
|
||||
if (dict.has(name)) {
|
||||
JsonElement arrayElement = dict.get(name);
|
||||
@@ -187,7 +201,7 @@ public class MonsterImportHelper {
|
||||
return traits;
|
||||
}
|
||||
|
||||
public static void addSavingThrows(Monster monster, JsonObject root) {
|
||||
public static void addSavingThrows(Monster monster, @NonNull JsonObject root) {
|
||||
if (root.has("sthrows")) {
|
||||
JsonElement arrayElement = root.get("sthrows");
|
||||
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<>();
|
||||
if (root.has("skills")) {
|
||||
JsonElement arrayElement = root.get("skills");
|
||||
@@ -241,11 +256,13 @@ public class MonsterImportHelper {
|
||||
return skills;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static Set<String> getSetOfDamageTypes(JsonObject rootDict, String name) {
|
||||
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<>();
|
||||
if (root.has(name)) {
|
||||
JsonElement arrayElement = root.get(name);
|
||||
@@ -268,7 +285,8 @@ public class MonsterImportHelper {
|
||||
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<>();
|
||||
if (root.has(name)) {
|
||||
JsonElement arrayElement = root.get(name);
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
package com.majinnaibu.monstercards.helpers;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
@SuppressWarnings({"RedundantIfStatement"})
|
||||
@@ -16,7 +19,8 @@ public final class StringHelper {
|
||||
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();
|
||||
if (length < 1) {
|
||||
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();
|
||||
if (length < 1) {
|
||||
return "";
|
||||
@@ -59,6 +63,7 @@ public final class StringHelper {
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static Integer parseInt(String s) {
|
||||
try {
|
||||
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
|
||||
return text.toLowerCase().contains(search.toLowerCase());
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.majinnaibu.monstercards.models;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.util.Comparator;
|
||||
@@ -43,7 +44,7 @@ public class Language implements Comparator<Language>, Comparable<Language> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compare(Language o1, Language o2) {
|
||||
public int compare(@NonNull Language o1, Language o2) {
|
||||
if (o1.mSpeaks && !o2.mSpeaks) {
|
||||
return -1;
|
||||
}
|
||||
@@ -54,7 +55,7 @@ public class Language implements Comparator<Language>, Comparable<Language> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(@Nullable @org.jetbrains.annotations.Nullable Object obj) {
|
||||
public boolean equals(@Nullable Object obj) {
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.majinnaibu.monstercards.models;
|
||||
import android.annotation.SuppressLint;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.room.ColumnInfo;
|
||||
import androidx.room.Entity;
|
||||
import androidx.room.PrimaryKey;
|
||||
@@ -13,8 +14,7 @@ import com.majinnaibu.monstercards.data.enums.ArmorType;
|
||||
import com.majinnaibu.monstercards.data.enums.ChallengeRating;
|
||||
import com.majinnaibu.monstercards.data.enums.ProficiencyType;
|
||||
import com.majinnaibu.monstercards.helpers.StringHelper;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import com.majinnaibu.monstercards.utils.Logger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@@ -304,7 +304,7 @@ public class Monster {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public int getAbilityScore(@NotNull AbilityScore abilityScore) {
|
||||
public int getAbilityScore(@NonNull AbilityScore abilityScore) {
|
||||
switch (abilityScore) {
|
||||
case STRENGTH:
|
||||
return strengthScore;
|
||||
@@ -323,7 +323,7 @@ public class Monster {
|
||||
}
|
||||
}
|
||||
|
||||
public int getAbilityModifier(@NotNull AbilityScore abilityScore) {
|
||||
public int getAbilityModifier(@NonNull AbilityScore abilityScore) {
|
||||
switch (abilityScore) {
|
||||
case STRENGTH:
|
||||
return getStrengthModifier();
|
||||
@@ -342,7 +342,7 @@ public class Monster {
|
||||
}
|
||||
}
|
||||
|
||||
public AdvantageType getSavingThrowAdvantageType(@NotNull AbilityScore abilityScore) {
|
||||
public AdvantageType getSavingThrowAdvantageType(@NonNull AbilityScore abilityScore) {
|
||||
switch (abilityScore) {
|
||||
case STRENGTH:
|
||||
return strengthSavingThrowAdvantage;
|
||||
@@ -361,7 +361,7 @@ public class Monster {
|
||||
}
|
||||
}
|
||||
|
||||
public ProficiencyType getSavingThrowProficiencyType(@NotNull AbilityScore abilityScore) {
|
||||
public ProficiencyType getSavingThrowProficiencyType(@NonNull AbilityScore abilityScore) {
|
||||
switch (abilityScore) {
|
||||
case STRENGTH:
|
||||
return strengthSavingThrowProficiency;
|
||||
@@ -461,6 +461,54 @@ public class Monster {
|
||||
}
|
||||
}
|
||||
|
||||
public int getArmorClassValue() {
|
||||
boolean hasShield = shieldBonus != 0;
|
||||
ArmorType armorType = this.armorType != null ? this.armorType : ArmorType.NONE;
|
||||
switch (armorType) {
|
||||
case NATURAL_ARMOR:
|
||||
// 10 + dexMod + naturalArmorBonus + 2 for shieldBonus "16 (natural armor)" or "18 (natural armor, shield)"
|
||||
return armorType.baseArmorClass + getDexterityModifier() + naturalArmorBonus + shieldBonus;
|
||||
case MAGE_ARMOR:
|
||||
// 10 + dexMod + 2 for shield + 3 for mage armor "15 (18 with mage armor)" or 17 (shield, 20 with mage armor)
|
||||
return armorType.baseArmorClass + 3 + getDexterityModifier() + shieldBonus;
|
||||
case NONE:
|
||||
// 10 + dexMod + 2 for shieldBonus "15" or "17 (shield)"
|
||||
case PADDED:
|
||||
// 11 + dexMod + 2 for shield "18 (padded armor, shield)"
|
||||
case LEATHER:
|
||||
// 11 + dexMod + 2 for shield "18 (leather, shield)"
|
||||
case STUDDED_LEATHER:
|
||||
// 12 + dexMod +2 for shield "17 (studded leather)"
|
||||
return armorType.baseArmorClass + getDexterityModifier() + shieldBonus;
|
||||
case HIDE:
|
||||
// 12 + Min(2, dexMod) + 2 for shield "12 (hide armor)"
|
||||
case CHAIN_SHIRT:
|
||||
// 13 + Min(2, dexMod) + 2 for shield "12 (chain shirt)"
|
||||
case SCALE_MAIL:
|
||||
// 14 + Min(2, dexMod) + 2 for shield "14 (scale mail)"
|
||||
case BREASTPLATE:
|
||||
// 14 + Min(2, dexMod) + 2 for shield "16 (breastplate)"
|
||||
case HALF_PLATE:
|
||||
// 15 + Min(2, dexMod) + 2 for shield "17 (half plate)"
|
||||
return armorType.baseArmorClass + Math.min(2, getDexterityModifier()) + shieldBonus;
|
||||
case RING_MAIL:
|
||||
// 14 + 2 for shield "14 (ring mail)
|
||||
case CHAIN_MAIL:
|
||||
// 16 + 2 for shield "16 (chain mail)"
|
||||
case SPLINT_MAIL:
|
||||
// 17 + 2 for shield "17 (splint)"
|
||||
case PLATE_MAIL:
|
||||
// 18 + 2 for shield "18 (plate)"
|
||||
return armorType.baseArmorClass + shieldBonus;
|
||||
case OTHER:
|
||||
// pure string value shield check does nothing just copies the string from otherArmorDesc
|
||||
return 0;
|
||||
default:
|
||||
Logger.logUnimplementedFeature(String.format("Getting the armor class value with an unknown armor type %s", armorType));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
public String getHitPoints() {
|
||||
if (hasCustomHP) {
|
||||
return customHPDescription;
|
||||
@@ -475,6 +523,19 @@ public class Monster {
|
||||
}
|
||||
}
|
||||
|
||||
public int getHitPointsValue() {
|
||||
if (hasCustomHP) {
|
||||
return 0;
|
||||
} else {
|
||||
int dieSize = Helpers.getHitDieForSize(size);
|
||||
int conMod = getConstitutionModifier();
|
||||
// For PC style calculations use this
|
||||
//return (int) Math.max(1, Math.ceil(dieSize + conMod + (hitDice - 1) * ((dieSize + 1) / 2.0 + conMod)));
|
||||
// For monster style calculations use this
|
||||
return (int) Math.max(1, Math.ceil(hitDice * ((dieSize + 1) / 2.0 + conMod)));
|
||||
}
|
||||
}
|
||||
|
||||
public String getSpeedText() {
|
||||
if (hasCustomSpeed) {
|
||||
return customSpeedDescription;
|
||||
@@ -546,7 +607,7 @@ public class Monster {
|
||||
}
|
||||
}
|
||||
|
||||
public int getProficiencyBonus(@NotNull ProficiencyType proficiencyType) {
|
||||
public int getProficiencyBonus(@NonNull ProficiencyType proficiencyType) {
|
||||
switch (proficiencyType) {
|
||||
case PROFICIENT:
|
||||
return getProficiencyBonus();
|
||||
@@ -690,7 +751,7 @@ public class Monster {
|
||||
return abilityDescriptions;
|
||||
}
|
||||
|
||||
public String getPlaceholderReplacedText(@NotNull String rawText) {
|
||||
public String getPlaceholderReplacedText(@NonNull String rawText) {
|
||||
return rawText
|
||||
.replaceAll("\\[STR SAVE]", String.format("%+d", getSpellSaveDC(AbilityScore.STRENGTH)))
|
||||
.replaceAll("\\[STR ATK]", String.format("%+d", getAttackBonus(AbilityScore.STRENGTH)))
|
||||
@@ -754,6 +815,235 @@ public class Monster {
|
||||
return actionDescriptions;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(@Nullable Object obj) {
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
if (!(obj instanceof Monster)) {
|
||||
return false;
|
||||
}
|
||||
Monster other = (Monster) obj;
|
||||
if (!challengeRating.equals(other.challengeRating)) {
|
||||
return false;
|
||||
}
|
||||
if (!understandsButDescription.equals(other.understandsButDescription)) {
|
||||
return false;
|
||||
}
|
||||
if (!languages.equals(other.languages)) {
|
||||
return false;
|
||||
}
|
||||
if (!damageVulnerabilities.equals(other.damageVulnerabilities)) {
|
||||
return false;
|
||||
}
|
||||
if (!damageResistances.equals(other.damageResistances)) {
|
||||
return false;
|
||||
}
|
||||
if (!damageImmunities.equals(other.damageImmunities)) {
|
||||
return false;
|
||||
}
|
||||
if (!conditionImmunities.equals(other.conditionImmunities)) {
|
||||
return false;
|
||||
}
|
||||
if (!charismaSavingThrowProficiency.equals(other.charismaSavingThrowProficiency)) {
|
||||
return false;
|
||||
}
|
||||
if (!wisdomSavingThrowProficiency.equals(other.wisdomSavingThrowProficiency)) {
|
||||
return false;
|
||||
}
|
||||
if (!intelligenceSavingThrowProficiency.equals(other.intelligenceSavingThrowProficiency)) {
|
||||
return false;
|
||||
}
|
||||
if (constitutionSavingThrowProficiency.equals(other.constitutionSavingThrowProficiency)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (dexteritySavingThrowProficiency.equals(other.dexteritySavingThrowProficiency)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (strengthSavingThrowProficiency.equals(other.strengthSavingThrowProficiency)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (legendaryActions.equals(other.legendaryActions)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (customChallengeRatingDescription.equals(other.customChallengeRatingDescription)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (customSpeedDescription.equals(other.customSpeedDescription)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (customHPDescription.equals(other.customHPDescription)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (otherArmorDescription.equals(other.otherArmorDescription)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (alignment.equals(other.alignment)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (subtype.equals(other.subtype)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (abilities.equals(other.abilities)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (actions.equals(other.actions)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (armorType.equals(other.armorType)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (charismaSavingThrowAdvantage.equals(other.charismaSavingThrowAdvantage)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (constitutionSavingThrowAdvantage.equals(other.constitutionSavingThrowAdvantage)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (dexteritySavingThrowAdvantage.equals(other.dexteritySavingThrowAdvantage)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (hitDice == other.hitDice) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (id.equals(other.id)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (intelligenceSavingThrowAdvantage.equals(other.intelligenceSavingThrowAdvantage)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (lairActions.equals(other.lairActions)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (name.equals(other.name)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (reactions.equals(other.reactions)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (regionalActions.equals(other.regionalActions)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (senses.equals(other.senses)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (shieldBonus == other.shieldBonus) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (size.equals(other.size)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (skills.equals(other.skills)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (strengthSavingThrowAdvantage.equals(other.strengthSavingThrowAdvantage)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (strengthScore == other.strengthScore) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (type.equals(other.type)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (wisdomSavingThrowAdvantage.equals(other.wisdomSavingThrowAdvantage)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (wisdomScore == other.wisdomScore) {
|
||||
return false;
|
||||
}
|
||||
if (customProficiencyBonus == other.customProficiencyBonus) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (telepathyRange == other.telepathyRange) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (intelligenceScore == other.intelligenceScore) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (constitutionScore == other.constitutionScore) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (dexterityScore == other.dexterityScore) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (hasCustomSpeed == other.hasCustomSpeed) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (hasCustomHP == other.hasCustomHP) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (swimSpeed == other.swimSpeed) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (flySpeed == other.flySpeed) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (climbSpeed == other.climbSpeed) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (burrowSpeed == other.burrowSpeed) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (walkSpeed == other.walkSpeed) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (naturalArmorBonus == other.naturalArmorBonus) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (canHover == other.canHover) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (charismaScore == other.charismaScore) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static class Helpers {
|
||||
public static int getAbilityModifierForScore(int score) {
|
||||
return (int) Math.floor((score - 10) / 2.0);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -70,7 +70,7 @@ public class Skill implements Comparator<Skill>, Comparable<Skill> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(@Nullable @org.jetbrains.annotations.Nullable Object obj) {
|
||||
public boolean equals(@Nullable Object obj) {
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ public class Trait implements Comparator<Trait>, Comparable<Trait> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(@Nullable @org.jetbrains.annotations.Nullable Object obj) {
|
||||
public boolean equals(@Nullable Object obj) {
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -7,8 +7,6 @@ import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.lifecycle.Observer;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import com.majinnaibu.monstercards.R;
|
||||
@@ -23,12 +21,7 @@ public class CollectionsFragment extends MCFragment {
|
||||
collectionsViewModel = new ViewModelProvider(this).get(CollectionsViewModel.class);
|
||||
View root = inflater.inflate(R.layout.fragment_collections, container, false);
|
||||
final TextView textView = root.findViewById(R.id.text_collections);
|
||||
collectionsViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
|
||||
@Override
|
||||
public void onChanged(@Nullable String s) {
|
||||
textView.setText(s);
|
||||
}
|
||||
});
|
||||
collectionsViewModel.getText().observe(getViewLifecycleOwner(), textView::setText);
|
||||
return root;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import androidx.lifecycle.ViewModel;
|
||||
|
||||
public class CollectionsViewModel extends ViewModel {
|
||||
|
||||
private MutableLiveData<String> mText;
|
||||
private final MutableLiveData<String> mText;
|
||||
|
||||
public CollectionsViewModel() {
|
||||
mText = new MutableLiveData<>();
|
||||
|
||||
@@ -35,11 +35,12 @@ public class AbilityScorePicker extends LinearLayout {
|
||||
// TODO: use this as default but allow setting via attribute
|
||||
mLabel = "Ability Score";
|
||||
|
||||
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Stepper, 0, 0);
|
||||
String label = a.getString(R.styleable.Stepper_label);
|
||||
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AbilityScorePicker, 0, 0);
|
||||
String label = a.getString(R.styleable.AbilityScorePicker_label);
|
||||
if (label != null) {
|
||||
mLabel = label;
|
||||
}
|
||||
a.recycle();
|
||||
|
||||
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||
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 TextView label;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
spinner = root.findViewById(R.id.spinner);
|
||||
label = root.findViewById(R.id.label);
|
||||
}
|
||||
|
||||
@@ -88,7 +88,7 @@ public class AdvantagePicker extends ConstraintLayout {
|
||||
final MaterialRadioButton advantage;
|
||||
final MaterialRadioButton disadvantage;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
group = root.findViewById(R.id.group);
|
||||
none = root.findViewById(R.id.hasNoAdvantage);
|
||||
advantage = root.findViewById(R.id.hasAdvantage);
|
||||
|
||||
@@ -88,7 +88,7 @@ public class ProficiencyPicker extends ConstraintLayout {
|
||||
final MaterialRadioButton proficient;
|
||||
final MaterialRadioButton expertise;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
group = root.findViewById(R.id.group);
|
||||
none = root.findViewById(R.id.none);
|
||||
proficient = root.findViewById(R.id.proficient);
|
||||
|
||||
@@ -17,6 +17,7 @@ import com.majinnaibu.monstercards.R;
|
||||
import java.util.Objects;
|
||||
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class Stepper extends ConstraintLayout {
|
||||
private final ViewHolder mHolder;
|
||||
private int mCurrentValue;
|
||||
@@ -138,7 +139,7 @@ public class Stepper extends ConstraintLayout {
|
||||
final Button increment;
|
||||
final Button decrement;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
text = root.findViewById(R.id.text);
|
||||
label = root.findViewById(R.id.label);
|
||||
increment = root.findViewById(R.id.increment);
|
||||
|
||||
@@ -1,27 +1,84 @@
|
||||
package com.majinnaibu.monstercards.ui.dashboard;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.navigation.NavDirections;
|
||||
import androidx.navigation.Navigation;
|
||||
import androidx.recyclerview.widget.GridLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.majinnaibu.monstercards.R;
|
||||
import com.majinnaibu.monstercards.models.Monster;
|
||||
import com.majinnaibu.monstercards.ui.shared.MCFragment;
|
||||
import com.majinnaibu.monstercards.utils.Logger;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.rxjava3.schedulers.Schedulers;
|
||||
|
||||
public class DashboardFragment extends MCFragment {
|
||||
|
||||
private DashboardViewModel dashboardViewModel;
|
||||
private DashboardViewModel mViewModel;
|
||||
private ViewHolder mHolder;
|
||||
private DashboardRecyclerViewAdapter mAdapter;
|
||||
|
||||
public View onCreateView(@NonNull LayoutInflater inflater,
|
||||
ViewGroup container, Bundle savedInstanceState) {
|
||||
dashboardViewModel = new ViewModelProvider(this).get(DashboardViewModel.class);
|
||||
mViewModel = new ViewModelProvider(this).get(DashboardViewModel.class);
|
||||
View root = inflater.inflate(R.layout.fragment_dashboard, container, false);
|
||||
final TextView textView = root.findViewById(R.id.text_dashboard);
|
||||
dashboardViewModel.getText().observe(getViewLifecycleOwner(), textView::setText);
|
||||
mHolder = new ViewHolder(root);
|
||||
|
||||
setupRecyclerView(mHolder.list);
|
||||
|
||||
getMonsterRepository()
|
||||
.getMonsters()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(monsters -> mViewModel.setMonsters(monsters));
|
||||
|
||||
return root;
|
||||
}
|
||||
}
|
||||
|
||||
private void setupRecyclerView(@NonNull RecyclerView recyclerView) {
|
||||
int columnCount = Math.max(1, getResources().getConfiguration().screenWidthDp / 396);
|
||||
Logger.logWTF(String.format(Locale.US, "Setting column count to %d", columnCount));
|
||||
Context context = requireContext();
|
||||
GridLayoutManager layoutManager = new GridLayoutManager(context, columnCount);
|
||||
recyclerView.setLayoutManager(layoutManager);
|
||||
|
||||
LiveData<List<Monster>> monsterData = mViewModel.getMonsters();
|
||||
mAdapter = new DashboardRecyclerViewAdapter(monster -> {
|
||||
if (monster != null) {
|
||||
navigateToMonsterDetail(monster);
|
||||
} else {
|
||||
Logger.logError("Can't navigate to MonsterDetailFragment with a null monster");
|
||||
}
|
||||
});
|
||||
if (monsterData != null) {
|
||||
monsterData.observe(getViewLifecycleOwner(), monsters -> mAdapter.submitList(monsters));
|
||||
}
|
||||
recyclerView.setAdapter(mAdapter);
|
||||
}
|
||||
|
||||
private void navigateToMonsterDetail(Monster monster) {
|
||||
NavDirections action = DashboardFragmentDirections.actionNavigationDashboardToNavigationMonster(monster.id.toString());
|
||||
Navigation.findNavController(requireView()).navigate(action);
|
||||
}
|
||||
|
||||
private static class ViewHolder {
|
||||
final RecyclerView list;
|
||||
|
||||
ViewHolder(View root) {
|
||||
list = root.findViewById(R.id.list);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,353 @@
|
||||
package com.majinnaibu.monstercards.ui.dashboard;
|
||||
|
||||
import android.text.Html;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.DiffUtil;
|
||||
import androidx.recyclerview.widget.ListAdapter;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.majinnaibu.monstercards.R;
|
||||
import com.majinnaibu.monstercards.data.enums.AbilityScore;
|
||||
import com.majinnaibu.monstercards.data.enums.AdvantageType;
|
||||
import com.majinnaibu.monstercards.data.enums.ChallengeRating;
|
||||
import com.majinnaibu.monstercards.data.enums.ProficiencyType;
|
||||
import com.majinnaibu.monstercards.databinding.CardMonsterBinding;
|
||||
import com.majinnaibu.monstercards.helpers.CommonMarkHelper;
|
||||
import com.majinnaibu.monstercards.models.Monster;
|
||||
import com.majinnaibu.monstercards.models.Trait;
|
||||
import com.majinnaibu.monstercards.utils.Logger;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
public class DashboardRecyclerViewAdapter extends ListAdapter<Monster, DashboardRecyclerViewAdapter.ViewHolder> {
|
||||
private static final DiffUtil.ItemCallback<Monster> DIFF_CALLBACK = new DiffUtil.ItemCallback<Monster>() {
|
||||
@Override
|
||||
public boolean areItemsTheSame(@NonNull Monster oldItem, @NonNull Monster newItem) {
|
||||
return oldItem.id.equals(newItem.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areContentsTheSame(@NonNull Monster oldItem, @NonNull Monster newItem) {
|
||||
return oldItem.equals(newItem);
|
||||
}
|
||||
};
|
||||
private final ItemCallback mOnClick;
|
||||
|
||||
protected DashboardRecyclerViewAdapter(ItemCallback onClick) {
|
||||
super(DIFF_CALLBACK);
|
||||
mOnClick = onClick;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
return new ViewHolder(CardMonsterBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
|
||||
Logger.logUnimplementedMethod();
|
||||
Monster monster = getItem(position);
|
||||
holder.monster = monster;
|
||||
holder.name.setText(monster.name);
|
||||
holder.meta.setText(monster.getMeta());
|
||||
holder.strengthAdvantage.setText(Helpers.getAdvantageAbbreviation(monster.strengthSavingThrowAdvantage));
|
||||
holder.strengthModifier.setText(Helpers.getModifierString(monster.getStrengthModifier()));
|
||||
holder.strengthName.setText(Helpers.getAbilityScoreAbbreviation(AbilityScore.STRENGTH));
|
||||
holder.strengthProficiency.setText(Helpers.getProficiencyAbbreviation(monster.strengthSavingThrowProficiency));
|
||||
|
||||
holder.dexterityAdvantage.setText(Helpers.getAdvantageAbbreviation(monster.dexteritySavingThrowAdvantage));
|
||||
holder.dexterityModifier.setText(Helpers.getModifierString(monster.getDexterityModifier()));
|
||||
holder.dexterityName.setText(Helpers.getAbilityScoreAbbreviation(AbilityScore.DEXTERITY));
|
||||
holder.dexterityProficiency.setText(Helpers.getProficiencyAbbreviation(monster.dexteritySavingThrowProficiency));
|
||||
|
||||
holder.constitutionAdvantage.setText(Helpers.getAdvantageAbbreviation(monster.constitutionSavingThrowAdvantage));
|
||||
holder.constitutionModifier.setText(Helpers.getModifierString(monster.getConstitutionModifier()));
|
||||
holder.constitutionName.setText(Helpers.getAbilityScoreAbbreviation(AbilityScore.CONSTITUTION));
|
||||
holder.constitutionProficiency.setText(Helpers.getProficiencyAbbreviation(monster.constitutionSavingThrowProficiency));
|
||||
|
||||
holder.intelligenceAdvantage.setText(Helpers.getAdvantageAbbreviation(monster.intelligenceSavingThrowAdvantage));
|
||||
holder.intelligenceModifier.setText(Helpers.getModifierString(monster.getIntelligenceModifier()));
|
||||
holder.intelligenceName.setText(Helpers.getAbilityScoreAbbreviation(AbilityScore.INTELLIGENCE));
|
||||
holder.intelligenceProficiency.setText(Helpers.getProficiencyAbbreviation(monster.intelligenceSavingThrowProficiency));
|
||||
|
||||
holder.wisdomAdvantage.setText(Helpers.getAdvantageAbbreviation(monster.wisdomSavingThrowAdvantage));
|
||||
holder.wisdomModifier.setText(Helpers.getModifierString(monster.getWisdomModifier()));
|
||||
holder.wisdomName.setText(Helpers.getAbilityScoreAbbreviation(AbilityScore.WISDOM));
|
||||
holder.wisdomProficiency.setText(Helpers.getProficiencyAbbreviation(monster.wisdomSavingThrowProficiency));
|
||||
|
||||
holder.charismaAdvantage.setText(Helpers.getAdvantageAbbreviation(monster.charismaSavingThrowAdvantage));
|
||||
holder.charismaModifier.setText(Helpers.getModifierString(monster.getCharismaModifier()));
|
||||
holder.charismaName.setText(Helpers.getAbilityScoreAbbreviation(AbilityScore.CHARISMA));
|
||||
holder.charismaProficiency.setText(Helpers.getProficiencyAbbreviation(monster.charismaSavingThrowProficiency));
|
||||
|
||||
holder.armorClass.setText(String.valueOf(monster.getArmorClassValue()));
|
||||
holder.hitPoints.setText(String.valueOf(monster.getHitPointsValue()));
|
||||
holder.challengeRating.setText(holder.challengeRating.getResources().getString(R.string.label_challenge_rating_with_value, Helpers.getChallengeRatingAbbreviation(monster.challengeRating)));
|
||||
|
||||
int numActions = monster.actions.size();
|
||||
if (numActions > 0) {
|
||||
holder.action1Group.setVisibility(View.VISIBLE);
|
||||
Trait action = monster.actions.get(0);
|
||||
holder.action1Description.setText(Html.fromHtml(CommonMarkHelper.toHtml(action.description)));
|
||||
holder.action1Name.setText(Html.fromHtml(CommonMarkHelper.toHtml(action.name)));
|
||||
} else {
|
||||
holder.action1Group.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
if (numActions > 1) {
|
||||
holder.action2Group.setVisibility(View.VISIBLE);
|
||||
Trait action = monster.actions.get(1);
|
||||
holder.action2Description.setText(Html.fromHtml(CommonMarkHelper.toHtml(action.description)));
|
||||
holder.action2Name.setText(Html.fromHtml(CommonMarkHelper.toHtml(action.name)));
|
||||
} else {
|
||||
holder.action2Group.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
if (numActions > 2) {
|
||||
holder.action3Group.setVisibility(View.VISIBLE);
|
||||
Trait action = monster.actions.get(2);
|
||||
holder.action3Description.setText(Html.fromHtml(CommonMarkHelper.toHtml(action.description)));
|
||||
holder.action3Name.setText(Html.fromHtml(CommonMarkHelper.toHtml(action.name)));
|
||||
} else {
|
||||
holder.action3Group.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
holder.itemView.setOnClickListener(v -> {
|
||||
if (mOnClick != null) {
|
||||
mOnClick.onItemCallback(holder.monster);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public interface ItemCallback {
|
||||
void onItemCallback(Monster monster);
|
||||
}
|
||||
|
||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||
public final TextView name;
|
||||
public final TextView meta;
|
||||
public final View action1Group;
|
||||
public final TextView action1Name;
|
||||
public final TextView action1Description;
|
||||
public final View action2Group;
|
||||
public final TextView action2Name;
|
||||
public final TextView action2Description;
|
||||
public final View action3Group;
|
||||
public final TextView action3Name;
|
||||
public final TextView action3Description;
|
||||
public final TextView strengthName;
|
||||
public final TextView strengthModifier;
|
||||
public final TextView strengthProficiency;
|
||||
public final TextView strengthAdvantage;
|
||||
public final TextView dexterityName;
|
||||
public final TextView dexterityModifier;
|
||||
public final TextView dexterityProficiency;
|
||||
public final TextView dexterityAdvantage;
|
||||
public final TextView constitutionName;
|
||||
public final TextView constitutionModifier;
|
||||
public final TextView constitutionProficiency;
|
||||
public final TextView constitutionAdvantage;
|
||||
public final TextView intelligenceName;
|
||||
public final TextView intelligenceModifier;
|
||||
public final TextView intelligenceProficiency;
|
||||
public final TextView intelligenceAdvantage;
|
||||
public final TextView wisdomName;
|
||||
public final TextView wisdomModifier;
|
||||
public final TextView wisdomProficiency;
|
||||
public final TextView wisdomAdvantage;
|
||||
public final TextView charismaName;
|
||||
public final TextView charismaModifier;
|
||||
public final TextView charismaProficiency;
|
||||
public final TextView charismaAdvantage;
|
||||
public final TextView armorClass;
|
||||
public final TextView hitPoints;
|
||||
public final TextView challengeRating;
|
||||
public Monster monster;
|
||||
|
||||
public ViewHolder(@NonNull CardMonsterBinding binding) {
|
||||
super(binding.getRoot());
|
||||
name = binding.name;
|
||||
meta = binding.meta;
|
||||
action1Group = binding.action1.getRoot();
|
||||
action1Name = binding.action1.name;
|
||||
action1Description = binding.action1.description;
|
||||
action2Group = binding.action2.getRoot();
|
||||
action2Name = binding.action2.name;
|
||||
action2Description = binding.action2.description;
|
||||
action3Group = binding.action3.getRoot();
|
||||
action3Name = binding.action3.name;
|
||||
action3Description = binding.action3.description;
|
||||
strengthName = binding.strength.name;
|
||||
strengthModifier = binding.strength.modifier;
|
||||
strengthProficiency = binding.strength.proficiency;
|
||||
strengthAdvantage = binding.strength.advantage;
|
||||
dexterityName = binding.dexterity.name;
|
||||
dexterityModifier = binding.dexterity.modifier;
|
||||
dexterityProficiency = binding.dexterity.proficiency;
|
||||
dexterityAdvantage = binding.dexterity.advantage;
|
||||
constitutionName = binding.constitution.name;
|
||||
constitutionModifier = binding.constitution.modifier;
|
||||
constitutionProficiency = binding.constitution.proficiency;
|
||||
constitutionAdvantage = binding.constitution.advantage;
|
||||
intelligenceName = binding.intelligence.name;
|
||||
intelligenceModifier = binding.intelligence.modifier;
|
||||
intelligenceProficiency = binding.intelligence.proficiency;
|
||||
intelligenceAdvantage = binding.intelligence.advantage;
|
||||
wisdomName = binding.wisdom.name;
|
||||
wisdomModifier = binding.wisdom.modifier;
|
||||
wisdomProficiency = binding.wisdom.proficiency;
|
||||
wisdomAdvantage = binding.wisdom.advantage;
|
||||
charismaName = binding.charisma.name;
|
||||
charismaModifier = binding.charisma.modifier;
|
||||
charismaProficiency = binding.charisma.proficiency;
|
||||
charismaAdvantage = binding.charisma.advantage;
|
||||
armorClass = binding.armorClass.value;
|
||||
hitPoints = binding.hitPoints.value;
|
||||
challengeRating = binding.challengeRating;
|
||||
}
|
||||
}
|
||||
|
||||
public static class Helpers {
|
||||
@NonNull
|
||||
public static String getModifierString(int value) {
|
||||
return String.format(Locale.getDefault(), "%+d", value);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static String getAbilityScoreAbbreviation(@NonNull AbilityScore abilityScore) {
|
||||
switch (abilityScore) {
|
||||
case STRENGTH:
|
||||
return "S";
|
||||
case DEXTERITY:
|
||||
return "D";
|
||||
case CONSTITUTION:
|
||||
return "C";
|
||||
case INTELLIGENCE:
|
||||
return "I";
|
||||
case WISDOM:
|
||||
return "W";
|
||||
case CHARISMA:
|
||||
return "Ch";
|
||||
default:
|
||||
Logger.logUnimplementedFeature(String.format("Get an abbreviation for AbilityScore value %s", abilityScore));
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static String getChallengeRatingAbbreviation(@NonNull ChallengeRating challengeRating) {
|
||||
Logger.logUnimplementedMethod();
|
||||
switch (challengeRating) {
|
||||
case CUSTOM:
|
||||
return "*";
|
||||
case ZERO:
|
||||
return "0";
|
||||
case ONE_EIGHTH:
|
||||
return "1/8";
|
||||
case ONE_QUARTER:
|
||||
return "1/4";
|
||||
case ONE_HALF:
|
||||
return "1/2";
|
||||
case ONE:
|
||||
return "1";
|
||||
case TWO:
|
||||
return "2";
|
||||
case THREE:
|
||||
return "3";
|
||||
case FOUR:
|
||||
return "4";
|
||||
case FIVE:
|
||||
return "5";
|
||||
case SIX:
|
||||
return "6";
|
||||
case SEVEN:
|
||||
return "7";
|
||||
case EIGHT:
|
||||
return "8";
|
||||
case NINE:
|
||||
return "9";
|
||||
case TEN:
|
||||
return "10";
|
||||
case ELEVEN:
|
||||
return "11";
|
||||
case TWELVE:
|
||||
return "12";
|
||||
case THIRTEEN:
|
||||
return "13";
|
||||
case FOURTEEN:
|
||||
return "14";
|
||||
case FIFTEEN:
|
||||
return "15";
|
||||
case SIXTEEN:
|
||||
return "16";
|
||||
case SEVENTEEN:
|
||||
return "17";
|
||||
case EIGHTEEN:
|
||||
return "18";
|
||||
case NINETEEN:
|
||||
return "19";
|
||||
case TWENTY:
|
||||
return "20";
|
||||
case TWENTY_ONE:
|
||||
return "21";
|
||||
case TWENTY_TWO:
|
||||
return "22";
|
||||
case TWENTY_THREE:
|
||||
return "23";
|
||||
case TWENTY_FOUR:
|
||||
return "24";
|
||||
case TWENTY_FIVE:
|
||||
return "25";
|
||||
case TWENTY_SIX:
|
||||
return "26";
|
||||
case TWENTY_SEVEN:
|
||||
return "27";
|
||||
case TWENTY_EIGHT:
|
||||
return "28";
|
||||
case TWENTY_NINE:
|
||||
return "29";
|
||||
case THIRTY:
|
||||
return "30";
|
||||
default:
|
||||
Logger.logUnimplementedFeature(String.format("Get an abbreviation for ChallengeRating value %s", challengeRating));
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static String getProficiencyAbbreviation(@NonNull ProficiencyType proficiency) {
|
||||
switch (proficiency) {
|
||||
case NONE:
|
||||
return "";
|
||||
case EXPERTISE:
|
||||
return "E";
|
||||
case PROFICIENT:
|
||||
return "P";
|
||||
default:
|
||||
Logger.logUnimplementedFeature(String.format("Get an abbreviation for ProficiencyType value %s", proficiency));
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static String getAdvantageAbbreviation(@NonNull AdvantageType advantage) {
|
||||
switch (advantage) {
|
||||
case NONE:
|
||||
return "";
|
||||
case ADVANTAGE:
|
||||
return "A";
|
||||
case DISADVANTAGE:
|
||||
return "D";
|
||||
default:
|
||||
Logger.logUnimplementedFeature(String.format("Get an abbreviation for AdvantageType value %s", advantage));
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,15 +4,23 @@ import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
import androidx.lifecycle.ViewModel;
|
||||
|
||||
import com.majinnaibu.monstercards.models.Monster;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class DashboardViewModel extends ViewModel {
|
||||
private final MutableLiveData<String> mText;
|
||||
private final MutableLiveData<List<Monster>> mMonsters;
|
||||
|
||||
public DashboardViewModel() {
|
||||
mText = new MutableLiveData<>();
|
||||
mText.setValue("This is dashboard fragment");
|
||||
mMonsters = new MutableLiveData<>(new ArrayList<>());
|
||||
}
|
||||
|
||||
public LiveData<String> getText() {
|
||||
return mText;
|
||||
public LiveData<List<Monster>> getMonsters() {
|
||||
return mMonsters;
|
||||
}
|
||||
}
|
||||
|
||||
public void setMonsters(List<Monster> monsters) {
|
||||
mMonsters.setValue(monsters);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.navigation.NavBackStackEntry;
|
||||
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.shared.MCFragment;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
public class EditAbilityScoresFragment extends MCFragment {
|
||||
private final String ABILITY_SCORE_FORMAT = "%d (%+d)";
|
||||
private EditMonsterViewModel mViewModel;
|
||||
@@ -24,7 +27,7 @@ public class EditAbilityScoresFragment extends MCFragment {
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
|
||||
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));
|
||||
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));
|
||||
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));
|
||||
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));
|
||||
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));
|
||||
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));
|
||||
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;
|
||||
}
|
||||
@@ -67,7 +70,7 @@ public class EditAbilityScoresFragment extends MCFragment {
|
||||
final Stepper wisdom;
|
||||
final Stepper charisma;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
strength = root.findViewById(R.id.strength);
|
||||
dexterity = root.findViewById(R.id.dexterity);
|
||||
constitution = root.findViewById(R.id.constitution);
|
||||
|
||||
@@ -30,7 +30,7 @@ public class EditArmorFragment extends MCFragment {
|
||||
private ViewHolder mHolder;
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
|
||||
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
|
||||
@@ -93,7 +93,7 @@ public class EditArmorFragment extends MCFragment {
|
||||
private final Stepper shieldBonus;
|
||||
private final EditText customArmor;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
armorType = root.findViewById(R.id.armorType);
|
||||
naturalArmorBonus = root.findViewById(R.id.naturalArmorBonus);
|
||||
hasShield = root.findViewById(R.id.hasShield);
|
||||
|
||||
@@ -6,6 +6,7 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.EditText;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.navigation.NavBackStackEntry;
|
||||
import androidx.navigation.NavController;
|
||||
@@ -28,7 +29,7 @@ public class EditBasicInfoFragment extends MCFragment {
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
|
||||
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
|
||||
@@ -73,7 +74,7 @@ public class EditBasicInfoFragment extends MCFragment {
|
||||
private final Stepper hitDice;
|
||||
private final SwitchMaterial hasCustomHitPoints;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
name = root.findViewById(R.id.name);
|
||||
size = root.findViewById(R.id.size);
|
||||
type = root.findViewById(R.id.type);
|
||||
|
||||
@@ -28,7 +28,7 @@ public class EditChallengeRatingFragment extends MCFragment {
|
||||
private ViewHolder mHolder;
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
|
||||
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
|
||||
@@ -82,7 +82,7 @@ public class EditChallengeRatingFragment extends MCFragment {
|
||||
final EditText customChallengeRatingDescription;
|
||||
final EditText customProficiencyBonus;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
challengeRating = root.findViewById(R.id.challengeRating);
|
||||
customChallengeRatingDescription = root.findViewById(R.id.customChallengeRatingDescription);
|
||||
customProficiencyBonus = root.findViewById(R.id.customProficiencyBonus);
|
||||
|
||||
@@ -44,7 +44,7 @@ public class EditLanguageFragment extends MCFragment {
|
||||
|
||||
@Nullable
|
||||
@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);
|
||||
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
|
||||
mEditMonsterViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
|
||||
@@ -80,7 +80,7 @@ public class EditLanguageFragment extends MCFragment {
|
||||
EditText name;
|
||||
SwitchCompat canSpeak;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
name = root.findViewById(R.id.name);
|
||||
canSpeak = root.findViewById(R.id.canSpeak);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.majinnaibu.monstercards.ui.editmonster;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.LiveData;
|
||||
|
||||
import com.majinnaibu.monstercards.models.Language;
|
||||
@@ -18,7 +19,7 @@ public class EditLanguageViewModel extends ChangeTrackedViewModel {
|
||||
mLanguage = new ChangeTrackedLiveData<>(makeLanguage(), this::makeDirty);
|
||||
}
|
||||
|
||||
public void copyFromLanguage(Language language) {
|
||||
public void copyFromLanguage(@NonNull Language language) {
|
||||
mName.resetValue(language.getName());
|
||||
mCanSpeak.resetValue(language.getSpeaks());
|
||||
makeClean();
|
||||
@@ -58,9 +59,10 @@ public class EditLanguageViewModel extends ChangeTrackedViewModel {
|
||||
return getCanSpeakValue(false);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Language makeLanguage() {
|
||||
Boolean boxedValue = mCanSpeak.getValue();
|
||||
boolean canSpeak = boxedValue != null && boxedValue;
|
||||
return new Language(mName.getValue(), canSpeak);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,13 +30,13 @@ public class EditLanguagesFragment extends MCFragment {
|
||||
private EditMonsterViewModel mViewModel;
|
||||
private ViewHolder mHolder;
|
||||
|
||||
private void navigateToEditLanguage(Language language) {
|
||||
private void navigateToEditLanguage(@NonNull Language language) {
|
||||
NavDirections action = EditLanguagesFragmentDirections.actionEditLanguagesFragmentToEditLanguageFragment(language.getName(), language.getSpeaks());
|
||||
Navigation.findNavController(requireView()).navigate(action);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
|
||||
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
|
||||
@@ -93,7 +93,7 @@ public class EditLanguagesFragment extends MCFragment {
|
||||
RecyclerView list;
|
||||
FloatingActionButton addLanguage;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
this.list = root.findViewById(R.id.list);
|
||||
this.addLanguage = root.findViewById(R.id.add_language);
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import android.view.ViewGroup;
|
||||
import android.widget.EditText;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
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.ui.components.Stepper;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
public class EditLanguagesRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||
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 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;
|
||||
mOnClick = onClick;
|
||||
mTelepathyRange = telepathyRange;
|
||||
mOnTelepathyRangeChanged = telepathyRangeChangedListener;
|
||||
mUnderstandsBut = undderstandsBut;
|
||||
mUnderstandsBut = understandsBut;
|
||||
mOnUnderstandsButChanged = understandsButChangedListener;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@NonNull
|
||||
@Override
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) {
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
if (viewType == HEADER_VIEW_TYPE) {
|
||||
return new HeaderViewHolder(FragmentEditLanguagesListHeaderBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
|
||||
}
|
||||
@@ -48,10 +48,10 @@ public class EditLanguagesRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
|
||||
}
|
||||
|
||||
@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) {
|
||||
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.setOnValueChangeListener(mOnTelepathyRangeChanged);
|
||||
headerViewHolder.understandsBut.setText(mUnderstandsBut);
|
||||
@@ -89,7 +89,7 @@ public class EditLanguagesRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
|
||||
public final Stepper telepathy;
|
||||
public final EditText understandsBut;
|
||||
|
||||
public HeaderViewHolder(FragmentEditLanguagesListHeaderBinding binding) {
|
||||
public HeaderViewHolder(@NonNull FragmentEditLanguagesListHeaderBinding binding) {
|
||||
super(binding.getRoot());
|
||||
telepathy = binding.telepathy;
|
||||
understandsBut = binding.understandsBut;
|
||||
@@ -100,12 +100,12 @@ public class EditLanguagesRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
|
||||
public final TextView mContentView;
|
||||
public Language mItem;
|
||||
|
||||
public ItemViewHolder(FragmentEditLanguagesListItemBinding binding) {
|
||||
public ItemViewHolder(@NonNull FragmentEditLanguagesListItemBinding binding) {
|
||||
super(binding.getRoot());
|
||||
mContentView = binding.content;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return super.toString() + " '" + mContentView.getText() + "'";
|
||||
|
||||
@@ -247,7 +247,7 @@ public class EditMonsterFragment extends MCFragment {
|
||||
TextView lairActions;
|
||||
TextView regionalActions;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
basicInfoButton = root.findViewById(R.id.basicInfo);
|
||||
armorButton = root.findViewById(R.id.armor);
|
||||
speedButton = root.findViewById(R.id.speed);
|
||||
|
||||
@@ -158,7 +158,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
|
||||
mRegionalActions = new ChangeTrackedLiveData<>(new ArrayList<>(), this::makeDirty);
|
||||
}
|
||||
|
||||
public void copyFromMonster(Monster monster) {
|
||||
public void copyFromMonster(@NonNull Monster monster) {
|
||||
mMonsterId.resetValue(monster.id);
|
||||
mName.resetValue(monster.name);
|
||||
mSize.resetValue(monster.size);
|
||||
@@ -787,7 +787,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
|
||||
return monster;
|
||||
}
|
||||
|
||||
public LiveData<List<Trait>> getTraits(TraitType type) {
|
||||
public LiveData<List<Trait>> getTraits(@NonNull TraitType type) {
|
||||
switch (type) {
|
||||
case ABILITY:
|
||||
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) {
|
||||
case ABILITY:
|
||||
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) {
|
||||
case ABILITY:
|
||||
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("", "");
|
||||
switch (type) {
|
||||
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) {
|
||||
case CONDITION_IMMUNITY:
|
||||
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) {
|
||||
case CONDITION_IMMUNITY:
|
||||
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 = "";
|
||||
switch (type) {
|
||||
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) {
|
||||
case CONDITION_IMMUNITY:
|
||||
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) {
|
||||
case ABILITY:
|
||||
return Helpers.moveItemInList(mAbilities, from, to);
|
||||
@@ -989,7 +989,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
|
||||
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());
|
||||
newList.add(newItem);
|
||||
if (comparator != null) {
|
||||
@@ -999,14 +999,14 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
|
||||
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();
|
||||
ArrayList<T> newList = new ArrayList<>(oldList);
|
||||
newList.remove(position);
|
||||
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();
|
||||
if (oldList == null) {
|
||||
oldList = new ArrayList<>();
|
||||
@@ -1036,7 +1036,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
|
||||
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();
|
||||
if (oldList == null) {
|
||||
oldList = new ArrayList<>();
|
||||
@@ -1071,7 +1071,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
|
||||
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();
|
||||
if (oldList == null) {
|
||||
oldList = new ArrayList<>();
|
||||
|
||||
@@ -5,6 +5,7 @@ import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.navigation.NavBackStackEntry;
|
||||
import androidx.navigation.NavController;
|
||||
@@ -20,7 +21,7 @@ public class EditSavingThrowsFragment extends MCFragment {
|
||||
private ViewHolder mViewHolder;
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
|
||||
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
|
||||
@@ -75,7 +76,7 @@ public class EditSavingThrowsFragment extends MCFragment {
|
||||
AdvantagePicker charismaAdvantage;
|
||||
ProficiencyPicker charismaProficiency;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
strengthAdvantage = root.findViewById(R.id.strengthAdvantage);
|
||||
strengthProficiency = root.findViewById(R.id.strengthProficiency);
|
||||
dexterityAdvantage = root.findViewById(R.id.dexterityAdvantage);
|
||||
|
||||
@@ -89,7 +89,7 @@ public class EditSkillFragment extends MCFragment {
|
||||
ProficiencyPicker proficiency;
|
||||
EditText name;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
abilityScore = root.findViewById(R.id.abilityScore);
|
||||
advantage = root.findViewById(R.id.advantage);
|
||||
proficiency = root.findViewById(R.id.proficiency);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.majinnaibu.monstercards.ui.editmonster;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.LiveData;
|
||||
|
||||
import com.majinnaibu.monstercards.data.enums.AbilityScore;
|
||||
@@ -25,7 +26,7 @@ public class EditSkillViewModel extends ChangeTrackedViewModel {
|
||||
mSkill = new ChangeTrackedLiveData<>(makeSkill(), this::makeDirty);
|
||||
}
|
||||
|
||||
public void copyFromSkill(Skill skill) {
|
||||
public void copyFromSkill(@NonNull Skill skill) {
|
||||
mAbilityScore.resetValue(skill.abilityScore);
|
||||
mAdvantageType.resetValue(skill.advantageType);
|
||||
mProficiencyType.resetValue(skill.proficiencyType);
|
||||
@@ -73,6 +74,7 @@ public class EditSkillViewModel extends ChangeTrackedViewModel {
|
||||
mSkill.setValue(makeSkill());
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Skill makeSkill() {
|
||||
return new Skill(mName.getValue(), mAbilityScore.getValue(), mAdvantageType.getValue(), mProficiencyType.getValue());
|
||||
}
|
||||
|
||||
@@ -31,13 +31,13 @@ public class EditSkillsFragment extends MCFragment {
|
||||
private EditMonsterViewModel mViewModel;
|
||||
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);
|
||||
Navigation.findNavController(requireView()).navigate(action);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
|
||||
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
|
||||
@@ -84,7 +84,7 @@ public class EditSkillsFragment extends MCFragment {
|
||||
RecyclerView list;
|
||||
FloatingActionButton addSkill;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
this.list = root.findViewById(R.id.list);
|
||||
this.addSkill = root.findViewById(R.id.add_skill);
|
||||
}
|
||||
|
||||
@@ -4,13 +4,12 @@ import android.view.LayoutInflater;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.majinnaibu.monstercards.databinding.FragmentEditSkillsListItemBinding;
|
||||
import com.majinnaibu.monstercards.models.Skill;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -25,14 +24,14 @@ public class EditSkillsRecyclerViewAdapter extends RecyclerView.Adapter<EditSkil
|
||||
mOnClick = onClick;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@NonNull
|
||||
@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));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(final ViewHolder holder, int position) {
|
||||
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
|
||||
holder.mItem = mValues.get(position);
|
||||
holder.mContentView.setText(mValues.get(position).name);
|
||||
holder.itemView.setOnClickListener(v -> {
|
||||
@@ -55,15 +54,15 @@ public class EditSkillsRecyclerViewAdapter extends RecyclerView.Adapter<EditSkil
|
||||
public final TextView mContentView;
|
||||
public Skill mItem;
|
||||
|
||||
public ViewHolder(FragmentEditSkillsListItemBinding binding) {
|
||||
public ViewHolder(@NonNull FragmentEditSkillsListItemBinding binding) {
|
||||
super(binding.getRoot());
|
||||
mContentView = binding.content;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return super.toString() + " '" + mContentView.getText() + "'";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.EditText;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.widget.SwitchCompat;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.navigation.NavBackStackEntry;
|
||||
@@ -22,7 +23,7 @@ public class EditSpeedFragment extends MCFragment {
|
||||
private ViewHolder mHolder;
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
|
||||
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
|
||||
@@ -74,7 +75,7 @@ public class EditSpeedFragment extends MCFragment {
|
||||
final SwitchCompat hasCustomSpeed;
|
||||
final EditText customSpeed;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
baseSpeed = root.findViewById(R.id.baseSpeed);
|
||||
burrowSpeed = root.findViewById(R.id.burrowSpeed);
|
||||
climbSpeed = root.findViewById(R.id.climbSpeed);
|
||||
|
||||
@@ -28,7 +28,7 @@ public class EditStringFragment extends MCFragment {
|
||||
private StringType mStringType;
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
mViewModel = new ViewModelProvider(this).get(EditStringViewModel.class);
|
||||
if (getArguments() != null) {
|
||||
EditStringFragmentArgs args = EditStringFragmentArgs.fromBundle(getArguments());
|
||||
@@ -43,7 +43,6 @@ public class EditStringFragment extends MCFragment {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@org.jetbrains.annotations.Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
|
||||
@@ -69,7 +68,8 @@ public class EditStringFragment extends MCFragment {
|
||||
return root;
|
||||
}
|
||||
|
||||
private String getTitleForStringType(StringType type) {
|
||||
@NonNull
|
||||
private String getTitleForStringType(@NonNull StringType type) {
|
||||
switch (type) {
|
||||
case CONDITION_IMMUNITY:
|
||||
return getString(R.string.title_editConditionImmunity);
|
||||
@@ -95,7 +95,7 @@ public class EditStringFragment extends MCFragment {
|
||||
private static class ViewHolder {
|
||||
EditText description;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
description = root.findViewById(R.id.description);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,8 +26,6 @@ import com.majinnaibu.monstercards.ui.shared.MCFragment;
|
||||
import com.majinnaibu.monstercards.ui.shared.SwipeToDeleteCallback;
|
||||
import com.majinnaibu.monstercards.utils.Logger;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class EditStringsFragment extends MCFragment {
|
||||
@@ -36,7 +34,7 @@ public class EditStringsFragment extends MCFragment {
|
||||
private StringType mStringType;
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
Bundle arguments = getArguments();
|
||||
if (arguments != null) {
|
||||
EditStringsFragmentArgs args = EditStringsFragmentArgs.fromBundle(arguments);
|
||||
@@ -48,9 +46,8 @@ public class EditStringsFragment extends MCFragment {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@org.jetbrains.annotations.Nullable
|
||||
@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);
|
||||
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
|
||||
mViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
|
||||
@@ -62,6 +59,7 @@ public class EditStringsFragment extends MCFragment {
|
||||
return root;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private String getTitleForStringType(StringType type) {
|
||||
switch (type) {
|
||||
case CONDITION_IMMUNITY:
|
||||
@@ -123,7 +121,7 @@ public class EditStringsFragment extends MCFragment {
|
||||
RecyclerView list;
|
||||
FloatingActionButton addItem;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
list = root.findViewById(R.id.list);
|
||||
addItem = root.findViewById(R.id.add_item);
|
||||
}
|
||||
|
||||
@@ -4,12 +4,11 @@ import android.view.LayoutInflater;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.majinnaibu.monstercards.databinding.FragmentEditStringsListItemBinding;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class EditStringsRecyclerViewAdapter extends RecyclerView.Adapter<EditStringsRecyclerViewAdapter.ViewHolder> {
|
||||
@@ -21,14 +20,14 @@ public class EditStringsRecyclerViewAdapter extends RecyclerView.Adapter<EditStr
|
||||
mOnClick = onClick;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@NonNull
|
||||
@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));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(final ViewHolder holder, int position) {
|
||||
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
|
||||
holder.mItem = mValues.get(position);
|
||||
holder.mContentView.setText(mValues.get(position));
|
||||
holder.itemView.setOnClickListener(v -> {
|
||||
@@ -51,12 +50,12 @@ public class EditStringsRecyclerViewAdapter extends RecyclerView.Adapter<EditStr
|
||||
public final TextView mContentView;
|
||||
public String mItem;
|
||||
|
||||
public ViewHolder(FragmentEditStringsListItemBinding binding) {
|
||||
public ViewHolder(@NonNull FragmentEditStringsListItemBinding binding) {
|
||||
super(binding.getRoot());
|
||||
mContentView = binding.content;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return super.toString() + " '" + mContentView.getText() + "'";
|
||||
|
||||
@@ -29,7 +29,7 @@ public class EditTraitFragment extends MCFragment {
|
||||
private TraitType mTraitType;
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
mViewModel = new ViewModelProvider(this).get(EditTraitViewModel.class);
|
||||
if (getArguments() != null) {
|
||||
EditTraitFragmentArgs args = EditTraitFragmentArgs.fromBundle(getArguments());
|
||||
@@ -44,7 +44,7 @@ public class EditTraitFragment extends MCFragment {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@org.jetbrains.annotations.Nullable
|
||||
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||
NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment);
|
||||
@@ -102,7 +102,7 @@ public class EditTraitFragment extends MCFragment {
|
||||
EditText description;
|
||||
EditText name;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
description = root.findViewById(R.id.description);
|
||||
name = root.findViewById(R.id.name);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.majinnaibu.monstercards.ui.editmonster;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
|
||||
@@ -49,12 +50,13 @@ public class EditTraitViewModel extends ChangeTrackedViewModel {
|
||||
return mAbility.getValue();
|
||||
}
|
||||
|
||||
public void copyFromTrait(Trait trait) {
|
||||
public void copyFromTrait(@NonNull Trait trait) {
|
||||
makeClean();
|
||||
mName.resetValue(trait.name);
|
||||
mDescription.resetValue(trait.description);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Trait makeAbility() {
|
||||
return new Trait(mName.getValue(), mDescription.getValue());
|
||||
}
|
||||
|
||||
@@ -27,8 +27,6 @@ import com.majinnaibu.monstercards.ui.shared.MCFragment;
|
||||
import com.majinnaibu.monstercards.ui.shared.SwipeToDeleteCallback;
|
||||
import com.majinnaibu.monstercards.utils.Logger;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class EditTraitsFragment extends MCFragment {
|
||||
@@ -39,7 +37,7 @@ public class EditTraitsFragment extends MCFragment {
|
||||
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
if (getArguments() != null) {
|
||||
EditTraitsFragmentArgs args = EditTraitsFragmentArgs.fromBundle(getArguments());
|
||||
mTraitType = args.getTraitType();
|
||||
@@ -50,9 +48,8 @@ public class EditTraitsFragment extends MCFragment {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@org.jetbrains.annotations.Nullable
|
||||
@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);
|
||||
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
|
||||
mViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
|
||||
@@ -64,6 +61,7 @@ public class EditTraitsFragment extends MCFragment {
|
||||
return root;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private String getTitleForTraitType(TraitType type) {
|
||||
switch (type) {
|
||||
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);
|
||||
Navigation.findNavController(requireView()).navigate(action);
|
||||
}
|
||||
@@ -125,7 +123,7 @@ public class EditTraitsFragment extends MCFragment {
|
||||
RecyclerView list;
|
||||
FloatingActionButton addTrait;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
list = root.findViewById(R.id.list);
|
||||
addTrait = root.findViewById(R.id.add_trait);
|
||||
}
|
||||
|
||||
@@ -12,18 +12,16 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
import com.majinnaibu.monstercards.databinding.FragmentEditTraitsListItemBinding;
|
||||
import com.majinnaibu.monstercards.models.Trait;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class EditTraitsRecyclerViewAdapter extends ListAdapter<Trait, EditTraitsRecyclerViewAdapter.ViewHolder> {
|
||||
private static final DiffUtil.ItemCallback<Trait> DIFF_CALLBACK = new DiffUtil.ItemCallback<Trait>() {
|
||||
|
||||
@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);
|
||||
}
|
||||
|
||||
@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);
|
||||
}
|
||||
};
|
||||
@@ -34,14 +32,14 @@ public class EditTraitsRecyclerViewAdapter extends ListAdapter<Trait, EditTraits
|
||||
mOnClick = onClick;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@NonNull
|
||||
@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));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(final ViewHolder holder, int position) {
|
||||
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
|
||||
holder.mItem = getItem(position);
|
||||
holder.mContentView.setText(holder.mItem.name);
|
||||
holder.itemView.setOnClickListener(v -> {
|
||||
@@ -59,12 +57,12 @@ public class EditTraitsRecyclerViewAdapter extends ListAdapter<Trait, EditTraits
|
||||
public final TextView mContentView;
|
||||
public Trait mItem;
|
||||
|
||||
public ViewHolder(FragmentEditTraitsListItemBinding binding) {
|
||||
public ViewHolder(@NonNull FragmentEditTraitsListItemBinding binding) {
|
||||
super(binding.getRoot());
|
||||
mContentView = binding.content;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return super.toString() + " '" + mContentView.getText() + "'";
|
||||
|
||||
@@ -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());
|
||||
Navigation.findNavController(requireView()).navigate(action);
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ public class LibraryRecyclerViewAdapter extends RecyclerView.Adapter<LibraryRecy
|
||||
private final Flowable<List<Monster>> mItemsObservable;
|
||||
private final View.OnClickListener mOnClickListener = new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
public void onClick(@NonNull View view) {
|
||||
Monster monster = (Monster) view.getTag();
|
||||
if (mOnClick != null) {
|
||||
mOnClick.onItemCallback(monster);
|
||||
|
||||
@@ -99,7 +99,7 @@ public class MonsterDetailFragment extends MCFragment {
|
||||
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 fullText = String.format("<b>%s</b> %s", title, text);
|
||||
view.setText(Html.fromHtml(fullText));
|
||||
@@ -214,7 +214,7 @@ public class MonsterDetailFragment extends MCFragment {
|
||||
final TextView regionalEffects_label;
|
||||
final ImageView regionalEffects_divider;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
name = root.findViewById(R.id.name);
|
||||
meta = root.findViewById(R.id.meta);
|
||||
armorClass = root.findViewById(R.id.armorClass);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.majinnaibu.monstercards.ui.monster;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
import androidx.lifecycle.ViewModel;
|
||||
@@ -180,7 +181,7 @@ public class MonsterDetailViewModel extends ViewModel {
|
||||
return mMonsterId;
|
||||
}
|
||||
|
||||
public void setMonster(Monster monster) {
|
||||
public void setMonster(@NonNull Monster monster) {
|
||||
mMonster = monster;
|
||||
mAbilities.setValue(mMonster.getAbilityDescriptions());
|
||||
mActions.setValue(mMonster.getActionDescriptions());
|
||||
|
||||
@@ -88,7 +88,7 @@ public class MonsterImportFragment extends MCFragment {
|
||||
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 fullText = String.format("<b>%s</b> %s", title, text);
|
||||
view.setText(Html.fromHtml(fullText));
|
||||
@@ -184,7 +184,7 @@ public class MonsterImportFragment extends MCFragment {
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
private void navigateToEditMonster(UUID monsterId) {
|
||||
private void navigateToEditMonster(@NonNull UUID monsterId) {
|
||||
NavController navController = Navigation.findNavController(requireView());
|
||||
NavDirections action;
|
||||
action = MonsterImportFragmentDirections.actionMonsterImportFragmentToNavigationLibrary();
|
||||
@@ -234,7 +234,7 @@ public class MonsterImportFragment extends MCFragment {
|
||||
final TextView regionalEffects_label;
|
||||
final ImageView regionalEffects_divider;
|
||||
|
||||
ViewHolder(View root) {
|
||||
ViewHolder(@NonNull View root) {
|
||||
this.root = root;
|
||||
name = root.findViewById(R.id.name);
|
||||
meta = root.findViewById(R.id.meta);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.majinnaibu.monstercards.ui.monster;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
import androidx.lifecycle.ViewModel;
|
||||
@@ -183,7 +184,7 @@ public class MonsterImportViewModel extends ViewModel {
|
||||
return mMonster;
|
||||
}
|
||||
|
||||
public void setMonster(Monster monster) {
|
||||
public void setMonster(@NonNull Monster monster) {
|
||||
mMonster = monster;
|
||||
mAbilities.setValue(mMonster.getAbilityDescriptions());
|
||||
mActions.setValue(mMonster.getActionDescriptions());
|
||||
|
||||
@@ -13,8 +13,6 @@ import com.majinnaibu.monstercards.data.MonsterRepository;
|
||||
import com.majinnaibu.monstercards.models.Monster;
|
||||
import com.majinnaibu.monstercards.utils.Logger;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -52,7 +50,7 @@ public class SearchResultsRecyclerViewAdapter extends RecyclerView.Adapter<Searc
|
||||
throwable -> Logger.logError("Error performing search", throwable));
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@NonNull
|
||||
@Override
|
||||
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
View view = LayoutInflater.from(parent.getContext())
|
||||
@@ -61,7 +59,7 @@ public class SearchResultsRecyclerViewAdapter extends RecyclerView.Adapter<Searc
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(final ViewHolder holder, int position) {
|
||||
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
|
||||
Monster monster = mValues.get(position);
|
||||
holder.mContentView.setText(monster.name);
|
||||
holder.itemView.setTag(monster);
|
||||
|
||||
@@ -25,7 +25,7 @@ public class SwipeToDeleteCallback extends ItemTouchHelper.SimpleCallback {
|
||||
private final OnMoveCallback mOnMove;
|
||||
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);
|
||||
mOnDelete = onDelete;
|
||||
mOnMove = onMove;
|
||||
|
||||
@@ -4,6 +4,7 @@ import androidx.lifecycle.MutableLiveData;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class ChangeTrackedLiveData<T> extends MutableLiveData<T> {
|
||||
private final OnValueChangedCallback<T> mOnValueChangedCallback;
|
||||
private final OnValueDirtiedCallback mOnValueDirtiedCallback;
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.majinnaibu.monstercards.utils;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class Logger {
|
||||
public static final String LOG_TAG = "MonsterCards";
|
||||
|
||||
@@ -37,7 +38,7 @@ public class Logger {
|
||||
StackTraceElement stackTraceElement = throwable.getStackTrace()[0];
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -55,7 +56,7 @@ public class Logger {
|
||||
StackTraceElement stackTraceElement = throwable.getStackTrace()[0];
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -73,7 +74,7 @@ public class Logger {
|
||||
StackTraceElement stackTraceElement = throwable.getStackTrace()[0];
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -91,7 +92,7 @@ public class Logger {
|
||||
StackTraceElement stackTraceElement = throwable.getStackTrace()[0];
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -109,7 +110,7 @@ public class Logger {
|
||||
StackTraceElement stackTraceElement = throwable.getStackTrace()[0];
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -127,7 +128,7 @@ public class Logger {
|
||||
StackTraceElement stackTraceElement = throwable.getStackTrace()[0];
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.majinnaibu.monstercards.utils;
|
||||
import android.text.Editable;
|
||||
import android.text.TextWatcher;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class TextChangedListener implements TextWatcher {
|
||||
|
||||
private final BeforeTextChangedCallback mBeforeTextChangedCallback;
|
||||
|
||||
7
app/src/main/res/drawable/rectangle_background.xml
Normal file
7
app/src/main/res/drawable/rectangle_background.xml
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="@android:color/background_light" />
|
||||
<stroke
|
||||
android:width="1dp"
|
||||
android:color="@android:color/primary_text_light" />
|
||||
</shape>
|
||||
59
app/src/main/res/layout/card_ability_score.xml
Normal file
59
app/src/main/res/layout/card_ability_score.xml
Normal file
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="40dp"
|
||||
android:layout_height="40dp"
|
||||
android:background="@drawable/rectangle_background">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/text_icon_border_padding"
|
||||
android:textColor="@android:color/primary_text_light"
|
||||
android:textSize="@dimen/text_icon_tiny"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
tools:text="S" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/advantage"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/text_icon_border_padding"
|
||||
android:textColor="@android:color/primary_text_light"
|
||||
android:textSize="@dimen/text_icon_tiny"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="A" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/proficiency"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/text_icon_border_padding"
|
||||
android:textColor="@android:color/primary_text_light"
|
||||
android:textSize="@dimen/text_icon_tiny"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="E" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/modifier"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="@android:color/primary_text_light"
|
||||
android:textSize="@dimen/text_icon_size"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="+5" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
40
app/src/main/res/layout/card_action.xml
Normal file
40
app/src/main/res/layout/card_action.xml
Normal file
@@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/action_card_height"
|
||||
android:background="@drawable/rectangle_background">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="@dimen/padding_normal"
|
||||
android:layout_marginTop="@dimen/padding_small"
|
||||
|
||||
android:textSize="@dimen/action_card_name_text_size"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="Slam" />
|
||||
|
||||
<!-- // TODO: maybe wrap this is a scrollview -->
|
||||
<TextView
|
||||
android:id="@+id/description"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginHorizontal="@dimen/padding_normal"
|
||||
android:layout_marginBottom="@dimen/padding_normal"
|
||||
android:ellipsize="end"
|
||||
android:singleLine="false"
|
||||
android:textSize="@dimen/action_card_description_text_size"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/name"
|
||||
tools:text="Melee Weapon Attack: +8 to hit, reach 10 ft., one target. Hit: 14 (2d8 + 5) bludgeoning damage." />
|
||||
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
35
app/src/main/res/layout/card_armor_class.xml
Normal file
35
app/src/main/res/layout/card_armor_class.xml
Normal file
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size"
|
||||
android:background="@drawable/rectangle_background">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/text_icon_border_padding"
|
||||
android:text="@string/label_armorClass_icon"
|
||||
android:textColor="@android:color/primary_text_light"
|
||||
android:textSize="@dimen/text_icon_tiny"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/value"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="@android:color/primary_text_light"
|
||||
android:textSize="@dimen/text_icon_size"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="17" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
35
app/src/main/res/layout/card_challenge_rating.xml
Normal file
35
app/src/main/res/layout/card_challenge_rating.xml
Normal file
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size"
|
||||
android:background="@drawable/rectangle_background">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/text_icon_border_padding"
|
||||
android:text="@string/label_challengeRating_icon"
|
||||
android:textColor="@android:color/primary_text_light"
|
||||
android:textSize="@dimen/text_icon_tiny"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/value"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="@android:color/primary_text_light"
|
||||
android:textSize="@dimen/text_icon_size"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="1/8" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
35
app/src/main/res/layout/card_hit_points.xml
Normal file
35
app/src/main/res/layout/card_hit_points.xml
Normal file
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size"
|
||||
android:background="@drawable/rectangle_background">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/text_icon_border_padding"
|
||||
android:text="@string/label_hitPoints_icon"
|
||||
android:textColor="@android:color/primary_text_light"
|
||||
android:textSize="@dimen/text_icon_tiny"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/value"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="@android:color/primary_text_light"
|
||||
android:textSize="@dimen/text_icon_size"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="367" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
35
app/src/main/res/layout/card_initiative.xml
Normal file
35
app/src/main/res/layout/card_initiative.xml
Normal file
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size"
|
||||
android:background="@drawable/rectangle_background">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/text_icon_border_padding"
|
||||
android:text="@string/label_initiative_icon"
|
||||
android:textColor="@android:color/primary_text_light"
|
||||
android:textSize="@dimen/text_icon_tiny"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/value"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="@android:color/primary_text_light"
|
||||
android:textSize="@dimen/text_icon_size"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="+2" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
174
app/src/main/res/layout/card_monster.xml
Normal file
174
app/src/main/res/layout/card_monster.xml
Normal file
@@ -0,0 +1,174 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/padding_normal"
|
||||
android:background="@drawable/rectangle_background">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/padding_normal"
|
||||
android:textSize="@dimen/monster_card_name_text_size"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="Ancient Black Dragon" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/meta"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/padding_normal"
|
||||
android:textSize="@dimen/monster_card_meta_text_size"
|
||||
android:textStyle="italic"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/name"
|
||||
tools:text="Gargantuan dragon, chaotic evil" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/challengeRating"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/padding_normal"
|
||||
android:textSize="@dimen/monster_card_name_text_size"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="CR 1/8" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/boxesRow"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/padding_normal"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/meta">
|
||||
|
||||
<include
|
||||
android:id="@+id/strength"
|
||||
layout="@layout/card_ability_score"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/dexterity"
|
||||
layout="@layout/card_ability_score"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/constitution"
|
||||
layout="@layout/card_ability_score"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/intelligence"
|
||||
layout="@layout/card_ability_score"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/wisdom"
|
||||
layout="@layout/card_ability_score"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/charisma"
|
||||
layout="@layout/card_ability_score"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/armorClass"
|
||||
layout="@layout/card_armor_class"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/hitPoints"
|
||||
layout="@layout/card_hit_points"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="@dimen/padding_small"
|
||||
android:layout_marginVertical="@dimen/padding_normal"
|
||||
android:baselineAligned="false"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/boxesRow">
|
||||
|
||||
<include
|
||||
android:id="@+id/action1"
|
||||
layout="@layout/card_action"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="@dimen/action_card_height"
|
||||
android:layout_marginHorizontal="@dimen/padding_small"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/action2"
|
||||
layout="@layout/card_action"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="@dimen/action_card_height"
|
||||
android:layout_marginHorizontal="@dimen/padding_small"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/action3"
|
||||
layout="@layout/card_action"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="@dimen/action_card_height"
|
||||
android:layout_marginHorizontal="@dimen/padding_small"
|
||||
android:layout_weight="1" />
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
136
app/src/main/res/layout/card_monster_short.xml
Normal file
136
app/src/main/res/layout/card_monster_short.xml
Normal file
@@ -0,0 +1,136 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/rectangle_background">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/padding_normal"
|
||||
android:textSize="@dimen/monster_card_name_text_size"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="Ancient Black Dragon" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/meta"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/padding_normal"
|
||||
android:textSize="@dimen/monster_card_meta_text_size"
|
||||
android:textStyle="italic"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/name"
|
||||
tools:text="Gargantuan dragon, chaotic evil" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/challengeRating"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/padding_normal"
|
||||
android:textSize="@dimen/monster_card_name_text_size"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="CR 1/8" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/boxesRow"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/padding_normal"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/meta">
|
||||
|
||||
<include
|
||||
android:id="@+id/strength"
|
||||
layout="@layout/card_ability_score"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/dexterity"
|
||||
layout="@layout/card_ability_score"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/constitution"
|
||||
layout="@layout/card_ability_score"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/intelligence"
|
||||
layout="@layout/card_ability_score"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/wisdom"
|
||||
layout="@layout/card_ability_score"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/charisma"
|
||||
layout="@layout/card_ability_score"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/armorClass"
|
||||
layout="@layout/card_armor_class"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/hitPoints"
|
||||
layout="@layout/card_hit_points"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
</LinearLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -6,17 +6,18 @@
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".ui.dashboard.DashboardFragment">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/text_dashboard"
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:textAlignment="center"
|
||||
android:textSize="20sp"
|
||||
android:layout_height="match_parent"
|
||||
android:clipToPadding="false"
|
||||
android:divider="?android:attr/dividerVertical"
|
||||
android:dividerPadding="@dimen/text_margin"
|
||||
android:padding="@dimen/padding_normal"
|
||||
app:layoutManager="LinearLayoutManager"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:listitem="@layout/card_monster" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
42
app/src/main/res/layout/fragment_dashboard_list_item.xml
Normal file
42
app/src/main/res/layout/fragment_dashboard_list_item.xml
Normal file
@@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/text_margin"
|
||||
android:textAppearance="?attr/textAppearanceListItem" />
|
||||
|
||||
<!-- <include-->
|
||||
<!-- layout="@layout/card_monster"-->
|
||||
<!-- android:layout_width="0dp"-->
|
||||
<!-- android:layout_height="wrap_content"-->
|
||||
<!-- android:layout_columnWeight="1"-->
|
||||
<!-- android:layout_marginVertical="8dp"/>-->
|
||||
|
||||
<!-- <include-->
|
||||
<!-- layout="@layout/card_monster_short"-->
|
||||
<!-- android:layout_width="0dp"-->
|
||||
<!-- android:layout_height="wrap_content"-->
|
||||
<!-- android:layout_columnWeight="1"-->
|
||||
<!-- android:layout_marginVertical="8dp"/>-->
|
||||
|
||||
<!-- <include-->
|
||||
<!-- layout="@layout/tile_monster"-->
|
||||
<!-- android:layout_width="0dp"-->
|
||||
<!-- android:layout_height="wrap_content"-->
|
||||
<!-- android:layout_columnWeight="1"-->
|
||||
<!-- android:layout_marginVertical="8dp"/>-->
|
||||
|
||||
<!-- <include-->
|
||||
<!-- layout="@layout/tile_monster_short"-->
|
||||
<!-- android:layout_width="0dp"-->
|
||||
<!-- android:layout_height="wrap_content"-->
|
||||
<!-- android:layout_columnWeight="1"-->
|
||||
<!-- android:layout_marginVertical="8dp" />-->
|
||||
|
||||
</LinearLayout>
|
||||
101
app/src/main/res/layout/tile_monster.xml
Normal file
101
app/src/main/res/layout/tile_monster.xml
Normal file
@@ -0,0 +1,101 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/rectangle_background">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/padding_normal"
|
||||
android:ellipsize="end"
|
||||
android:lines="1"
|
||||
android:textSize="@dimen/monster_tile_name_text_size"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="Ancient Black Dragon" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/meta"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/padding_normal"
|
||||
android:ellipsize="end"
|
||||
android:lines="1"
|
||||
android:textSize="@dimen/monster_tile_meta_text_size"
|
||||
android:textStyle="italic"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/name"
|
||||
tools:text="Gargantuan dragon, chaotic evil" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/boxesRow"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/padding_normal"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/meta">
|
||||
|
||||
<include
|
||||
android:id="@+id/armorClass"
|
||||
layout="@layout/card_armor_class"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/hitPoints"
|
||||
layout="@layout/card_hit_points"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/initiative"
|
||||
layout="@layout/card_initiative"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/challengeRating"
|
||||
layout="@layout/card_challenge_rating"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<include
|
||||
android:id="@+id/action"
|
||||
layout="@layout/card_action"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="@dimen/action_card_height"
|
||||
android:layout_marginHorizontal="@dimen/padding_small"
|
||||
android:layout_marginVertical="@dimen/padding_normal"
|
||||
android:baselineAligned="false"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
90
app/src/main/res/layout/tile_monster_short.xml
Normal file
90
app/src/main/res/layout/tile_monster_short.xml
Normal file
@@ -0,0 +1,90 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/rectangle_background">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/padding_normal"
|
||||
android:ellipsize="end"
|
||||
android:lines="1"
|
||||
android:textSize="@dimen/monster_tile_name_text_size"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="Ancient Black Dragon" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/meta"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/padding_normal"
|
||||
android:ellipsize="end"
|
||||
android:lines="1"
|
||||
android:textSize="@dimen/monster_tile_meta_text_size"
|
||||
android:textStyle="italic"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/name"
|
||||
tools:text="Gargantuan dragon, chaotic evil" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/boxesRow"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/padding_normal"
|
||||
android:baselineAligned="false"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/meta">
|
||||
|
||||
<include
|
||||
android:id="@+id/armorClass"
|
||||
layout="@layout/card_armor_class"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/hitPoints"
|
||||
layout="@layout/card_hit_points"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/initiative"
|
||||
layout="@layout/card_initiative"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<include
|
||||
android:id="@+id/challengeRating"
|
||||
layout="@layout/card_challenge_rating"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -1,9 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<attr name="label" format="string" localization="suggested" />
|
||||
|
||||
<declare-styleable name="Stepper">
|
||||
<attr name="stepAmount" format="integer" />
|
||||
<attr name="minValue" format="integer" />
|
||||
<attr name="maxValue" format="integer" />
|
||||
<attr name="label" format="string" localization="suggested" />
|
||||
<attr name="label" />
|
||||
</declare-styleable>
|
||||
</resources>
|
||||
<declare-styleable name="AbilityScorePicker">
|
||||
<attr name="label" />
|
||||
</declare-styleable>
|
||||
</resources>
|
||||
|
||||
@@ -1,11 +1,22 @@
|
||||
<resources>
|
||||
<!-- Default screen margins, per the Android Design guidelines. -->
|
||||
<dimen name="text_margin">16dp</dimen>
|
||||
<dimen name="fab_margin">16dp</dimen>
|
||||
<dimen name="text_h4_size">20sp</dimen>
|
||||
<dimen name="action_card_description_text_size">10sp</dimen>
|
||||
<dimen name="action_card_height">80dp</dimen>
|
||||
<dimen name="action_card_name_text_size">14sp</dimen>
|
||||
<dimen name="corner_radius">4dp</dimen>
|
||||
<dimen name="padding_small">4dp</dimen>
|
||||
<dimen name="padding_normal">8dp</dimen>
|
||||
<dimen name="padding_large">16dp</dimen>
|
||||
<dimen name="fab_margin">16dp</dimen>
|
||||
<dimen name="icon_size">40dp</dimen>
|
||||
<dimen name="monster_card_meta_text_size">12sp</dimen>
|
||||
<dimen name="monster_card_name_text_size">20sp</dimen>
|
||||
<dimen name="monster_tile_meta_text_size">10sp</dimen>
|
||||
<dimen name="monster_tile_name_text_size">16sp</dimen>
|
||||
<dimen name="padding_huge">32dp</dimen>
|
||||
<dimen name="padding_large">16dp</dimen>
|
||||
<dimen name="padding_normal">8dp</dimen>
|
||||
<dimen name="padding_small">4dp</dimen>
|
||||
<dimen name="text_h4_size">20sp</dimen>
|
||||
<dimen name="text_icon_border_padding">2dp</dimen>
|
||||
<dimen name="text_icon_size">16sp</dimen>
|
||||
<dimen name="text_icon_tiny">8sp</dimen>
|
||||
<dimen name="text_margin">16dp</dimen>
|
||||
</resources>
|
||||
|
||||
@@ -27,12 +27,15 @@
|
||||
<string name="label_alignment">Alignment</string>
|
||||
<string name="label_armor">Armor</string>
|
||||
<string name="label_armor_class">Armor Class</string>
|
||||
<string name="label_armorClass_icon">AC</string>
|
||||
<string name="label_base_speed">Base Speed</string>
|
||||
<string name="label_basic_info">Basic Info</string>
|
||||
<string name="label_burrow_speed">Burrow Speed</string>
|
||||
<string name="label_can_hover">Can Hover</string>
|
||||
<string name="label_can_speak_language">Can Speak</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_charisma">Charisma</string>
|
||||
<string name="label_climb_speed">Climb Speed</string>
|
||||
<string name="label_condition_immunities">Condition Immunities</string>
|
||||
@@ -55,7 +58,9 @@
|
||||
<string name="label_has_a_shield">Has a Shield</string>
|
||||
<string name="label_hit_dice">Hit Dice</string>
|
||||
<string name="label_hit_points">Hit Points</string>
|
||||
<string name="label_hitPoints_icon">HP</string>
|
||||
<string name="label_increment_field">+</string>
|
||||
<string name="label_initiative_icon">INIT</string>
|
||||
<string name="label_intelligence">Intelligence</string>
|
||||
<string name="label_lair_actions">Lair Actions</string>
|
||||
<string name="label_languages">Languages</string>
|
||||
|
||||
@@ -1,10 +1,17 @@
|
||||
package com.majinnaibu.monstercards.init;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
|
||||
import androidx.navigation.NavController;
|
||||
import androidx.navigation.NavDestination;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class FlipperInitializer {
|
||||
|
||||
public static void init(Context ctx) {}
|
||||
public static void init(Context ctx) {
|
||||
}
|
||||
|
||||
public static void sendNavigationEvent(NavController controller, NavDestination destination, Bundle arguments) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ buildscript {
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:4.2.1'
|
||||
classpath 'com.android.tools.build:gradle:4.2.2'
|
||||
|
||||
def nav_version = "2.3.0"
|
||||
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
|
||||
@@ -26,4 +26,4 @@ allprojects {
|
||||
|
||||
task clean(type: Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user