From f53349e3dd0dfcea9a4778e53e09f15b1046df9e Mon Sep 17 00:00:00 2001 From: twinaphex Date: Wed, 15 Aug 2018 10:46:01 +0200 Subject: [PATCH] Move MSVC 2017 files to android/phoenix --- .../msvc-2017-android.NativeActivity.vcxproj | 6 +- ...017-android.NativeActivity.vcxproj.filters | 0 .../msvc-2017-android.Packaging.androidproj | 11 +- .../phoenix}/msvc-2017-android.sln | 4 +- .../AndroidManifest.xml | 43 --- .../msvc-2017-android.Packaging/build.xml | 90 ----- .../res/drawable-hdpi/ic_launcher.png | Bin 1329 -> 0 bytes .../res/drawable-ldpi/ic_launcher.png | Bin 690 -> 0 bytes .../res/drawable-mdpi/ic_launcher.png | Bin 853 -> 0 bytes .../res/drawable-xhdpi/banner.png | Bin 4423 -> 0 bytes .../res/drawable-xhdpi/ic_launcher.png | Bin 1678 -> 0 bytes .../res/drawable-xhdpi/ouya_icon.png | Bin 19152 -> 0 bytes .../res/drawable-xxhdpi/ic_launcher.png | Bin 2524 -> 0 bytes .../res/drawable-xxxhdpi/ic_launcher.png | Bin 3412 -> 0 bytes .../res/drawable/banner.png | Bin 4423 -> 0 bytes .../browser/mainmenu/MainMenuActivity.java | 200 ----------- .../browser/preferences/util/ConfigFile.java | 281 ---------------- .../preferences/util/UserPreferences.java | 300 ----------------- .../retroactivity/RetroActivityCamera.java | 225 ------------- .../retroactivity/RetroActivityCommon.java | 141 -------- .../retroactivity/RetroActivityFuture.java | 87 ----- .../retroactivity/RetroActivityIntent.java | 105 ------ .../retroactivity/RetroActivityLocation.java | 316 ------------------ .../retroactivity/RetroActivityPast.java | 7 - 24 files changed, 6 insertions(+), 1810 deletions(-) rename pkg/{msvc/msvc-2017-android/msvc-2017-android.NativeActivity => android/phoenix}/msvc-2017-android.NativeActivity.vcxproj (98%) rename pkg/{msvc/msvc-2017-android/msvc-2017-android.NativeActivity => android/phoenix}/msvc-2017-android.NativeActivity.vcxproj.filters (100%) rename pkg/{msvc/msvc-2017-android/msvc-2017-android.Packaging => android/phoenix}/msvc-2017-android.Packaging.androidproj (90%) rename pkg/{msvc/msvc-2017-android => android/phoenix}/msvc-2017-android.sln (92%) delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/AndroidManifest.xml delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/build.xml delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable-hdpi/ic_launcher.png delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable-ldpi/ic_launcher.png delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable-mdpi/ic_launcher.png delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable-xhdpi/banner.png delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable-xhdpi/ic_launcher.png delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable-xhdpi/ouya_icon.png delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable-xxhdpi/ic_launcher.png delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable-xxxhdpi/ic_launcher.png delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable/banner.png delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/mainmenu/MainMenuActivity.java delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/preferences/util/ConfigFile.java delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/preferences/util/UserPreferences.java delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityCamera.java delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityCommon.java delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityFuture.java delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityIntent.java delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityLocation.java delete mode 100644 pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityPast.java diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.NativeActivity/msvc-2017-android.NativeActivity.vcxproj b/pkg/android/phoenix/msvc-2017-android.NativeActivity.vcxproj similarity index 98% rename from pkg/msvc/msvc-2017-android/msvc-2017-android.NativeActivity/msvc-2017-android.NativeActivity.vcxproj rename to pkg/android/phoenix/msvc-2017-android.NativeActivity.vcxproj index b491d44aaf..cb5cb62c20 100644 --- a/pkg/msvc/msvc-2017-android/msvc-2017-android.NativeActivity/msvc-2017-android.NativeActivity.vcxproj +++ b/pkg/android/phoenix/msvc-2017-android.NativeActivity.vcxproj @@ -35,7 +35,7 @@ - + CompileAsC CompileAsC CompileAsC @@ -45,7 +45,7 @@ CompileAsC CompileAsC - + c++11 c++11 c++11 @@ -55,7 +55,7 @@ c++11 c++11 - + c++11 c++11 c++11 diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.NativeActivity/msvc-2017-android.NativeActivity.vcxproj.filters b/pkg/android/phoenix/msvc-2017-android.NativeActivity.vcxproj.filters similarity index 100% rename from pkg/msvc/msvc-2017-android/msvc-2017-android.NativeActivity/msvc-2017-android.NativeActivity.vcxproj.filters rename to pkg/android/phoenix/msvc-2017-android.NativeActivity.vcxproj.filters diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/msvc-2017-android.Packaging.androidproj b/pkg/android/phoenix/msvc-2017-android.Packaging.androidproj similarity index 90% rename from pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/msvc-2017-android.Packaging.androidproj rename to pkg/android/phoenix/msvc-2017-android.Packaging.androidproj index 8c8883cb06..175d7df105 100644 --- a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/msvc-2017-android.Packaging.androidproj +++ b/pkg/android/phoenix/msvc-2017-android.Packaging.androidproj @@ -44,42 +44,34 @@ true Application - android-23 false Application - android-23 true Application - android-23 false Application - android-23 true Application - android-23 false Application - android-23 true Application - android-23 false Application - android-23 @@ -129,10 +121,9 @@ - - + {e27d73ec-6148-4817-b75c-adaa0c563939} diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.sln b/pkg/android/phoenix/msvc-2017-android.sln similarity index 92% rename from pkg/msvc/msvc-2017-android/msvc-2017-android.sln rename to pkg/android/phoenix/msvc-2017-android.sln index 3b63d42249..45919ce71c 100644 --- a/pkg/msvc/msvc-2017-android/msvc-2017-android.sln +++ b/pkg/android/phoenix/msvc-2017-android.sln @@ -5,9 +5,9 @@ VisualStudioVersion = 15.0.26228.9 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "msvc-2017-android", "msvc-2017-android", "{82FC602D-4083-4ED5-858B-A066A4280E4C}" EndProject -Project("{39E2626F-3545-4960-A6E8-258AD8476CE5}") = "msvc-2017-android.Packaging", "msvc-2017-android.Packaging\msvc-2017-android.Packaging.androidproj", "{94B52983-76DE-4545-A708-433C377727C7}" +Project("{39E2626F-3545-4960-A6E8-258AD8476CE5}") = "msvc-2017-android.Packaging", "msvc-2017-android.Packaging.androidproj", "{94B52983-76DE-4545-A708-433C377727C7}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "msvc-2017-android.NativeActivity", "msvc-2017-android.NativeActivity\msvc-2017-android.NativeActivity.vcxproj", "{E27D73EC-6148-4817-B75C-ADAA0C563939}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "msvc-2017-android.NativeActivity", "msvc-2017-android.NativeActivity.vcxproj", "{E27D73EC-6148-4817-B75C-ADAA0C563939}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/AndroidManifest.xml b/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/AndroidManifest.xml deleted file mode 100644 index 703a158568..0000000000 --- a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/AndroidManifest.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/build.xml b/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/build.xml deleted file mode 100644 index 4dd78480d3..0000000000 --- a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/build.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable-hdpi/ic_launcher.png b/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable-hdpi/ic_launcher.png deleted file mode 100644 index d33d1953f9b1d04db50391c6bac98141921050f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1329 zcmV-118o96bJC*&m?vdG;s?A1&Va=AVSc+q`1m}h5(UaFI@x+=ww0YDhORV$Qlx$h!nI1 zT9}?|dFo>B6@kut0lt7<;J(1=AYS(JLo!M8ODYfWpG1+oKizvs37`PVDyyur$|`G< zYs=2Iot-rg9|s@TqiP!fb`?c=C(H7WilTgwW%=VeM^TgycHRNNu06)sID7Sa{ZCa@ zaT8Oo*Z%>4y*Nl)0I*9beV_Lr(hjBcy*-m6Ew^m|*e8Vil=lEK0QwmKo=f4F^8%xSWLM?LdYcV0i+#5$OHfmA;L1_K+pe2K+j>(tV09s0l*7F z$mhHVkO9zV0C-UXl|Us>2~+|VFeOk4v;jcPW)siP&z;2GPZIkmB#^4AXcz|a8jVJg z-#?j5ocHUxjwdH4n+4QtHqo-ISV*JM2pMCDh-g_BHX042l%g!ln*+p=_&^a6d%fO+ z@9A_p&U+YR*lxFxQtITfNQDAYRTX=^o&&@f!;6cHP&kN){eIttlLS&KK&ELTV+);%Qm4~#ow#Y5czJp0OVsN3``GPvT@eS5xR@bcq`SL2=XG7zoxa795(hF( z({<7!5FrG|(jr;q1U%XeIEP)tfsO!2f;yLj?#8a(Se@hHV>_1^EOQ0|% z_Myaq#QqbuEX%^{>uXmuO^duAP1AhwHt8_s?L&zHdDrqfm)M6A0}}hsx|i685(Db> zdVx)uC(iOqs|>>kY}P!f0I8~ql+wV4O9;W?aG1A?Q{w&5LrD~96_WS;uI1{RaI0J zr4TrU1xgcXV}Q~?ii-1CpiG_@OA09tjt%r{9H3nQIFuymyR?ClK#Gea%Q8xm)P=)&2&6ui(FDRzm}A!{SNcF96`{N~Q8cwOakXTCM(( zW+X|{DwWDjlt_}K#mM#X@$vUZM@N!9#>h`S^JR7b0IvYx4FG%t0B-@{+cnQydn|A4 zu^m8+=jH+Ie_jB9X8`ch-q~vaI9l_(w#V|)9$Tz`UJ#LX0bm~%)9|Ui({;{Mdo26# n$p7x(wFTwBzm!#0S?ScjE;XFU#%3qB00000NkvXXu0mjfLn3pG diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable-ldpi/ic_launcher.png b/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable-ldpi/ic_launcher.png deleted file mode 100644 index 555fbd7685f26473a95b1f3899ec7b6ee3fa6c5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 690 zcmV;j0!{siP)#TP3DO(qjWgm$~VaGuZSi=d%Uh)^g*CX=yD9u9{| zrBcM>@gsJiUfHhltSacClPPRs;BIaCdA3VesPpe%~@? zB9Q>N{nx<=plQ};rN`qDzuzyj*-Xac@k*Y{<&sDwBGc(qMx)U>yIV9hIdD&{kjv#F z7!0zF-L-540)eF!RRujX&YBU>1RemCN~NufF|Y^h0MCIju)Fq&yzSw3y8*7Aszn^f zl9?_=uh(1fDwWDI%KJ@Q%DH1b3LF0Q!C-)hkV>U&`KNBE>xfZ&o~F}j)$iTb#gs}V zfX65Cb-Ue&2tJ<=<36>Km|cK;KL1_U^?l&cDPp`X7K>kMwc0mh{dk?bu>%JV9Q?2N Y4fe3ozoLd_yZ`_I07*qoM6N<$g2W^{m;e9( diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable-mdpi/ic_launcher.png b/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable-mdpi/ic_launcher.png deleted file mode 100644 index a338dfb2f9e9657505c316aeb70254359fbe6d09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 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 DnS>gY diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable-xhdpi/ic_launcher.png b/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable-xhdpi/ic_launcher.png deleted file mode 100644 index 7eb088dc92430c280f73fefbc27acb048035b0e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1678 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 GV*d?_DN<+v diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable/banner.png b/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/res/drawable/banner.png deleted file mode 100644 index bcf43ef5aae716ad41a273bad6688c3a3e4fe558..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4423 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 DnS>gY diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/mainmenu/MainMenuActivity.java b/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/mainmenu/MainMenuActivity.java deleted file mode 100644 index 88d25d6ee8..0000000000 --- a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/mainmenu/MainMenuActivity.java +++ /dev/null @@ -1,200 +0,0 @@ -package com.retroarch.browser.mainmenu; - -import com.retroarch.browser.preferences.util.UserPreferences; -import com.retroarch.browser.retroactivity.RetroActivityFuture; -import com.retroarch.browser.retroactivity.RetroActivityPast; - -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.ApplicationInfo; -import android.media.AudioManager; -import android.os.Build; -import android.os.Bundle; -import android.os.Environment; -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. - */ -public final class MainMenuActivity extends PreferenceActivity -{ - final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124; - boolean checkPermissions = false; - - public void showMessageOKCancel(String message, DialogInterface.OnClickListener onClickListener) - { - new AlertDialog.Builder(this).setMessage(message) - .setPositiveButton("OK", onClickListener).setCancelable(false) - .setNegativeButton("Cancel", null).create().show(); - } - - private boolean addPermission(List permissionsList, String permission) - { - if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) - { - permissionsList.add(permission); - - // Check for Rationale Option - if (!shouldShowRequestPermissionRationale(permission)) - return false; - } - - return true; - } - - public void checkRuntimePermissions() - { - if (android.os.Build.VERSION.SDK_INT >= 23) - { - // Android 6.0+ needs runtime permission checks - List permissionsNeeded = new ArrayList(); - final List permissionsList = new ArrayList(); - - if (!addPermission(permissionsList, Manifest.permission.READ_EXTERNAL_STORAGE)) - permissionsNeeded.add("Read External Storage"); - if (!addPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE)) - permissionsNeeded.add("Write External Storage"); - - if (permissionsList.size() > 0) - { - checkPermissions = true; - - if (permissionsNeeded.size() > 0) - { - // Need Rationale - Log.i("MainMenuActivity", "Need to request external storage permissions."); - - String message = "You need to grant access to " + permissionsNeeded.get(0); - - for (int i = 1; i < permissionsNeeded.size(); i++) - message = message + ", " + permissionsNeeded.get(i); - - showMessageOKCancel(message, - new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dialog, int which) - { - if (which == AlertDialog.BUTTON_POSITIVE) - { - requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), - REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); - - Log.i("MainMenuActivity", "User accepted request for external storage permissions."); - } - } - }); - } - else - { - requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), - REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); - - Log.i("MainMenuActivity", "Requested external storage permissions."); - } - } - } - - if (!checkPermissions) - { - finalStartup(); - } - } - - public void finalStartup() - { - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - Intent retro; - - if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)) - { - retro = new Intent(this, RetroActivityFuture.class); - } - else - { - retro = new Intent(this, RetroActivityPast.class); - } - - retro.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - - startRetroActivity( - retro, - null, - prefs.getString("libretro_path", getApplicationInfo().dataDir + "/cores/"), - UserPreferences.getDefaultConfigPath(this), - Settings.Secure.getString(getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD), - getApplicationInfo().dataDir, - getApplicationInfo().sourceDir); - startActivity(retro); - finish(); - } - - @Override - public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) - { - switch (requestCode) - { - case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: - for (int i = 0; i < permissions.length; i++) - { - if(grantResults[i] == PackageManager.PERMISSION_GRANTED) - { - Log.i("MainMenuActivity", "Permission: " + permissions[i] + " was granted."); - } - else - { - Log.i("MainMenuActivity", "Permission: " + permissions[i] + " was not granted."); - } - } - - break; - default: - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - break; - } - - finalStartup(); - } - - public static void startRetroActivity(Intent retro, String contentPath, String corePath, - String configFilePath, String imePath, String dataDirPath, String dataSourcePath) - { - if (contentPath != null) { - retro.putExtra("ROM", contentPath); - } - retro.putExtra("LIBRETRO", corePath); - retro.putExtra("CONFIGFILE", configFilePath); - retro.putExtra("IME", imePath); - retro.putExtra("DATADIR", dataDirPath); - retro.putExtra("APK", dataSourcePath); - retro.putExtra("SDCARD", Environment.getExternalStorageDirectory().getAbsolutePath()); - retro.putExtra("DOWNLOADS", Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath()); - retro.putExtra("SCREENSHOTS", Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()); - String external = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/com.retroarch/files"; - retro.putExtra("EXTERNAL", external); - } - - @Override - public void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - - // Bind audio stream to hardware controls. - setVolumeControlStream(AudioManager.STREAM_MUSIC); - - UserPreferences.updateConfigFile(this); - - checkRuntimePermissions(); - } -} diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/preferences/util/ConfigFile.java b/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/preferences/util/ConfigFile.java deleted file mode 100644 index eccaf730cb..0000000000 --- a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/preferences/util/ConfigFile.java +++ /dev/null @@ -1,281 +0,0 @@ -package com.retroarch.browser.preferences.util; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.HashMap; -import java.util.Map; - -import android.util.Log; - -/** - * Represents a configuration file that works off of a key-value pair - * in the form [key name] = "[value]". - */ -public final class ConfigFile -{ - // Map containing all of the key-value pairs. - private final HashMap map = new HashMap(); - - /** - * Constructor - */ - public ConfigFile() - { - } - - /** - * Constructor - * - * @param filePath The path to the configuration file to open. - */ - public ConfigFile(String filePath) - { - if (filePath == null) - throw new IllegalArgumentException("filePath cannot be null."); - - try - { - open(filePath); - } - catch (IOException ioe) - { - Log.e("ConfigFile", "Stream reading the configuration file was suddenly closed for an unknown reason."); - } - } - - /** - * Parses a configuration file from the given stream - * and appends the parsed values to the key-value map. - * - * @param stream The {@link InputStream} containing the configuration file to parse. - */ - public void append(InputStream stream) throws IOException - { - BufferedReader br = new BufferedReader(new InputStreamReader(stream)); - - String line; - while ((line = br.readLine()) != null) - parseLine(line); - - br.close(); - } - - /** - * Opens a configuration file given by configPath - * and parses all of its key-value pairs, adding - * them to the key-value map. - * - * @param configPath Path to the configuration file to parse. - */ - public void open(String configPath) throws IOException - { - clear(); - append(new FileInputStream(configPath)); - } - - private void parseLine(String line) - { - String[] tokens = line.split("=", 2); - if (tokens.length < 2) - return; - - for (int i = 0; i < tokens.length; i++) - tokens[i] = tokens[i].trim(); - - String key = tokens[0]; - String value = tokens[1]; - - if (value.startsWith("\"")) - value = value.substring(1, value.lastIndexOf('\"')); - else - value = value.split(" ")[0]; - - if (value.length() > 0) - map.put(key, value); - } - - /** - * Clears the key-value map of all currently set keys and values. - */ - public void clear() - { - map.clear(); - } - - /** - * Writes the currently set key-value pairs to - * - * @param path The path to save the - * - * @throws IOException - */ - public void write(String path) throws IOException - { - PrintWriter writer = new PrintWriter(path); - - for (Map.Entry entry : map.entrySet()) - { - writer.println(entry.getKey() + " = \"" + entry.getValue() + "\""); - } - - writer.close(); - } - - /** - * Checks if a key exists in the {@link HashMap} - * backing this ConfigFile instance. - * - * @param key The key to check for. - * - * @return true if the key exists in the HashMap backing - * this ConfigFile; false if it doesn't. - */ - public boolean keyExists(String key) - { - return map.containsKey(key); - } - - /** - * Sets a key to the given String value. - * - * @param key The key to set the String value to. - * @param value The String value to set to the key. - */ - public void setString(String key, String value) - { - map.put(key, value); - } - - /** - * Sets a key to the given boolean value. - * - * @param key The key to set the boolean value to. - * @param value The boolean value to set to the key. - */ - public void setBoolean(String key, boolean value) - { - map.put(key, Boolean.toString(value)); - } - - /** - * Sets a key to the given Integer value. - * - * @param key The key to set the Integer value to. - * @param value The Integer value to set to the key. - */ - public void setInt(String key, int value) - { - map.put(key, Integer.toString(value)); - } - - /** - * Sets a key to the given double value. - * - * @param key The key to set the double value to. - * @param value The double value to set to the key. - */ - public void setDouble(String key, double value) - { - map.put(key, Double.toString(value)); - } - - /** - * Sets a key to the given float value. - * - * @param key The key to set the float value to. - * @param value The float value to set to the key. - */ - public void setFloat(String key, float value) - { - map.put(key, Float.toString(value)); - } - - /** - * Gets the String value associated with the given key. - * - * @param key The key to get the String value from. - * - * @return the String object associated with the given key. - */ - public String getString(String key) - { - String ret = map.get(key); - - if (ret != null) - return ret; - else - return null; - } - - /** - * Gets the Integer value associated with the given key. - * - * @param key The key to get the Integer value from. - * - * @return the Integer value associated with the given key. - */ - public int getInt(String key) - { - String str = getString(key); - - if (str != null) - return Integer.parseInt(str); - else - throw new IllegalArgumentException("Config key '" + key + "' is invalid."); - } - - /** - * Gets the double value associated with the given key. - * - * @param key The key to get the double value from. - * - * @return the double value associated with the given key. - */ - public double getDouble(String key) - { - String str = getString(key); - - if (str != null) - return Double.parseDouble(str); - else - throw new IllegalArgumentException("Config key '" + key + "' is invalid."); - } - - /** - * Gets the float value associated with the given key. - * - * @param key The key to get the float value from. - * - * @return the float value associated with the given key. - */ - public float getFloat(String key) - { - String str = getString(key); - - if (str != null) - return Float.parseFloat(str); - else - throw new IllegalArgumentException("Config key '" + key + "' is invalid."); - } - - /** - * Gets the boolean value associated with the given key. - * - * @param key The key to get the boolean value from. - * - * @return the boolean value associated with the given key. - */ - public boolean getBoolean(String key) - { - String str = getString(key); - - if (str != null) - return Boolean.parseBoolean(str); - else - throw new IllegalArgumentException("Config key '" + key + "' is invalid."); - } -} diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/preferences/util/UserPreferences.java b/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/preferences/util/UserPreferences.java deleted file mode 100644 index 2e1ec9ed61..0000000000 --- a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/preferences/util/UserPreferences.java +++ /dev/null @@ -1,300 +0,0 @@ -package com.retroarch.browser.preferences.util; - -import java.io.File; -import java.io.IOException; - -import android.annotation.TargetApi; -import android.content.Context; -import android.content.SharedPreferences; -import android.media.AudioManager; -import android.media.AudioTrack; -import android.os.Build; -import android.preference.PreferenceManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.util.Log; - -/** - * Utility class for retrieving, saving, or loading preferences. - */ -public final class UserPreferences -{ - // Logging tag. - private static final String TAG = "UserPreferences"; - - // Disallow explicit instantiation. - private UserPreferences() - { - } - - /** - * Retrieves the path to the default location of the libretro config. - * - * @param ctx the current {@link Context} - * - * @return the path to the default location of the libretro config. - */ - public static String getDefaultConfigPath(Context ctx) - { - // Internal/External storage dirs. - final String internal = ctx.getFilesDir().getAbsolutePath(); - String external = null; - - // Get the App's external storage folder - final String state = android.os.Environment.getExternalStorageState(); - if (android.os.Environment.MEDIA_MOUNTED.equals(state)) { - File extsd = ctx.getExternalFilesDir(null); - external = extsd.getAbsolutePath(); - } - - // Native library directory and data directory for this front-end. - final String dataDir = ctx.getApplicationInfo().dataDir; - final String coreDir = dataDir + "/cores/"; - - // Get libretro name and path - final SharedPreferences prefs = getPreferences(ctx); - final String libretro_path = prefs.getString("libretro_path", coreDir); - - // Check if global config is being used. Return true upon failure. - final boolean globalConfigEnabled = prefs.getBoolean("global_config_enable", true); - - String append_path; - // If we aren't using the global config. - if (!globalConfigEnabled && !libretro_path.equals(coreDir)) - { - String sanitized_name = sanitizeLibretroPath(libretro_path); - append_path = File.separator + sanitized_name + ".cfg"; - } - else // Using global config. - { - append_path = File.separator + "retroarch.cfg"; - } - - if (external != null) - { - String confPath = external + append_path; - if (new File(confPath).exists()) - return confPath; - } - else if (internal != null) - { - String confPath = internal + append_path; - if (new File(confPath).exists()) - return confPath; - } - else - { - String confPath = "/mnt/extsd" + append_path; - if (new File(confPath).exists()) - return confPath; - } - - // Config file does not exist. Create empty one. - - // emergency fallback - String new_path = "/mnt/sd" + append_path; - - if (external != null) - new_path = external + append_path; - else if (internal != null) - new_path = internal + append_path; - else if (dataDir != null) - new_path = dataDir + append_path; - - try { - new File(new_path).createNewFile(); - } - catch (IOException e) - { - Log.e(TAG, "Failed to create config file to: " + new_path); - } - return new_path; - } - - /** - * Updates the libretro configuration file - * with new values if settings have changed. - * - * @param ctx the current {@link Context}. - */ - public static void updateConfigFile(Context ctx) - { - String path = getDefaultConfigPath(ctx); - ConfigFile config = new ConfigFile(path); - - Log.i(TAG, "Writing config to: " + path); - - final String dataDir = ctx.getApplicationInfo().dataDir; - final String coreDir = dataDir + "/cores/"; - - final SharedPreferences prefs = getPreferences(ctx); - - config.setString("libretro_directory", coreDir); - config.setInt("audio_out_rate", getOptimalSamplingRate(ctx)); - - try - { - int version = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(), 0).versionCode; - final String dst_path = dataDir; - final String dst_path_subdir = "assets"; - - Log.i(TAG, "dst dir is: " + dst_path); - Log.i(TAG, "dst subdir is: " + dst_path_subdir); - - config.setBoolean("log_verbosity", true); - config.setString("bundle_assets_src_path", ctx.getApplicationInfo().sourceDir); - config.setString("bundle_assets_dst_path", dst_path); - config.setString("bundle_assets_dst_path_subdir", dst_path_subdir); - config.setInt("bundle_assets_extract_version_current", version); - } - catch (NameNotFoundException ignored) - { - } - - // Refactor this entire mess and make this usable for per-core config - if (Build.VERSION.SDK_INT >= 17 && prefs.getBoolean("audio_latency_auto", true)) - { - config.setInt("audio_block_frames", getLowLatencyBufferSize(ctx)); - } - - try - { - config.write(path); - } - catch (IOException e) - { - Log.e(TAG, "Failed to save config file to: " + path); - } - } - - private static void readbackString(ConfigFile cfg, SharedPreferences.Editor edit, String key) - { - if (cfg.keyExists(key)) - edit.putString(key, cfg.getString(key)); - else - edit.remove(key); - } - - private static void readbackBool(ConfigFile cfg, SharedPreferences.Editor edit, String key) - { - if (cfg.keyExists(key)) - edit.putBoolean(key, cfg.getBoolean(key)); - else - edit.remove(key); - } - - private static void readbackDouble(ConfigFile cfg, SharedPreferences.Editor edit, String key) - { - if (cfg.keyExists(key)) - edit.putFloat(key, (float)cfg.getDouble(key)); - else - edit.remove(key); - } - - /* - private static void readbackFloat(ConfigFile cfg, SharedPreferences.Editor edit, String key) - { - if (cfg.keyExists(key)) - edit.putFloat(key, cfg.getFloat(key)); - else - edit.remove(key); - } - */ - - /** - private static void readbackInt(ConfigFile cfg, SharedPreferences.Editor edit, String key) - { - if (cfg.keyExists(key)) - edit.putInt(key, cfg.getInt(key)); - else - edit.remove(key); - } - */ - - /** - * Sanitizes a libretro core path. - * - * @param path The path to the libretro core. - * - * @return the sanitized libretro path. - */ - private static String sanitizeLibretroPath(String path) - { - String sanitized_name = path.substring( - path.lastIndexOf('/') + 1, - path.lastIndexOf('.')); - sanitized_name = sanitized_name.replace("neon", ""); - sanitized_name = sanitized_name.replace("libretro_", ""); - - return sanitized_name; - } - - /** - * Gets a {@link SharedPreferences} instance containing current settings. - * - * @param ctx the current {@link Context}. - * - * @return A SharedPreference instance containing current settings. - */ - public static SharedPreferences getPreferences(Context ctx) - { - return PreferenceManager.getDefaultSharedPreferences(ctx); - } - - /** - * Gets the optimal sampling rate for low-latency audio playback. - * - * @param ctx the current {@link Context}. - * - * @return the optimal sampling rate for low-latency audio playback in Hz. - */ - @TargetApi(17) - private static int getLowLatencyOptimalSamplingRate(Context ctx) - { - AudioManager manager = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE); - - return Integer.parseInt(manager - .getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE)); - } - - /** - * Gets the optimal buffer size for low-latency audio playback. - * - * @param ctx the current {@link Context}. - * - * @return the optimal output buffer size in decimal PCM frames. - */ - @TargetApi(17) - private static int getLowLatencyBufferSize(Context ctx) - { - AudioManager manager = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE); - int buffersize = Integer.parseInt(manager - .getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER)); - Log.i(TAG, "Queried ideal buffer size (frames): " + buffersize); - return buffersize; - } - - /** - * Gets the optimal audio sampling rate. - *

