Adds one central import form.

This commit is contained in:
2026-09-21 11:36:28 -07:00
committed by Tom
parent 339e413f82
commit d099d878a0
8 changed files with 71 additions and 42 deletions

View File

@@ -138,8 +138,7 @@ public class CollectionDetailFragment extends MCFragment {
String[] options = new String[]{ String[] options = new String[]{
getString(R.string.action_add_monster), getString(R.string.action_add_monster),
getString(R.string.action_create_monster), getString(R.string.action_create_monster),
getString(R.string.action_import_monster_from_url), getString(R.string.action_import)
getString(R.string.action_import_monster_from_file)
}; };
new AlertDialog.Builder(requireContext()) new AlertDialog.Builder(requireContext())
.setTitle(R.string.title_collection_actions) .setTitle(R.string.title_collection_actions)
@@ -149,9 +148,7 @@ public class CollectionDetailFragment extends MCFragment {
} else if (which == 1) { } else if (which == 1) {
createNewMonster(); createNewMonster();
} else if (which == 2) { } else if (which == 2) {
showImportUrlDialog(); showImportDialog();
} else if (which == 3) {
importMonsterFromFile();
} }
}) })
.setNegativeButton(R.string.dialog_cancel, null) .setNegativeButton(R.string.dialog_cancel, null)

View File

@@ -151,8 +151,7 @@ public class DashboardFragment extends MCFragment {
getString(R.string.action_add_single_monster), getString(R.string.action_add_single_monster),
getString(R.string.action_add_collection_option), getString(R.string.action_add_collection_option),
getString(R.string.action_create_monster), getString(R.string.action_create_monster),
getString(R.string.action_import_monster_from_url), getString(R.string.action_import)
getString(R.string.action_import_monster_from_file)
}; };
new AlertDialog.Builder(requireContext()) new AlertDialog.Builder(requireContext())
.setTitle(R.string.title_dashboard_actions) .setTitle(R.string.title_dashboard_actions)
@@ -164,9 +163,7 @@ public class DashboardFragment extends MCFragment {
} else if (which == 2) { } else if (which == 2) {
createNewMonster(); createNewMonster();
} else if (which == 3) { } else if (which == 3) {
showImportUrlDialog(); showImportDialog();
} else if (which == 4) {
importMonsterFromFile();
} }
}) })
.setNegativeButton(R.string.dialog_cancel, null) .setNegativeButton(R.string.dialog_cancel, null)

View File

