From 87b25e583dcb2bc1079a7b5906b97a787ac04be8 Mon Sep 17 00:00:00 2001 From: Bektur Date: Fri, 5 Jun 2020 07:22:19 +0600 Subject: [PATCH] Show Toast in UI thread and fix unpacking on Android 10 (#9900) --- .../net/minetest/minetest/CopyZipTask.java | 23 ++++++++++++------- .../net/minetest/minetest/MainActivity.java | 7 ++++++ .../net/minetest/minetest/UnzipService.java | 11 +++++---- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/build/android/app/src/main/java/net/minetest/minetest/CopyZipTask.java b/build/android/app/src/main/java/net/minetest/minetest/CopyZipTask.java index d6e9d9ee1..6d4b6ab0f 100644 --- a/build/android/app/src/main/java/net/minetest/minetest/CopyZipTask.java +++ b/build/android/app/src/main/java/net/minetest/minetest/CopyZipTask.java @@ -20,11 +20,12 @@ with this program; if not, write to the Free Software Foundation, Inc., package net.minetest.minetest; -import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; + import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -33,10 +34,10 @@ import java.lang.ref.WeakReference; public class CopyZipTask extends AsyncTask { - private final WeakReference contextRef; + private final WeakReference activityRef; - CopyZipTask(Context context) { - contextRef = new WeakReference<>(context); + CopyZipTask(AppCompatActivity activity) { + activityRef = new WeakReference<>(activity); } protected String doInBackground(String... params) { @@ -51,11 +52,14 @@ public class CopyZipTask extends AsyncTask { private void copyAsset(String zipName) { String filename = zipName.substring(zipName.lastIndexOf("/") + 1); - try (InputStream in = contextRef.get().getAssets().open(filename); + try (InputStream in = activityRef.get().getAssets().open(filename); OutputStream out = new FileOutputStream(zipName)) { copyFile(in, out); } catch (IOException e) { - Toast.makeText(contextRef.get(), e.getLocalizedMessage(), Toast.LENGTH_LONG).show(); + AppCompatActivity activity = activityRef.get(); + if (activity != null) { + activity.runOnUiThread(() -> Toast.makeText(activityRef.get(), e.getLocalizedMessage(), Toast.LENGTH_LONG).show()); + } cancel(true); } } @@ -68,8 +72,11 @@ public class CopyZipTask extends AsyncTask { } private void startUnzipService(String file) { - Intent intent = new Intent(contextRef.get(), UnzipService.class); + Intent intent = new Intent(activityRef.get(), UnzipService.class); intent.putExtra(UnzipService.EXTRA_KEY_IN_FILE, file); - contextRef.get().startService(intent); + AppCompatActivity activity = activityRef.get(); + if (activity != null) { + activity.startService(intent); + } } } diff --git a/build/android/app/src/main/java/net/minetest/minetest/MainActivity.java b/build/android/app/src/main/java/net/minetest/minetest/MainActivity.java index 1e60beb55..2aa50d9ad 100644 --- a/build/android/app/src/main/java/net/minetest/minetest/MainActivity.java +++ b/build/android/app/src/main/java/net/minetest/minetest/MainActivity.java @@ -43,6 +43,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static net.minetest.minetest.UnzipService.ACTION_FAILURE; import static net.minetest.minetest.UnzipService.ACTION_PROGRESS; import static net.minetest.minetest.UnzipService.ACTION_UPDATE; import static net.minetest.minetest.UnzipService.FAILURE; @@ -71,6 +72,7 @@ public class MainActivity extends AppCompatActivity { } mTextView.setVisibility(View.VISIBLE); } else if (progress == FAILURE) { + Toast.makeText(MainActivity.this, intent.getStringExtra(ACTION_FAILURE), Toast.LENGTH_LONG).show(); finish(); } else if (progress == SUCCESS) startNative(); @@ -138,6 +140,11 @@ public class MainActivity extends AppCompatActivity { startActivity(intent); } + @Override + public void onBackPressed() { + // Prevent abrupt interruption when copy game files from assets + } + @Override protected void onDestroy() { super.onDestroy(); diff --git a/build/android/app/src/main/java/net/minetest/minetest/UnzipService.java b/build/android/app/src/main/java/net/minetest/minetest/UnzipService.java index 6356dff19..b69f7f36e 100644 --- a/build/android/app/src/main/java/net/minetest/minetest/UnzipService.java +++ b/build/android/app/src/main/java/net/minetest/minetest/UnzipService.java @@ -42,20 +42,21 @@ import java.util.zip.ZipInputStream; public class UnzipService extends IntentService { public static final String ACTION_UPDATE = "net.minetest.minetest.UPDATE"; public static final String ACTION_PROGRESS = "net.minetest.minetest.PROGRESS"; + public static final String ACTION_FAILURE = "net.minetest.minetest.FAILURE"; public static final String EXTRA_KEY_IN_FILE = "file"; public static final int SUCCESS = -1; public static final int FAILURE = -2; - private static final String TAG = "UnzipService"; private final int id = 1; private NotificationManager mNotifyManager; private boolean isSuccess = true; + private String failureMessage; public UnzipService() { super("net.minetest.minetest.UnzipService"); } private void isDir(String dir, String location) { - File f = new File(location + dir); + File f = new File(location, dir); if (!f.isDirectory()) f.mkdirs(); } @@ -99,7 +100,8 @@ public class UnzipService extends IntentService { private void unzip(Intent intent) { String zip = intent.getStringExtra(EXTRA_KEY_IN_FILE); - String location = Environment.getExternalStorageDirectory() + "/Minetest/"; + isDir("Minetest", Environment.getExternalStorageDirectory().toString()); + String location = Environment.getExternalStorageDirectory() + File.separator + "Minetest" + File.separator; int per = 0; int size = getSummarySize(zip); File zipFile = new File(zip); @@ -124,13 +126,14 @@ public class UnzipService extends IntentService { } } catch (IOException e) { isSuccess = false; - Toast.makeText(this, e.getLocalizedMessage(), Toast.LENGTH_LONG).show(); + failureMessage = e.getLocalizedMessage(); } } private void publishProgress(int progress) { Intent intentUpdate = new Intent(ACTION_UPDATE); intentUpdate.putExtra(ACTION_PROGRESS, progress); + if (!isSuccess) intentUpdate.putExtra(ACTION_FAILURE, failureMessage); sendBroadcast(intentUpdate); }