- * On Android 4.2+ devices this will retrieve the optimal low-latency sampling rate, - * since Android 4.2 adds support for low latency audio in general. - *

- * On other devices, it simply returns the regular optimal sampling rate - * as returned by the hardware. - * - * @param ctx The current {@link Context}. - * - * @return the optimal audio sampling rate in Hz. - */ - private static int getOptimalSamplingRate(Context ctx) - { - int ret; - if (Build.VERSION.SDK_INT >= 17) - ret = getLowLatencyOptimalSamplingRate(ctx); - else - ret = AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_MUSIC); - - Log.i(TAG, "Using sampling rate: " + ret + " Hz"); - return ret; - } -} diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityCamera.java b/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityCamera.java deleted file mode 100644 index d51d7f768f..0000000000 --- a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityCamera.java +++ /dev/null @@ -1,225 +0,0 @@ -package com.retroarch.browser.retroactivity; - -import java.io.IOException; - -import com.retroarch.browser.preferences.util.UserPreferences; - -import android.annotation.SuppressLint; -import android.content.SharedPreferences; -import android.graphics.SurfaceTexture; -import android.graphics.SurfaceTexture.OnFrameAvailableListener; -import android.hardware.Camera; -import android.os.Build; -import android.os.Bundle; -import android.util.Log; - -//For Android 3.0 and up - -/** - * Class which provides {@link Camera} functionality - * to {@link RetroActivityFuture}. - */ -@SuppressLint("NewApi") -public class RetroActivityCamera extends RetroActivityCommon -{ - private Camera mCamera = null; - private long lastTimestamp = 0; - private SurfaceTexture texture; - private boolean updateSurface = true; - private boolean camera_service_running = false; - - /** - * Executed when the {@link Camera} - * is staring to capture. - */ - public void onCameraStart() - { - if (camera_service_running) - return; - - if (mCamera != null) - mCamera.startPreview(); - camera_service_running = true; - } - - /** - * Executed when the {@link Camera} is done capturing. - *