@@ -76,11 +76,8 @@ public class LibraryFragment extends MCFragment {
@Override @Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) { public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == R.id.menu_action_import_from_url) { if (item.getItemId() == R.id.menu_action_import) {
showImportUrlDialog(); showImportDialog();
return true;
} else if (item.getItemId() == R.id.menu_action_import_from_file) {
importMonsterFromFile();
return true; return true;
} else if (item.getItemId() == R.id.menu_action_export_library) { } else if (item.getItemId() == R.id.menu_action_export_library) {
exportLibrary(); exportLibrary();
@@ -188,8 +185,7 @@ public class LibraryFragment extends MCFragment {
private void showLibraryFabOptionsDialog() { private void showLibraryFabOptionsDialog() {
String[] options = new String[]{ String[] options = new String[]{
getString(R.string.action_create_monster), getString(R.string.action_create_monster),
getString(R.string.action_import_monster_from_url), getString(R.string.action_import)
getString(R.string.action_import_monster_from_file)
}; };
new AlertDialog.Builder(requireContext()) new AlertDialog.Builder(requireContext())
.setTitle(R.string.title_library_actions) .setTitle(R.string.title_library_actions)
@@ -197,9 +193,7 @@ public class LibraryFragment extends MCFragment {
if (which == 0) { if (which == 0) {
createNewMonster(); createNewMonster();
} else if (which == 1) { } else if (which == 1) {
showImportUrlDialog(); showImportDialog();
} else if (which == 2) {
importMonsterFromFile();
} }
}) })
.setNegativeButton(R.string.dialog_cancel, null) .setNegativeButton(R.string.dialog_cancel, null)

View File

@@ -114,16 +114,17 @@ public class MCFragment extends Fragment {
importMonsterFromFile(); importMonsterFromFile();
} }
public void showImportUrlDialog() { public void showImportDialog() {
Context context = requireContext(); Context context = requireContext();
AlertDialog.Builder builder = new AlertDialog.Builder(context); AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(R.string.dialog_import_url_title); builder.setTitle(R.string.dialog_import_title);
builder.setMessage(R.string.dialog_import_url_message);
final EditText input = new EditText(context); View view = getLayoutInflater().inflate(R.layout.dialog_import, null);
input.setHint(R.string.dialog_import_url_hint); builder.setView(view);
input.setSingleLine(true);
AlertDialog dialog = builder.create();
final EditText input = view.findViewById(R.id.edit_text_url);
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
if (clipboard != null && clipboard.hasPrimaryClip()) { if (clipboard != null && clipboard.hasPrimaryClip()) {
ClipData clip = clipboard.getPrimaryClip(); ClipData clip = clipboard.getPrimaryClip();
@@ -139,20 +140,22 @@ public class MCFragment extends Fragment {
} }
} }
builder.setView(input); view.findViewById(R.id.button_import_url).setOnClickListener(v -> {
builder.setPositiveButton(R.string.dialog_import, (dialog, which) -> {
String urlOrId = input.getText().toString().trim(); String urlOrId = input.getText().toString().trim();
if (!urlOrId.isEmpty()) { if (!urlOrId.isEmpty()) {
if (getActivity() instanceof MainActivity) { if (getActivity() instanceof MainActivity) {
((MainActivity) getActivity()).importMonsterFromInputAndNavigate(urlOrId); ((MainActivity) getActivity()).importMonsterFromInputAndNavigate(urlOrId);
} }
} }
dialog.dismiss();
}); });
builder.setNegativeButton(R.string.dialog_cancel, (dialog, which) -> dialog.cancel()); view.findViewById(R.id.button_import_file).setOnClickListener(v -> {
importMonsterFromFile();
dialog.dismiss();
});
builder.show(); dialog.show();
} }
public void createNewMonster() { public void createNewMonster() {

View File

@@ -0,0 +1,43 @@
<?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="vertical"
android:padding="24dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/dialog_import_message"
android:paddingBottom="8dp" />
<EditText
android:id="@+id/edit_text_url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/dialog_import_url_hint"
android:inputType="textUri"
android:importantForAutofill="no"
android:singleLine="true" />
<Button
android:id="@+id/button_import_url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/action_import_from_url" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:background="?android:attr/listDivider" />
<Button
android:id="@+id/button_import_file"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/action_import_monster_from_file" />
</LinearLayout>

View File

@@ -4,6 +4,6 @@
<item <item
android:id="@+id/menu_action_import_monster" android:id="@+id/menu_action_import_monster"
android:icon="@drawable/ic_library_add_24" android:icon="@drawable/ic_library_add_24"
android:title="@string/action_import_monster" android:title="@string/action_import"
app:showAsAction="always" /> app:showAsAction="always" />
</menu> </menu>

View File

@@ -3,13 +3,8 @@
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item <item
android:id="@+id/menu_action_import_from_url" android:id="@+id/menu_action_import"
android:title="@string/action_import_from_url" android:title="@string/action_import"
app:showAsAction="never" />
<item
android:id="@+id/menu_action_import_from_file"
android:title="@string/action_import_monster_from_file"
app:showAsAction="never" /> app:showAsAction="never" />
<item <item

View File

@@ -11,7 +11,7 @@
<string name="action_add_skill">Add Skill</string> <string name="action_add_skill">Add Skill</string>
<string name="action_add_trait">Add Trait</string> <string name="action_add_trait">Add Trait</string>
<string name="action_edit">Edit</string> <string name="action_edit">Edit</string>
<string name="action_import_monster">Import File</string> <string name="action_import">Import</string>
<string name="app_name">MonsterCards</string> <string name="app_name">MonsterCards</string>
<string name="charisma_abbreviation">CHA</string> <string name="charisma_abbreviation">CHA</string>
<string name="constitution_abbreviation">CON</string> <string name="constitution_abbreviation">CON</string>
@@ -163,8 +163,8 @@
<string name="snackbar_dashboard_cleared">Dashboard cleared</string> <string name="snackbar_dashboard_cleared">Dashboard cleared</string>
<string name="no_monsters_available">No monsters available in library. Create one first!</string> <string name="no_monsters_available">No monsters available in library. Create one first!</string>
<string name="action_import_from_url">Import URL</string> <string name="action_import_from_url">Import URL</string>
<string name="dialog_import_url_title">Import Character</string> <string name="dialog_import_title">Import</string>
<string name="dialog_import_url_message">Enter or paste a D&amp;D Beyond URL, Character ID, or Open5e JSON payload:</string> <string name="dialog_import_message">Enter or paste a URL, ID, or data payload:</string>
<string name="dialog_import_url_hint">e.g. D&amp;D Beyond URL or Open5e JSON</string> <string name="dialog_import_url_hint">e.g. D&amp;D Beyond URL or Open5e JSON</string>
<string name="dialog_import">Import</string> <string name="dialog_import">Import</string>
<string name="toast_importing_url">Importing…</string> <string name="toast_importing_url">Importing…</string>