diff --git a/pkg/android/phoenix/AndroidManifest.xml b/pkg/android/phoenix/AndroidManifest.xml index 2d978a820d..dafdc7e2e6 100644 --- a/pkg/android/phoenix/AndroidManifest.xml +++ b/pkg/android/phoenix/AndroidManifest.xml @@ -24,9 +24,6 @@ android:banner="@drawable/banner" android:extractNativeLibs="true" tools:ignore="UnusedAttribute"> - diff --git a/pkg/android/phoenix/res/values/strings.xml b/pkg/android/phoenix/res/values/strings.xml deleted file mode 100644 index c8e55b6caf..0000000000 --- a/pkg/android/phoenix/res/values/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - Migrate RetroArch Folder - - - Because RetroArch was updated, the location of the RetroArch folder has changed. \n - Would you like to import data from an existing RetroArch folder? - - - Yes, select existing RetroArch folder - - - No, don\'t ask again - - - No, ask next time - - - Copying RetroArch Files… - - - Your RetroArch folder has been migrated. \n - You can find it in the files app under RetroArch > User Data. - - - Your RetroArch folder has been migrated. \n - You can find it in the files app under RetroArch > User Data. \n - There were errors copying some files. - - diff --git a/pkg/android/phoenix/src/com/retroarch/browser/mainmenu/MainMenuActivity.java b/pkg/android/phoenix/src/com/retroarch/browser/mainmenu/MainMenuActivity.java index cc3f37636d..bc555a74f9 100644 --- a/pkg/android/phoenix/src/com/retroarch/browser/mainmenu/MainMenuActivity.java +++ b/pkg/android/phoenix/src/com/retroarch/browser/mainmenu/MainMenuActivity.java @@ -12,6 +12,14 @@ import android.preference.PreferenceActivity; import android.preference.PreferenceManager; import android.provider.Settings; +import java.util.List; +import java.util.ArrayList; +import android.content.pm.PackageManager; +import android.Manifest; +import android.content.DialogInterface; +import android.app.AlertDialog; +import android.util.Log; + /** * {@link PreferenceActivity} subclass that provides all of the * functionality of the main menu screen. @@ -19,7 +27,6 @@ import android.provider.Settings; public final class MainMenuActivity extends PreferenceActivity { public static String PACKAGE_NAME; - final int REQUEST_CODE_START = 120; public void finalStartup() { @@ -56,14 +63,6 @@ public final class MainMenuActivity extends PreferenceActivity retro.putExtra("EXTERNAL", external); } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) - { - if(requestCode == REQUEST_CODE_START) { - finalStartup(); - } - } - @Override public void onCreate(Bundle savedInstanceState) { @@ -76,7 +75,6 @@ public final class MainMenuActivity extends PreferenceActivity UserPreferences.updateConfigFile(this); - Intent i = new Intent(this, MigrateRetroarchFolderActivity.class); - startActivityForResult(i, REQUEST_CODE_START); + finalStartup(); } } diff --git a/pkg/android/phoenix/src/com/retroarch/browser/mainmenu/MigrateRetroarchFolderActivity.java b/pkg/android/phoenix/src/com/retroarch/browser/mainmenu/MigrateRetroarchFolderActivity.java deleted file mode 100644 index 1916aaa582..0000000000 --- a/pkg/android/phoenix/src/com/retroarch/browser/mainmenu/MigrateRetroarchFolderActivity.java +++ /dev/null @@ -1,266 +0,0 @@ -package com.retroarch.browser.mainmenu; - -import android.annotation.TargetApi; -import android.app.Activity; -import android.app.AlertDialog; -import android.app.ProgressDialog; -import android.content.ContentResolver; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.database.Cursor; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Environment; -import android.os.ParcelFileDescriptor; -import android.preference.PreferenceManager; -import android.provider.DocumentsContract; -import android.util.Log; -import android.util.Pair; - -import com.retroarch.R; - -import java.io.File; -import java.lang.ref.WeakReference; -import java.nio.file.Files; -import java.nio.file.StandardCopyOption; -import java.util.ArrayList; - -@TargetApi(26) -public class MigrateRetroarchFolderActivity extends Activity -{ - final int REQUEST_CODE_GET_OLD_RETROARCH_FOLDER = 125; - - @Override - public void onStart() - { - super.onStart(); - - // Needs v26 for some of the file handling functions below. - // Remove the TargetApi annotation to see which. - // If we don't have it, then just skip migration. - if (android.os.Build.VERSION.SDK_INT < 26) { - finish(); - } - if(true || needToMigrate()){ - askToMigrate(); - }else{ - finish(); - } - } - - boolean needToMigrate() - { - // As the RetroArch folder has been moved from shared storage to app-specific storage, - // people upgrading from older versions using the old location will need to migrate their data. - // We identify these users by checking that the app has been updated from an older version, - // and that the older version did not use the new location. - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - boolean isNewInstall; - try{ - PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), 0); - isNewInstall = info.firstInstallTime == info.lastUpdateTime; - }catch(PackageManager.NameNotFoundException ex) { - isNewInstall = true; - } - - // Avoid asking if new install - if(isNewInstall && !prefs.contains("external_retroarch_folder_needs_migrate")){ - SharedPreferences.Editor editor = prefs.edit(); - editor.putBoolean("external_retroarch_folder_needs_migrate", false); - editor.apply(); - } - - return prefs.getBoolean("external_retroarch_folder_needs_migrate", true); - } - - void askToMigrate() - { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(R.string.migrate_retroarch_folder_dialog_title); - builder.setMessage(R.string.migrate_retroarch_folder_dialog_message); - builder.setNegativeButton(R.string.migrate_retroarch_folder_dialog_negative, new DialogInterface.OnClickListener() { - @Override public void onClick(DialogInterface dialogInterface, int i) { - SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(MigrateRetroarchFolderActivity.this).edit(); - editor.putBoolean("external_retroarch_folder_needs_migrate", false); - editor.apply(); - MigrateRetroarchFolderActivity.this.finish(); - } - }); - builder.setNeutralButton(R.string.migrate_retroarch_folder_dialog_neutral, new DialogInterface.OnClickListener() { - @Override public void onClick(DialogInterface dialogInterface, int i) { - SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(MigrateRetroarchFolderActivity.this).edit(); - editor.putBoolean("external_retroarch_folder_needs_migrate", true); - editor.apply(); - MigrateRetroarchFolderActivity.this.finish(); - } - }); - builder.setPositiveButton(R.string.migrate_retroarch_folder_dialog_positive, new DialogInterface.OnClickListener() { - @Override public void onClick(DialogInterface dialogInterface, int i) { - Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); - intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Uri.fromFile(new File( - Environment.getExternalStorageDirectory().getAbsolutePath() + "/RetroArch" - ))); - startActivityForResult(intent, REQUEST_CODE_GET_OLD_RETROARCH_FOLDER); - } - }); - AlertDialog dialog = builder.create(); - dialog.show(); - } - - public void onActivityResult(int requestCode, int resultCode, Intent resultData) - { - super.onActivityResult(requestCode, resultCode, resultData); - if(requestCode == REQUEST_CODE_GET_OLD_RETROARCH_FOLDER){ - if(resultCode == Activity.RESULT_OK && resultData != null){ - copyFiles(resultData.getData()); - }else{ - //User cancelled or otherwise failed. Go back to the picker screen. - askToMigrate(); - } - } - } - - void copyFiles(Uri sourceDir) - { - final ProgressDialog pd = new ProgressDialog(this); - pd.setMax(100); - pd.setTitle(R.string.migrate_retroarch_folder_inprogress); - pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); - pd.setCancelable(false); - - CopyThread thread = new CopyThread() - { - @Override - protected void onPreExecute(){ - super.onPreExecute(); - pd.show(); - } - @Override - protected void onProgressUpdate(Pair... params) - { - super.onProgressUpdate(params); - pd.setProgress(params[0].first); - pd.setMessage(params[0].second); - } - @Override - protected void onPostExecute(Boolean ok) - { - super.onPostExecute(ok); - pd.dismiss(); - postMigrate(ok); - } - }; - - thread.execute(sourceDir); - } - - void postMigrate(boolean ok) - { - SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit(); - editor.putBoolean("external_retroarch_folder_needs_migrate", false); - editor.commit(); - - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setMessage(ok ? - R.string.migrate_retroarch_folder_confirm : - R.string.migrate_retroarch_folder_confirm_witherror - ); - builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - @Override public void onClick(DialogInterface dialogInterface, int i) { - MigrateRetroarchFolderActivity.this.finish(); - } - }); - builder.create().show(); - } - - class CopyThread extends AsyncTask, Boolean> - { - String PACKAGE_NAME; - ContentResolver resolver; - Uri sourceRoot; - boolean error; - ArrayList progress; - public CopyThread() - { - PACKAGE_NAME = MigrateRetroarchFolderActivity.this.getPackageName(); - resolver = MigrateRetroarchFolderActivity.this.getContentResolver(); - } - @Override - protected Boolean doInBackground(Uri... params) - { - sourceRoot = params[0]; - error = false; - progress = new ArrayList<>(); - - String destination = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + PACKAGE_NAME + "/files/RetroArch"; - copyFolder(sourceRoot, new File(destination)); - return !error; - } - void copyFolder(Uri sourceUri, File dest) - { - //create destination folder - if(!(dest.isDirectory() || dest.mkdirs())) { - Log.e("MigrateRetroarchFolder", "Couldn't make new destination folder " + dest.getPath()); - error = true; - return; - } - - Uri sourceChildrenResolver; - try{ //for subfolders - sourceChildrenResolver = DocumentsContract.buildChildDocumentsUriUsingTree(sourceUri, DocumentsContract.getDocumentId(sourceUri)); - }catch(IllegalArgumentException ex){ //for root selected by document picker - sourceChildrenResolver = DocumentsContract.buildChildDocumentsUriUsingTree(sourceUri, DocumentsContract.getTreeDocumentId(sourceUri)); - } - progress.add(new int[]{0, 1}); - try( - Cursor c = resolver.query(sourceChildrenResolver, new String[]{DocumentsContract.Document.COLUMN_DOCUMENT_ID, DocumentsContract.Document.COLUMN_DISPLAY_NAME, DocumentsContract.Document.COLUMN_MIME_TYPE}, null, null, null) - ) { - if(c == null) { - Log.e("MigrateRetroarchFolder", "Could not list files in source folder " + sourceUri.toString()); - error = true; - return; - } - progress.get(progress.size() - 1)[1] = c.getCount(); - while(c.moveToNext()){ //loop through children returned - String childFilename = c.getString(1); - Uri childUri = DocumentsContract.buildDocumentUriUsingTree(sourceUri, c.getString(0)); - String childDocumentId = DocumentsContract.getDocumentId(childUri); - File destFile = new File(dest, childFilename); - - if(c.getString(2).equals(DocumentsContract.Document.MIME_TYPE_DIR)){ //is a folder, recurse - copyFolder(childUri, destFile); - }else{ //is a file, copy it - try( - ParcelFileDescriptor pfd = resolver.openFileDescriptor(childUri, "r"); - ParcelFileDescriptor.AutoCloseInputStream sourceStream = new ParcelFileDescriptor.AutoCloseInputStream(pfd); - ) { - Files.copy(sourceStream, destFile.toPath(), StandardCopyOption.REPLACE_EXISTING); - }catch(Exception ex){ - Log.e("MigrateRetroarchFolder", "Error copying file " + childDocumentId, ex); - error = true; - } - } - progress.get(progress.size() - 1)[0]++; - publishProgress(new Pair(getProgressPercentage(), destFile.getPath())); - } - }catch(Exception ex){ - Log.e("MigrateRetroarchFolder", "Error while copying", ex); - error = true; - } - progress.remove(progress.size() - 1); - } - int getProgressPercentage() - { - float sum = 0; - int lastDenominator = 1; - for(int[] frac : progress){ - sum += ((float) frac[0]) / frac[1] / lastDenominator; - lastDenominator *= frac[1]; - } - return (int) (sum * 100); - } - } -}