- * Note that this does not release the currently held - * {@link Camera} instance and must be freed by calling - * {@link #onCameraFree} - */ - public void onCameraStop() - { - if (!camera_service_running) - return; - - if (mCamera != null) - mCamera.stopPreview(); - camera_service_running = false; - } - - /** - * Releases the currently held {@link Camera} instance. - */ - public void onCameraFree() - { - onCameraStop(); - - if (mCamera != null) - mCamera.release(); - } - - /** - * Initializes the camera for use. - */ - public void onCameraInit() - { - if (mCamera != null) - return; - - mCamera = Camera.open(); - } - - /** - * Polls the camera for updates to the {@link SurfaceTexture}. - * - * @return true if polling was successful, false otherwise. - */ - public boolean onCameraPoll() - { - if (!camera_service_running) - return false; - - if (texture == null) - { - Log.i("RetroActivity", "No texture"); - return true; - } - else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) - { - if (updateSurface) - { - texture.updateTexImage(); - } - - long newTimestamp = texture.getTimestamp(); - - if (newTimestamp != lastTimestamp) - { - lastTimestamp = newTimestamp; - return true; - } - - return false; - } - - return true; - } - - /** - * Initializes the {@link SurfaceTexture} used by the - * {@link Camera} with a given OpenGL texure ID. - * - * @param gl_texid texture ID to initialize the - * {@link SurfaceTexture} with. - */ - public void onCameraTextureInit(int gl_texid) - { - texture = new SurfaceTexture(gl_texid); - texture.setOnFrameAvailableListener(onCameraFrameAvailableListener); - } - - /** - * Sets the {@link Camera} texture with the texture represented - * by the given OpenGL texture ID. - * - * @param gl_texid The texture ID representing the texture to set the camera to. - * @throws IOException If setting the texture fails. - */ - public void onCameraSetTexture(int gl_texid) throws IOException - { - if (texture == null) - onCameraTextureInit(gl_texid); - - if (mCamera != null) - mCamera.setPreviewTexture(texture); - } - - private final OnFrameAvailableListener onCameraFrameAvailableListener = new OnFrameAvailableListener() - { - @Override - public void onFrameAvailable(SurfaceTexture surfaceTexture) - { - updateSurface = true; - } - }; - - @Override - public void onCreate(Bundle savedInstanceState) - { - // Save the current setting for updates - SharedPreferences prefs = UserPreferences.getPreferences(this); - SharedPreferences.Editor edit = prefs.edit(); - edit.putBoolean("CAMERA_UPDATES_ON", false); - edit.apply(); - - camera_service_running = false; - - super.onCreate(savedInstanceState); - } - - @Override - public void onPause() - { - // Save the current setting for updates - SharedPreferences prefs = UserPreferences.getPreferences(this); - SharedPreferences.Editor edit = prefs.edit(); - edit.putBoolean("CAMERA_UPDATES_ON", camera_service_running); - edit.apply(); - - onCameraStop(); - super.onPause(); - } - - @Override - public void onResume() - { - SharedPreferences prefs = UserPreferences.getPreferences(this); - SharedPreferences.Editor edit = prefs.edit(); - - /* - * Get any previous setting for camera updates - * Gets "false" if an error occurs - */ - if (prefs.contains("CAMERA_UPDATES_ON")) - { - camera_service_running = prefs.getBoolean("CAMERA_UPDATES_ON", false); - if (camera_service_running) - { - onCameraStart(); - } - } - else // Otherwise, turn off camera updates - { - edit.putBoolean("CAMERA_UPDATES_ON", false); - edit.apply(); - camera_service_running = false; - } - super.onResume(); - } - - @Override - public void onDestroy() - { - onCameraFree(); - super.onDestroy(); - } - - @Override - public void onStop() - { - onCameraStop(); - super.onStop(); - } -} diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityCommon.java b/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityCommon.java deleted file mode 100644 index e660dd2eb9..0000000000 --- a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityCommon.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.retroarch.browser.retroactivity; - -import com.retroarch.browser.preferences.util.UserPreferences; -import android.annotation.TargetApi; -import android.content.res.Configuration; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.app.UiModeManager; -import android.os.BatteryManager; -import android.os.Build; -import android.os.PowerManager; -import android.util.Log; - -import java.util.concurrent.CountDownLatch; - -/** - * Class which provides common methods for RetroActivity related classes. - */ -public class RetroActivityCommon extends RetroActivityLocation -{ - public static int FRONTEND_POWERSTATE_NONE = 0; - public static int FRONTEND_POWERSTATE_NO_SOURCE = 1; - public static int FRONTEND_POWERSTATE_CHARGING = 2; - public static int FRONTEND_POWERSTATE_CHARGED = 3; - public static int FRONTEND_POWERSTATE_ON_POWER_SOURCE = 4; - public boolean sustainedPerformanceMode = true; - - // Exiting cleanly from NDK seems to be nearly impossible. - // Have to use exit(0) to avoid weird things happening, even with runOnUiThread() approaches. - // Use a separate JNI function to explicitly trigger the readback. - public void onRetroArchExit() - { - finish(); - } - - @TargetApi(24) - public void setSustainedPerformanceMode(boolean on) - { - sustainedPerformanceMode = on; - - if (Build.VERSION.SDK_INT >= 24) { - if (isSustainedPerformanceModeSupported()) { - final CountDownLatch latch = new CountDownLatch(1); - - runOnUiThread(new Runnable() { - @Override - public void run() { - Log.i("RetroActivity", "setting sustained performance mode to " + sustainedPerformanceMode); - - getWindow().setSustainedPerformanceMode(sustainedPerformanceMode); - - latch.countDown(); - } - }); - - try { - latch.await(); - }catch(InterruptedException e) { - e.printStackTrace(); - } - } - } - } - - @TargetApi(24) - public boolean isSustainedPerformanceModeSupported() - { - boolean supported = false; - - if (Build.VERSION.SDK_INT >= 24) - { - PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE); - - if (powerManager.isSustainedPerformanceModeSupported()) - supported = true; - } - - - Log.i("RetroActivity", "isSustainedPerformanceModeSupported? " + supported); - - return supported; - } - - public int getBatteryLevel() - { - IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); - // This doesn't actually register anything (or need to) because we know this particular intent is sticky and we do not specify a BroadcastReceiver anyway - Intent batteryStatus = registerReceiver(null, ifilter); - int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); - int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, 100); - - float percent = ((float)level / (float)scale) * 100.0f; - - Log.i("RetroActivity", "battery: level = " + level + ", scale = " + scale + ", percent = " + percent); - - return (int)percent; - } - - public int getPowerstate() - { - IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); - // This doesn't actually register anything (or need to) because we know this particular intent is sticky and we do not specify a BroadcastReceiver anyway - Intent batteryStatus = registerReceiver(null, ifilter); - int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); - boolean hasBattery = batteryStatus.getBooleanExtra(BatteryManager.EXTRA_PRESENT, false); - boolean isCharging = (status == BatteryManager.BATTERY_STATUS_CHARGING); - boolean isCharged = (status == BatteryManager.BATTERY_STATUS_FULL); - int powerstate = FRONTEND_POWERSTATE_NONE; - - if (isCharged) - powerstate = FRONTEND_POWERSTATE_CHARGED; - else if (isCharging) - powerstate = FRONTEND_POWERSTATE_CHARGING; - else if (!hasBattery) - powerstate = FRONTEND_POWERSTATE_NO_SOURCE; - else - powerstate = FRONTEND_POWERSTATE_ON_POWER_SOURCE; - - Log.i("RetroActivity", "power state = " + powerstate); - - return powerstate; - } - - public boolean isAndroidTV() - { - Configuration config = getResources().getConfiguration(); - UiModeManager uiModeManager = (UiModeManager)getSystemService(UI_MODE_SERVICE); - - if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) - { - Log.i("RetroActivity", "isAndroidTV == true"); - return true; - } - else - { - Log.i("RetroActivity", "isAndroidTV == false"); - return false; - } - } -} diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityFuture.java b/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityFuture.java deleted file mode 100644 index eba29872a6..0000000000 --- a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityFuture.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.retroarch.browser.retroactivity; - -import android.view.View; -import android.view.WindowManager; -import android.content.Intent; -import android.content.Context; -import android.hardware.input.InputManager; -import android.os.Build; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -public final class RetroActivityFuture extends RetroActivityCamera { - - // If set to true then Retroarch will completely exit when it loses focus - private boolean quitfocus = false; - - @Override - public void onResume() { - super.onResume(); - - setSustainedPerformanceMode(sustainedPerformanceMode); - - if (Build.VERSION.SDK_INT >= 19) { - // Immersive mode - - // Constants from API > 14 - final int API_SYSTEM_UI_FLAG_LAYOUT_STABLE = 0x00000100; - final int API_SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 0x00000200; - final int API_SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN = 0x00000400; - final int API_SYSTEM_UI_FLAG_FULLSCREEN = 0x00000004; - final int API_SYSTEM_UI_FLAG_IMMERSIVE_STICKY = 0x00001000; - - View thisView = getWindow().getDecorView(); - thisView.setSystemUiVisibility(API_SYSTEM_UI_FLAG_LAYOUT_STABLE - | API_SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - | API_SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - | API_SYSTEM_UI_FLAG_FULLSCREEN - | API_SYSTEM_UI_FLAG_IMMERSIVE_STICKY); - - // Check for Android UI specific parameters - Intent retro = getIntent(); - String refresh = retro.getStringExtra("REFRESH"); - - // If REFRESH parameter is provided then try to set refreshrate accordingly - if(refresh != null) { - WindowManager.LayoutParams params = getWindow().getAttributes(); - params.preferredRefreshRate = Integer.parseInt(refresh); - getWindow().setAttributes(params); - } - - // If QUITFOCUS parameter is provided then enable that Retroarch quits when focus is lost - quitfocus = retro.hasExtra("QUITFOCUS"); - - // If HIDEMOUSE parameters is provided then hide the mourse cursor - // This requires NVIDIA Android extensions (available on NVIDIA Shield), if they are not - // available then nothing will be done - if (retro.hasExtra("HIDEMOUSE")) hideMouseCursor(); - } - } - - public void hideMouseCursor() { - - // Check for NVIDIA extensions and minimum SDK version - Method mInputManager_setCursorVisibility; - try { mInputManager_setCursorVisibility = - InputManager.class.getMethod("setCursorVisibility", boolean.class); - } - catch (NoSuchMethodException ex) { - return; // Extensions were not available so do nothing - } - - // Hide the mouse cursor - InputManager inputManager = (InputManager) getSystemService(Context.INPUT_SERVICE); - try { mInputManager_setCursorVisibility.invoke(inputManager, false); } - catch (InvocationTargetException ite) { } - catch (IllegalAccessException iae) { } - } - - @Override - public void onStop() { - super.onStop(); - - // If QUITFOCUS parameter was set then completely exit Retroarch when focus is lost - if (quitfocus) System.exit(0); - } -} diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityIntent.java b/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityIntent.java deleted file mode 100644 index 91ccc3f8a6..0000000000 --- a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityIntent.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.retroarch.browser.retroactivity; - -import com.retroarch.browser.mainmenu.MainMenuActivity; - -import android.content.Intent; -import android.util.Log; - -public class RetroActivityIntent extends RetroActivityCommon { - private Intent pendingIntent = null; - private static final String TAG = "RetroArch"; - - @Override - public void onBackPressed() - { - Log.i("RetroActivity", "onBackKeyPressed"); - Intent retro = new Intent(this, MainMenuActivity.class); - retro.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); - startActivity(retro); - } - - @Override - public void onNewIntent(Intent intent) - { - Log.i("RetroActivity", "onNewIntent invoked."); - super.onNewIntent(intent); - setIntent(intent); - pendingIntent = intent; - } - - /** - * Gets the ROM file specified in the pending intent. - * - * @return the ROM file specified in the pending intent. - */ - public String getPendingIntentFullPath() - { - return pendingIntent.getStringExtra("ROM"); - } - - /** - * Gets the specified path to the libretro core in the pending intent. - * - * @return the specified path to the libretro core in the pending intent. - */ - public String getPendingIntentLibretroPath() - { - return pendingIntent.getStringExtra("LIBRETRO"); - } - - /** - * Gets the path specified in the pending intent to the retroarch cfg file. - * - * @return the path specified in the pending intent to the retroarch cfg file. - */ - public String getPendingIntentConfigPath() - { - return pendingIntent.getStringExtra("CONFIGFILE"); - } - - public String getPendingIntentStorageLocation() - { - return pendingIntent.getStringExtra("SDCARD"); - } - - public String getPendingIntentDownloadLocation() - { - return pendingIntent.getStringExtra("DOWNLOADS"); - } - - public String getPendingIntentScreenshotsLocation() - { - return pendingIntent.getStringExtra("SCREENSHOTS"); - } - - /** - * Gets the specified IME in the pending intent. - * - * @return the specified IME in the pending intent. - */ - public String getPendingIntentIME() - { - return pendingIntent.getStringExtra("IME"); - } - - /** - * Checks whether or not a pending intent exists. - * - * @return true if a pending intent exists, false otherwise. - */ - public boolean hasPendingIntent() - { - if (pendingIntent == null) - return false; - - return true; - } - - /** - * Clears the current pending intent. - */ - public void clearPendingIntent() - { - pendingIntent = null; - } -} diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityLocation.java b/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityLocation.java deleted file mode 100644 index 9fedbf2e7b..0000000000 --- a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityLocation.java +++ /dev/null @@ -1,316 +0,0 @@ -package com.retroarch.browser.retroactivity; - -import com.google.android.gms.common.ConnectionResult; -import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks; -import com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener; -import com.google.android.gms.location.LocationClient; -import com.google.android.gms.location.LocationListener; -import com.google.android.gms.location.LocationRequest; -import com.retroarch.browser.preferences.util.UserPreferences; - -import android.app.NativeActivity; -import android.content.IntentSender; -import android.content.SharedPreferences; -import android.location.Location; -import android.os.Bundle; -import android.util.Log; -import android.widget.Toast; - -/** - * Class that implements location-based functionality for - * the {@link RetroActivityFuture} and {@link RetroActivityPast} - * activities. - */ -public class RetroActivityLocation extends NativeActivity -implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener -{ - /* LOCATION VARIABLES */ - private static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 0; - private LocationClient mLocationClient = null; - private Location mCurrentLocation; - - // Define an object that holds accuracy and frequency parameters - LocationRequest mLocationRequest = null; - boolean mUpdatesRequested = false; - boolean locationChanged = false; - boolean location_service_running = false; - - /** - * Called by Location Services when the request to connect the - * client finishes successfully. At this point, you can - * request the current location or start periodic updates - */ - @Override - public void onConnected(Bundle dataBundle) - { - if (mLocationClient == null) - return; - - // Display the connection status - Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show(); - location_service_running = true; - - // If already requested, start periodic updates - if (mUpdatesRequested) - { - mLocationClient.requestLocationUpdates(mLocationRequest, this, null); - } - else - { - // Get last known location - mCurrentLocation = mLocationClient.getLastLocation(); - locationChanged = true; - } - } - - /** - * Called by Location Services if the connection to the - * location client drops because of an error. - */ - @Override - public void onDisconnected() - { - if (mLocationClient == null) - return; - - // Display the connection status - Toast.makeText(this, "Disconnected. Please re-connect.", Toast.LENGTH_SHORT).show(); - - // If the client is connected - if (mLocationClient.isConnected()) - { - /* - * Remove location updates for a listener. - * The current Activity is the listener, so - * the argument is "this". - */ - mLocationClient.removeLocationUpdates(this); - } - - location_service_running = false; - } - - /** - * Called by Location Services if the attempt to - * Location Services fails. - */ - @Override - public void onConnectionFailed(ConnectionResult connectionResult) - { - /* - * Google Play services can resolve some errors it detects. - * If the error has a resolution, try sending an Intent to - * start a Google Play services activity that can resolve - * error. - */ - if (connectionResult.hasResolution()) - { - try - { - // Start an Activity that tries to resolve the error - connectionResult.startResolutionForResult(this, CONNECTION_FAILURE_RESOLUTION_REQUEST); - } - catch (IntentSender.SendIntentException e) - { - // Thrown if Google Play services cancelled the original PendingIntent - e.printStackTrace(); - } - } - else - { - /* - * If no resolution is available, display a dialog to the - * user with the error. - */ - Log.e("Connection failed", "error code: " + connectionResult.getErrorCode()); - } - } - - /** - * Sets the update interval at which location-based updates - * should occur - */ - public void onLocationSetInterval(int update_interval_in_ms, int distance_interval) - { - // Use high accuracy - if (mLocationRequest == null) - return; - - mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); - - if (update_interval_in_ms == 0) - mLocationRequest.setInterval(5 * 1000); // 5 seconds - else - mLocationRequest.setInterval(update_interval_in_ms); - - // Set the fastest update interval to 1 second - mLocationRequest.setFastestInterval(1000); - } - - /** - * Initializing methods for location based functionality. - */ - public void onLocationInit() - { - /* - * Create a new location client, using the enclosing class to - * handle callbacks. - */ - if (mLocationClient == null) - mLocationClient = new LocationClient(this, this, this); - - // Start with updates turned off - mUpdatesRequested = false; - - // Create the LocationRequest object - if (mLocationRequest == null) - mLocationRequest = LocationRequest.create(); - - onLocationSetInterval(0, 0); - } - - - /** - * Executed upon starting the {@link LocationClient}. - */ - public void onLocationStart() - { - if (mLocationClient == null) - return; - - mUpdatesRequested = true; - - // Connect the client. - mLocationClient.connect(); - } - - /** - * Free up location services resources. - */ - public void onLocationFree() - { - /* TODO/FIXME */ - } - - /** - * Executed upon stopping the location client. - * Does nothing if called when the client is not started. - */ - public void onLocationStop() - { - // Disconnecting the client invalidates it. - if (mLocationClient != null && mUpdatesRequested) - mLocationClient.disconnect(); - } - - /** - * Gets the latitude at the current location in degrees. - * - * @return the latitude at the current location. - */ - public double onLocationGetLatitude() - { - return mCurrentLocation.getLatitude(); - } - - /** - * Gets the longitude at the current location in degrees. - * - * @return the longitude at the current location. - */ - public double onLocationGetLongitude() - { - return mCurrentLocation.getLongitude(); - } - - /** - * Gets the horizontal accuracy of the current location - * in meters. (NOTE: There seems to be no vertical accuracy - * for a given location with the Android location API) - * - * @return the horizontal accuracy of the current position. - */ - public double onLocationGetHorizontalAccuracy() - { - return mCurrentLocation.getAccuracy(); - } - - /** - * Tells us whether the location listener callback has - * updated the current location since the last time - * we polled. - * - * @return true if location has changed, false if location has not changed. - */ - public boolean onLocationHasChanged() - { - boolean hasChanged = locationChanged; - - // Reset flag - if (hasChanged) - locationChanged = false; - - return hasChanged; - } - - // Define the callback method that receives location updates - @Override - public void onLocationChanged(Location location) - { - if (!location_service_running) - return; - - locationChanged = true; - mCurrentLocation = location; - - // Report to the UI that the location was updated - String msg = "Updated Location: " + location.getLatitude() + ", " + location.getLongitude(); - Log.i("RetroArch GPS", msg); - //Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); - } - - @Override - public void onPause() - { - // Save the current setting for updates - SharedPreferences prefs = UserPreferences.getPreferences(this); - SharedPreferences.Editor edit = prefs.edit(); - edit.putBoolean("LOCATION_UPDATES_ON", mUpdatesRequested); - edit.apply(); - - super.onPause(); - } - - @Override - public void onResume() - { - SharedPreferences prefs = UserPreferences.getPreferences(this); - SharedPreferences.Editor edit = prefs.edit(); - - /* - * Get any previous setting for location updates - * Gets "false" if an error occurs - */ - if (prefs.contains("LOCATION_UPDATES_ON")) - { - mUpdatesRequested = prefs.getBoolean("LOCATION_UPDATES_ON", false); - if (mUpdatesRequested) - location_service_running = true; - } - else // Otherwise, turn off location updates - { - edit.putBoolean("LOCATION_UPDATES_ON", false); - edit.apply(); - location_service_running = false; - } - - super.onResume(); - } - - @Override - public void onStop() - { - onLocationStop(); - super.onStop(); - } -} diff --git a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityPast.java b/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityPast.java deleted file mode 100644 index 4c11369ee9..0000000000 --- a/pkg/msvc/msvc-2017-android/msvc-2017-android.Packaging/src/com/retroarch/browser/retroactivity/RetroActivityPast.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.retroarch.browser.retroactivity; - -// For Android 2.3.x - -public final class RetroActivityPast extends RetroActivityCommon -{ -}