From 729113b1b2f96f62d17a1892a6170e98d99b5859 Mon Sep 17 00:00:00 2001 From: Matt Ford Date: Thu, 11 Jul 2024 16:52:30 +0100 Subject: [PATCH 1/5] Implement importing GWC files from file browser --- src/main/AndroidManifest.xml | 111 +++++++----------- .../whereyougo/gui/activity/MainActivity.java | 71 +++++------ .../whereyougo/utils/ContentUtils.java | 30 +++++ src/main/res/values/strings.xml | 1 + 4 files changed, 111 insertions(+), 102 deletions(-) create mode 100644 src/main/java/menion/android/whereyougo/utils/ContentUtils.java diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 39054f65..ea48ce57 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -14,8 +14,14 @@ - - + + + + + tools:replace="icon, label"> + android:exported="true" + android:label="WhereYouGo"> - - - - - - - - - - - - - - + + + + + - - - + + + - + - - - - + + + + @@ -124,17 +89,29 @@ - - + + - + android:name="menion.android.whereyougo.network.activity.DownloadCartridgeActivity" + android:exported="true"> + + + + + + + + + + + + + + + = 0) { + result = cursor.getString(colIndex); + } + } + } + } + if (result == null) { + result = uri.getPath(); + int cut = result.lastIndexOf('/'); + if (cut != -1) { + result = result.substring(cut + 1); + } + } + return result; + } +} diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index a1649212..4796b167 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -33,6 +33,7 @@ Failed Feet Cannot create Root directory, SDCard probably missing.\n\nInsert it into device and run again! + Starting previously imported cartridge Finished Default Select… From 1446ff257c3837f147cfb12b12bbc6ddb973472d Mon Sep 17 00:00:00 2001 From: Matt Ford Date: Thu, 11 Jul 2024 16:54:17 +0100 Subject: [PATCH 2/5] Remove unused imports --- .../android/whereyougo/gui/activity/MainActivity.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/main/java/menion/android/whereyougo/gui/activity/MainActivity.java b/src/main/java/menion/android/whereyougo/gui/activity/MainActivity.java index e0b0fc8a..dc70b6e8 100644 --- a/src/main/java/menion/android/whereyougo/gui/activity/MainActivity.java +++ b/src/main/java/menion/android/whereyougo/gui/activity/MainActivity.java @@ -30,7 +30,6 @@ import menion.android.whereyougo.gui.utils.UtilsGUI; import menion.android.whereyougo.maps.utils.MapDataProvider; import menion.android.whereyougo.maps.utils.MapHelper; -import menion.android.whereyougo.network.activity.DownloadCartridgeActivity; import menion.android.whereyougo.openwig.WLocationService; import menion.android.whereyougo.openwig.WSaveFile; import menion.android.whereyougo.openwig.WSeekableFile; @@ -55,23 +54,17 @@ import android.app.AlertDialog; import android.app.NotificationManager; import android.content.ComponentName; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; -import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Debug; -import android.os.ParcelFileDescriptor; -import android.provider.OpenableColumns; -import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.TextView; -import android.widget.Toast; import androidx.annotation.NonNull; From 839d6b7c15a5321c04de1cdbff382a03702dc664 Mon Sep 17 00:00:00 2001 From: Matt Ford Date: Fri, 12 Jul 2024 09:11:34 +0100 Subject: [PATCH 3/5] Add file pick/import functionality --- .../whereyougo/gui/activity/MainActivity.java | 80 +++++++++++++++---- .../gui/dialog/ChooseCartridgeDialog.java | 1 + src/main/res/values/strings.xml | 2 + 3 files changed, 66 insertions(+), 17 deletions(-) diff --git a/src/main/java/menion/android/whereyougo/gui/activity/MainActivity.java b/src/main/java/menion/android/whereyougo/gui/activity/MainActivity.java index dc70b6e8..714cd0a6 100644 --- a/src/main/java/menion/android/whereyougo/gui/activity/MainActivity.java +++ b/src/main/java/menion/android/whereyougo/gui/activity/MainActivity.java @@ -50,6 +50,7 @@ import static menion.android.whereyougo.permission.PermissionHandler.needAskForPermission; import android.Manifest; +import android.app.Activity; import android.app.ActivityManager; import android.app.AlertDialog; import android.app.NotificationManager; @@ -60,6 +61,7 @@ import android.net.Uri; import android.os.Bundle; import android.os.Debug; +import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; @@ -106,6 +108,9 @@ public class MainActivity extends CustomActivity { public static final int CLOSE_DESTROY_APP_DIALOG_ADDITIONAL_TEXT = 2; public static final int CLOSE_HIDE_APP = 3; + // Activity result request codes + private final int PICK_FILE_TO_IMPORT = 1; + public static CartridgeFile cartridgeFile; public static String selectedFile; @@ -213,6 +218,29 @@ public static void refreshCartridges() { } } + private void openCartridge(Uri uri) { + String originalFilename = ContentUtils.getFileName(getContentResolver(), uri); + File openedFile = new File(FileSystem.ROOT + "/" + originalFilename); + + if (openedFile.exists()) { + ManagerNotify.toastShortMessage(this, getString(R.string.file_already_imported)); + } else { + try ( + InputStream stream = getContentResolver().openInputStream(uri); + OutputStream outStream = Files.newOutputStream(openedFile.toPath()) + ) { + byte[] buffer = new byte[8 * 1024]; + int bytesRead; + while ((bytesRead = stream.read(buffer)) != -1) { + outStream.write(buffer, 0, bytesRead); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + openCartridge(openedFile); + } + public static void openCartridge(final CartridgeFile cartridgeFile) { final CustomActivity activity = A.getMain(); if (activity == null) { @@ -544,23 +572,11 @@ public void onCreate(Bundle savedInstanceState) { if (Intent.ACTION_VIEW.equals(callingIntent.getAction())) { Uri fileUri = callingIntent.getData(); if (fileUri != null) { - try (InputStream stream = getContentResolver().openInputStream(fileUri)) { - String originalFilename = ContentUtils.getFileName(getContentResolver(), fileUri); - File openedFile = new File(FileSystem.ROOT + "/" + originalFilename); - if (openedFile.exists()) { - ManagerNotify.toastShortMessage(this, getString(R.string.file_already_imported)); - } else { - try (OutputStream outStream = Files.newOutputStream(openedFile.toPath())) { - byte[] buffer = new byte[8 * 1024]; - int bytesRead; - while ((bytesRead = stream.read(buffer)) != -1) { - outStream.write(buffer, 0, bytesRead); - } - } - } - openCartridge(openedFile); - } catch (IOException e) { - throw new RuntimeException(e); + String originalFilename = ContentUtils.getFileName(getContentResolver(), fileUri); + if (!originalFilename.endsWith(".gwc")) { + ManagerNotify.toastShortMessage(this, getString(R.string.invalid_file_selected)); + } else { + openCartridge(fileUri); } } else { finish(); @@ -580,6 +596,36 @@ public boolean onCreateOptionsMenu(Menu menu) { return true; } + public void openFilePicker() { + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); + intent.setType("*/*"); + + startActivityForResult(intent, PICK_FILE_TO_IMPORT); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent intent) { + super.onActivityResult(requestCode, resultCode, intent); + Log.d("Main", "Called here"); + if (requestCode == PICK_FILE_TO_IMPORT && resultCode == Activity.RESULT_OK) { + Log.d("Main", "Result ok"); + if (intent != null) { + Uri uri = intent.getData(); + if (uri != null) { + String fileName = ContentUtils.getFileName(getContentResolver(), uri); + Log.d("Main", fileName); + if (!fileName.endsWith(".gwc")) { + ManagerNotify.toastShortMessage(this, getString(R.string.invalid_file_selected)); + } else { + openCartridge(uri); +// dismiss(); + } + } + } + } + } + @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { diff --git a/src/main/java/menion/android/whereyougo/gui/dialog/ChooseCartridgeDialog.java b/src/main/java/menion/android/whereyougo/gui/dialog/ChooseCartridgeDialog.java index 14e97ce9..091d30fb 100644 --- a/src/main/java/menion/android/whereyougo/gui/dialog/ChooseCartridgeDialog.java +++ b/src/main/java/menion/android/whereyougo/gui/dialog/ChooseCartridgeDialog.java @@ -88,6 +88,7 @@ public Dialog createDialog(Bundle savedInstanceState) { .setIcon(R.drawable.ic_title_logo) .setView(listView) .setNeutralButton(R.string.close, null) + .setPositiveButton(getString(R.string.select_file), (dialogInterface, i) -> ((MainActivity)getActivity()).openFilePicker()) .create(); } catch (Exception e) { Logger.e(TAG, "createDialog()", e); diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 4796b167..7750fa62 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -47,6 +47,8 @@ Location on Information Input + Select file + Please select a gwc file Invalid cartridge\n\n %s Invalid URL Invalid value From 756677a9deef06c1bade0d076fbbf062431992c1 Mon Sep 17 00:00:00 2001 From: Matt Ford Date: Fri, 12 Jul 2024 09:22:42 +0100 Subject: [PATCH 4/5] Use MainApplication to get app context A.getMain is null if entrypoint isn't MainActivity --- .../menion/android/whereyougo/utils/NotificationService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/menion/android/whereyougo/utils/NotificationService.java b/src/main/java/menion/android/whereyougo/utils/NotificationService.java index 41994c1d..e1bb4747 100644 --- a/src/main/java/menion/android/whereyougo/utils/NotificationService.java +++ b/src/main/java/menion/android/whereyougo/utils/NotificationService.java @@ -1,5 +1,6 @@ package menion.android.whereyougo.utils; +import menion.android.whereyougo.MainApplication; import menion.android.whereyougo.R; import android.app.Notification; @@ -73,7 +74,7 @@ public int onStartCommand(Intent intent, int flags, int startId) { private void startNotificationService(boolean background) { Logger.v(TAG, "Start notification service."); - Context context = A.getMain().getApplicationContext(); + Context context = MainApplication.getContext(); Intent intent = new Intent(context, menion.android.whereyougo.gui.activity.MainActivity.class); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.setAction(Intent.ACTION_MAIN); From 3cd9fd5d89128d8f23191d8095b96dee824f9224 Mon Sep 17 00:00:00 2001 From: Matt Ford Date: Fri, 12 Jul 2024 10:07:05 +0100 Subject: [PATCH 5/5] Use the no cartridge hint as an empty text for the cartridge list, and do away with the specific no cartridge dialog --- .../whereyougo/gui/activity/MainActivity.java | 16 ---------------- .../gui/dialog/ChooseCartridgeDialog.java | 16 +++++++++++++++- src/main/res/values/strings.xml | 2 +- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/main/java/menion/android/whereyougo/gui/activity/MainActivity.java b/src/main/java/menion/android/whereyougo/gui/activity/MainActivity.java index 714cd0a6..7c0db973 100644 --- a/src/main/java/menion/android/whereyougo/gui/activity/MainActivity.java +++ b/src/main/java/menion/android/whereyougo/gui/activity/MainActivity.java @@ -514,17 +514,6 @@ protected int getCloseValue() { return CLOSE_DESTROY_APP_NO_DIALOG; } - private boolean isAnyCartridgeAvailable() { - if (cartridgeFiles == null || cartridgeFiles.size() == 0) { - UtilsGUI.showDialogInfo( - MainActivity.this, - getString(R.string.no_wherigo_cartridge_available, FileSystem.ROOT)); - return false; - } else { - return true; - } - } - @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { String[] koPermissions = checkKoPermissions(this, permissions); @@ -713,11 +702,6 @@ private void clearPackageFromMemory() { } private void clickStart() { - // check cartridges - if (!isAnyCartridgeAvailable()) { - return; - } - ChooseCartridgeDialog dialog = new ChooseCartridgeDialog(); dialog.setParams(cartridgeFiles); getSupportFragmentManager() diff --git a/src/main/java/menion/android/whereyougo/gui/dialog/ChooseCartridgeDialog.java b/src/main/java/menion/android/whereyougo/gui/dialog/ChooseCartridgeDialog.java index 091d30fb..206f8f01 100644 --- a/src/main/java/menion/android/whereyougo/gui/dialog/ChooseCartridgeDialog.java +++ b/src/main/java/menion/android/whereyougo/gui/dialog/ChooseCartridgeDialog.java @@ -16,9 +16,13 @@ import android.app.Dialog; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.Color; import android.os.Bundle; +import android.view.ViewGroup; import android.widget.BaseAdapter; +import android.widget.LinearLayout; import android.widget.ListView; +import android.widget.TextView; import java.io.File; import java.util.ArrayList; @@ -81,12 +85,22 @@ public Dialog createDialog(Bundle savedInstanceState) { itemLongClicked(position); return true; }); + + TextView textView = new TextView(getActivity()); + textView.setTextColor(Color.GRAY); + textView.setText(R.string.no_wherigo_cartridge_available); + textView.setPadding(15, 15, 15, 15); + listView.setEmptyView(textView); + + LinearLayout layout = new LinearLayout(getContext()); + layout.addView(listView); + layout.addView(textView); adapter = (BaseAdapter) listView.getAdapter(); // construct dialog return new AlertDialog.Builder(getActivity()) .setTitle(R.string.choose_cartridge) .setIcon(R.drawable.ic_title_logo) - .setView(listView) + .setView(layout) .setNeutralButton(R.string.close, null) .setPositiveButton(getString(R.string.select_file), (dialogInterface, i) -> ((MainActivity)getActivity()).openFilePicker()) .create(); diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 7750fa62..6c19aaf6 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -69,7 +69,7 @@ No Location providers available! No satellites No target! - No Wherigo cartridge (*.gwc) is available.\nDownload or copy them into directory \"%1$s\". You can also set a path to custom directory in \"Settings - Main - Wherigo folder\". Make sure you granted the application permission to write to external storage and you have write permission in selected directory. Some newer devices don\'t allow writing to SD card.If you\'re not sure, set \"Wherigo folder\" automatically. + No Wherigo cartridge (*.gwc) is available.\nClick the select file button to import a cartridge.\nYou can also download a cartridge directly by navigating to the download page on the WhereIGo website and choosing to open it in this app. OK Pending Pitch