SettingsActivity.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. package com.sdlpal.sdlpal;
  2. import android.app.Activity;
  3. import android.content.DialogInterface;
  4. import android.content.Intent;
  5. import android.net.Uri;
  6. import android.os.Bundle;
  7. import android.os.Environment;
  8. import android.support.v7.app.AppCompatActivity;
  9. import android.support.v7.widget.AppCompatSpinner;
  10. import android.support.v7.widget.SwitchCompat;
  11. import android.support.v7.widget.Toolbar;
  12. import android.support.v7.app.AlertDialog;
  13. import android.view.View;
  14. import android.widget.AdapterView;
  15. import android.widget.CompoundButton;
  16. import android.widget.EditText;
  17. import android.widget.SeekBar;
  18. import android.widget.Spinner;
  19. import com.nononsenseapps.filepicker.*;
  20. import java.io.File;
  21. import java.util.List;
  22. public class SettingsActivity extends AppCompatActivity {
  23. public static native boolean loadConfigFile();
  24. public static native boolean saveConfigFile();
  25. public static native boolean getConfigBoolean(String item, boolean defval);
  26. public static native int getConfigInt(String item, boolean defval);
  27. public static native String getConfigString(String item, boolean defval);
  28. public static native boolean setConfigBoolean(String item, boolean value);
  29. public static native boolean setConfigInt(String item, int value);
  30. public static native boolean setConfigString(String item, String value);
  31. public static native boolean checkDataFiles(String path);
  32. public static native String getGitRevision();
  33. private static final String KeepAspectRatio = "KeepAspectRatio";
  34. private static final String LaunchSetting = "LaunchSetting";
  35. private static final String Stereo = "Stereo";
  36. private static final String UseSurroundOPL = "UseSurroundOPL";
  37. private static final String UseTouchOverlay = "UseTouchOverlay";
  38. private static final String EnableAviPlay = "EnableAviPlay";
  39. private static final String AudioBufferSize = "AudioBufferSize";
  40. private static final String LogLevel = "LogLevel";
  41. private static final String OPLSampleRate = "OPLSampleRate";
  42. private static final String ResampleQuality = "ResampleQuality";
  43. private static final String SampleRate = "SampleRate";
  44. private static final String MusicVolume = "MusicVolume";
  45. private static final String SoundVolume = "SoundVolume";
  46. private static final String CDFormat = "CD";
  47. private static final String GamePath = "GamePath";
  48. private static final String SavePath = "SavePath";
  49. private static final String MessageFileName = "MessageFileName";
  50. private static final String LogFileName = "LogFileName";
  51. private static final String FontFileName = "FontFileName";
  52. private static final String MusicFormat = "Music";
  53. private static final String OPLFormat = "OPL";
  54. private static final int AudioSampleRates[] = { 11025, 22050, 44100 };
  55. private static final int AudioBufferSizes[] = { 512, 1024, 2048, 4096, 8192 };
  56. private static final int OPLSampleRates[] = { 11025, 12429, 22050, 24858, 44100, 49716 };
  57. private static final String CDFormats[] = { "MP3", "OGG" };
  58. private static final String MusicFormats[] = { "MIDI", "RIX", "MP3", "OGG" };
  59. private static final String OPLFormats[] = { "DOSBOX", "MAME", "DOSBOXNEW" };
  60. private SettingsActivity mInstance = this;
  61. private static final int BROWSE_GAMEDIR_CODE = 30001;
  62. private static final int BROWSE_MSGFILE_CODE = 30002;
  63. private static final int BROWSE_FONTFILE_CODE = 30003;
  64. @Override
  65. protected void onCreate(Bundle savedInstanceState) {
  66. super.onCreate(savedInstanceState);
  67. setContentView(R.layout.activity_settings);
  68. Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  69. setSupportActionBar(toolbar);
  70. toolbar.setSubtitle(getResources().getString(R.string.title_settings) + " (" + getGitRevision() + ")");
  71. ((SwitchCompat)findViewById(R.id.swMsgFile)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
  72. @Override
  73. public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
  74. findViewById(R.id.edMsgFile).setVisibility(isChecked ? View.VISIBLE : View.GONE);
  75. findViewById(R.id.btnBrowseMsgFile).setVisibility(isChecked ? View.VISIBLE : View.GONE);
  76. }
  77. });
  78. ((SwitchCompat)findViewById(R.id.swFontFile)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
  79. @Override
  80. public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
  81. findViewById(R.id.edFontFile).setVisibility(isChecked ? View.VISIBLE : View.GONE);
  82. findViewById(R.id.btnBrowseFontFile).setVisibility(isChecked ? View.VISIBLE : View.GONE);
  83. }
  84. });
  85. ((SwitchCompat)findViewById(R.id.swLogFile)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
  86. @Override
  87. public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
  88. findViewById(R.id.edLogFile).setVisibility(isChecked ? View.VISIBLE : View.GONE);
  89. }
  90. });
  91. ((AppCompatSpinner)findViewById(R.id.spMusFmt)).setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {
  92. @Override
  93. public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
  94. findViewById(R.id.layoutOPL).setVisibility(position == 1 ? View.VISIBLE : View.GONE);
  95. }
  96. @Override
  97. public void onNothingSelected(AdapterView<?> parent) {
  98. findViewById(R.id.layoutOPL).setVisibility(View.VISIBLE);
  99. }
  100. });
  101. findViewById(R.id.btnDefault).setOnClickListener(new View.OnClickListener() {
  102. @Override
  103. public void onClick(View v) {
  104. setDefaults();
  105. }
  106. });
  107. findViewById(R.id.btnReset).setOnClickListener(new View.OnClickListener() {
  108. @Override
  109. public void onClick(View view) {
  110. resetConfigs();
  111. }
  112. });
  113. findViewById(R.id.btnFinish).setOnClickListener(new View.OnClickListener() {
  114. @Override
  115. public void onClick(View v) {
  116. String gamePath = ((EditText)findViewById(R.id.edFolder)).getText().toString();
  117. if (!checkDataFiles(gamePath)) {
  118. AlertDialog.Builder builder = new AlertDialog.Builder(mInstance);
  119. builder.setMessage(getString(R.string.msg_data_not_found_header) + "\n" +
  120. gamePath + "\n\n" +
  121. getString(R.string.msg_data_not_found_footer));
  122. builder.setCancelable(true);
  123. builder.setPositiveButton(android.R.string.ok, null);
  124. builder.create().show();
  125. return;
  126. }
  127. if (!setConfigs()) return;
  128. setConfigBoolean(LaunchSetting, false);
  129. saveConfigFile();
  130. AlertDialog.Builder builder = new AlertDialog.Builder(mInstance);
  131. builder.setMessage(R.string.msg_exit);
  132. builder.setCancelable(false);
  133. builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
  134. @Override
  135. public void onClick(DialogInterface dialogInterface, int i) {
  136. Intent intent = new Intent(mInstance, PalActivity.class);
  137. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  138. startActivity(intent);
  139. finish();
  140. }
  141. });
  142. builder.create().show();
  143. }
  144. });
  145. findViewById(R.id.btnBrowseFolder).setOnClickListener(new View.OnClickListener() {
  146. @Override
  147. public void onClick(View v) {
  148. Intent i = new Intent(mInstance, FilePickerActivity.class);
  149. i.putExtra(FilePickerActivity.EXTRA_ALLOW_MULTIPLE, false);
  150. i.putExtra(FilePickerActivity.EXTRA_ALLOW_CREATE_DIR, true);
  151. i.putExtra(FilePickerActivity.EXTRA_MODE, FilePickerActivity.MODE_DIR);
  152. i.putExtra(FilePickerActivity.EXTRA_START_PATH, ((EditText)findViewById(R.id.edFolder)).getText());
  153. startActivityForResult(i, BROWSE_GAMEDIR_CODE);
  154. }
  155. });
  156. findViewById(R.id.btnBrowseMsgFile).setOnClickListener(new View.OnClickListener() {
  157. @Override
  158. public void onClick(View v) {
  159. Intent i = new Intent(mInstance, FilePickerActivity.class);
  160. i.putExtra(FilePickerActivity.EXTRA_ALLOW_MULTIPLE, false);
  161. i.putExtra(FilePickerActivity.EXTRA_ALLOW_CREATE_DIR, true);
  162. i.putExtra(FilePickerActivity.EXTRA_MODE, FilePickerActivity.MODE_FILE);
  163. i.putExtra(FilePickerActivity.EXTRA_START_PATH, ((EditText)findViewById(R.id.edFolder)).getText());
  164. startActivityForResult(i, BROWSE_MSGFILE_CODE);
  165. }
  166. });
  167. findViewById(R.id.btnBrowseFontFile).setOnClickListener(new View.OnClickListener() {
  168. @Override
  169. public void onClick(View v) {
  170. Intent i = new Intent(mInstance, FilePickerActivity.class);
  171. i.putExtra(FilePickerActivity.EXTRA_ALLOW_MULTIPLE, false);
  172. i.putExtra(FilePickerActivity.EXTRA_ALLOW_CREATE_DIR, true);
  173. i.putExtra(FilePickerActivity.EXTRA_MODE, FilePickerActivity.MODE_FILE);
  174. i.putExtra(FilePickerActivity.EXTRA_START_PATH, ((EditText)findViewById(R.id.edFolder)).getText());
  175. startActivityForResult(i, BROWSE_FONTFILE_CODE);
  176. }
  177. });
  178. resetConfigs();
  179. if (PalActivity.crashed) {
  180. AlertDialog.Builder builder = new AlertDialog.Builder(this);
  181. builder.setMessage(R.string.msg_crash);
  182. builder.setCancelable(false);
  183. builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
  184. @Override
  185. public void onClick(DialogInterface dialogInterface, int i) {
  186. dialogInterface.dismiss();
  187. }
  188. });
  189. builder.create().show();
  190. }
  191. }
  192. @Override
  193. protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
  194. if (resultCode == Activity.RESULT_OK) {
  195. String filePath = null;
  196. try {
  197. List<Uri> files = Utils.getSelectedFilesFromResult(intent);
  198. for (Uri uri : files) {
  199. File file = Utils.getFileForUri(uri);
  200. filePath = file.getAbsolutePath();
  201. break;
  202. }
  203. } catch (Exception ex) {
  204. ex.printStackTrace();
  205. }
  206. if (filePath != null) {
  207. if (requestCode == BROWSE_GAMEDIR_CODE) {
  208. ((EditText) findViewById(R.id.edFolder)).setText(filePath);
  209. } else if (requestCode == BROWSE_MSGFILE_CODE) {
  210. ((EditText) findViewById(R.id.edMsgFile)).setText(filePath);
  211. } else if (requestCode == BROWSE_FONTFILE_CODE) {
  212. ((EditText) findViewById(R.id.edFontFile)).setText(filePath);
  213. }
  214. }
  215. }
  216. }
  217. protected int findMatchedIntIndex(int value, int[] values, int defaultIndex) {
  218. for(int i = 0; i < values.length; i++) {
  219. if (values[i] == value)
  220. return i;
  221. }
  222. return defaultIndex;
  223. }
  224. protected int findMatchedStringIndex(String value, String[] values, int defaultIndex) {
  225. for(int i = 0; i < values.length; i++) {
  226. if (values[i].equals(value))
  227. return i;
  228. }
  229. return defaultIndex;
  230. }
  231. protected void setDefaults() {
  232. String sdcardState = Environment.getExternalStorageState();
  233. findViewById(R.id.edMsgFile).setVisibility(View.GONE);
  234. findViewById(R.id.btnBrowseMsgFile).setVisibility(View.GONE);
  235. findViewById(R.id.edFontFile).setVisibility(View.GONE);
  236. findViewById(R.id.btnBrowseFontFile).setVisibility(View.GONE);
  237. findViewById(R.id.edLogFile).setVisibility(View.GONE);
  238. findViewById(R.id.layoutOPL).setVisibility(View.VISIBLE);
  239. ((SeekBar)findViewById(R.id.sbMusVol)).setProgress(getConfigInt(MusicVolume, true));
  240. ((SeekBar)findViewById(R.id.sbSFXVol)).setProgress(getConfigInt(SoundVolume, true));
  241. ((SeekBar)findViewById(R.id.sbQuality)).setProgress(getConfigInt(ResampleQuality, true));
  242. if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
  243. ((EditText)findViewById(R.id.edFolder)).setText(Environment.getExternalStorageDirectory().getPath() + "/sdlpal/");
  244. } else {
  245. ((EditText)findViewById(R.id.edFolder)).setText("/sdcard/sdlpal/");
  246. }
  247. ((EditText)findViewById(R.id.edMsgFile)).setText("");
  248. ((EditText)findViewById(R.id.edFontFile)).setText("");
  249. ((EditText)findViewById(R.id.edLogFile)).setText("");
  250. ((SwitchCompat)findViewById(R.id.swMsgFile)).setChecked(false);
  251. ((SwitchCompat)findViewById(R.id.swFontFile)).setChecked(false);
  252. ((SwitchCompat)findViewById(R.id.swLogFile)).setChecked(false);
  253. ((SwitchCompat)findViewById(R.id.swAVI)).setChecked(getConfigBoolean(EnableAviPlay, true));
  254. ((SwitchCompat)findViewById(R.id.swTouch)).setChecked(getConfigBoolean(UseTouchOverlay, true));
  255. ((SwitchCompat)findViewById(R.id.swAspect)).setChecked(getConfigBoolean(KeepAspectRatio, true));
  256. ((SwitchCompat)findViewById(R.id.swSurround)).setChecked(getConfigBoolean(UseSurroundOPL, true));
  257. ((SwitchCompat)findViewById(R.id.swStereo)).setChecked(getConfigBoolean(Stereo, true));
  258. ((AppCompatSpinner)findViewById(R.id.spLogLevel)).setSelection(getConfigInt(LogLevel, true));
  259. ((AppCompatSpinner)findViewById(R.id.spSample)).setSelection(findMatchedIntIndex(getConfigInt(SampleRate, true), AudioSampleRates, 2)); // 44100Hz
  260. ((AppCompatSpinner)findViewById(R.id.spBuffer)).setSelection(findMatchedIntIndex(getConfigInt(AudioBufferSize, true), AudioBufferSizes, 1)); // 1024
  261. ((AppCompatSpinner)findViewById(R.id.spCDFmt)).setSelection(findMatchedStringIndex(getConfigString(CDFormat, true), CDFormats, 1)); // OGG
  262. ((AppCompatSpinner)findViewById(R.id.spMusFmt)).setSelection(findMatchedStringIndex(getConfigString(MusicFormat, true), MusicFormats, 1)); // RIX
  263. ((AppCompatSpinner)findViewById(R.id.spOPL)).setSelection(findMatchedStringIndex(getConfigString(OPLFormat, true), OPLFormats, 1)); // MAME
  264. ((AppCompatSpinner)findViewById(R.id.spOPLRate)).setSelection(findMatchedIntIndex(getConfigInt(OPLSampleRate, true), OPLSampleRates, 5)); // 49716Hz
  265. }
  266. protected void resetConfigs() {
  267. findViewById(R.id.edMsgFile).setVisibility(View.GONE);
  268. findViewById(R.id.btnBrowseMsgFile).setVisibility(View.GONE);
  269. findViewById(R.id.edFontFile).setVisibility(View.GONE);
  270. findViewById(R.id.btnBrowseFontFile).setVisibility(View.GONE);
  271. findViewById(R.id.edLogFile).setVisibility(View.GONE);
  272. findViewById(R.id.layoutOPL).setVisibility(View.VISIBLE);
  273. ((SeekBar)findViewById(R.id.sbMusVol)).setProgress(getConfigInt(MusicVolume, false));
  274. ((SeekBar)findViewById(R.id.sbSFXVol)).setProgress(getConfigInt(SoundVolume, false));
  275. ((SeekBar)findViewById(R.id.sbQuality)).setProgress(getConfigInt(ResampleQuality, false)); // Best quality
  276. String msgFile, fontFile, logFile;
  277. ((EditText)findViewById(R.id.edFolder)).setText(getConfigString(GamePath, false));
  278. ((EditText)findViewById(R.id.edMsgFile)).setText(msgFile = getConfigString(MessageFileName, false));
  279. ((EditText)findViewById(R.id.edFontFile)).setText(fontFile = getConfigString(FontFileName, false));
  280. ((EditText)findViewById(R.id.edLogFile)).setText(logFile = getConfigString(LogFileName, false));
  281. ((SwitchCompat)findViewById(R.id.swMsgFile)).setChecked(msgFile != null && !msgFile.isEmpty());
  282. ((SwitchCompat)findViewById(R.id.swFontFile)).setChecked(fontFile != null && !fontFile.isEmpty());
  283. ((SwitchCompat)findViewById(R.id.swLogFile)).setChecked(logFile != null && !logFile.isEmpty());
  284. ((SwitchCompat)findViewById(R.id.swAVI)).setChecked(getConfigBoolean(EnableAviPlay, false));
  285. ((SwitchCompat)findViewById(R.id.swTouch)).setChecked(getConfigBoolean(UseTouchOverlay, false));
  286. ((SwitchCompat)findViewById(R.id.swAspect)).setChecked(getConfigBoolean(KeepAspectRatio, false));
  287. ((SwitchCompat)findViewById(R.id.swSurround)).setChecked(getConfigBoolean(UseSurroundOPL, false));
  288. ((SwitchCompat)findViewById(R.id.swStereo)).setChecked(getConfigBoolean(Stereo, false));
  289. ((AppCompatSpinner)findViewById(R.id.spLogLevel)).setSelection(getConfigInt(LogLevel, false));
  290. ((AppCompatSpinner)findViewById(R.id.spSample)).setSelection(findMatchedIntIndex(getConfigInt(SampleRate, false), AudioSampleRates, 2)); // 44100Hz
  291. ((AppCompatSpinner)findViewById(R.id.spBuffer)).setSelection(findMatchedIntIndex(getConfigInt(AudioBufferSize, false), AudioBufferSizes, 1)); // 1024
  292. ((AppCompatSpinner)findViewById(R.id.spCDFmt)).setSelection(findMatchedStringIndex(getConfigString(CDFormat, false), CDFormats, 1)); // OGG
  293. ((AppCompatSpinner)findViewById(R.id.spMusFmt)).setSelection(findMatchedStringIndex(getConfigString(MusicFormat, false), MusicFormats, 1)); // RIX
  294. ((AppCompatSpinner)findViewById(R.id.spOPL)).setSelection(findMatchedStringIndex(getConfigString(OPLFormat, false), OPLFormats, 1)); // MAME
  295. ((AppCompatSpinner)findViewById(R.id.spOPLRate)).setSelection(findMatchedIntIndex(getConfigInt(OPLSampleRate, false), OPLSampleRates, 5)); // 49716Hz
  296. }
  297. protected boolean setConfigs() {
  298. if (((EditText)findViewById(R.id.edFolder)).getText().toString().isEmpty()) {
  299. AlertDialog.Builder builder = new AlertDialog.Builder(this);
  300. builder.setMessage(R.string.msg_empty);
  301. builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
  302. @Override
  303. public void onClick(DialogInterface dialogInterface, int i) {
  304. dialogInterface.dismiss();
  305. }
  306. });
  307. builder.create().show();
  308. return false;
  309. }
  310. setConfigInt(MusicVolume, ((SeekBar)findViewById(R.id.sbMusVol)).getProgress());
  311. setConfigInt(SoundVolume, ((SeekBar)findViewById(R.id.sbSFXVol)).getProgress());
  312. setConfigInt(ResampleQuality, ((SeekBar)findViewById(R.id.sbQuality)).getProgress());
  313. setConfigString(GamePath, ((EditText)findViewById(R.id.edFolder)).getText().toString());
  314. setConfigString(SavePath, ((EditText)findViewById(R.id.edFolder)).getText().toString());
  315. setConfigString(MessageFileName, ((SwitchCompat)findViewById(R.id.swMsgFile)).isChecked() ? ((EditText)findViewById(R.id.edMsgFile)).getText().toString() : null);
  316. setConfigString(FontFileName, ((SwitchCompat)findViewById(R.id.swFontFile)).isChecked() ? ((EditText)findViewById(R.id.edFontFile)).getText().toString() : null);
  317. setConfigString(LogFileName, ((SwitchCompat)findViewById(R.id.swLogFile)).isChecked() ? ((EditText)findViewById(R.id.edLogFile)).getText().toString() : null);
  318. setConfigBoolean(UseTouchOverlay, ((SwitchCompat)findViewById(R.id.swTouch)).isChecked());
  319. setConfigBoolean(KeepAspectRatio, ((SwitchCompat)findViewById(R.id.swAspect)).isChecked());
  320. setConfigBoolean(UseSurroundOPL, ((SwitchCompat)findViewById(R.id.swSurround)).isChecked());
  321. setConfigBoolean(Stereo, ((SwitchCompat)findViewById(R.id.swStereo)).isChecked());
  322. setConfigInt(LogLevel, ((AppCompatSpinner)findViewById(R.id.spLogLevel)).getSelectedItemPosition());
  323. setConfigInt(SampleRate, Integer.parseInt((String)((AppCompatSpinner)findViewById(R.id.spSample)).getSelectedItem()));
  324. setConfigInt(AudioBufferSize, Integer.parseInt((String)((AppCompatSpinner)findViewById(R.id.spBuffer)).getSelectedItem()));
  325. setConfigString(CDFormat, (String)((AppCompatSpinner)findViewById(R.id.spCDFmt)).getSelectedItem());
  326. setConfigString(MusicFormat, (String)((AppCompatSpinner)findViewById(R.id.spMusFmt)).getSelectedItem());
  327. setConfigString(OPLFormat, (String)((AppCompatSpinner)findViewById(R.id.spOPL)).getSelectedItem());
  328. setConfigInt(OPLSampleRate, Integer.parseInt((String)((AppCompatSpinner)findViewById(R.id.spOPLRate)).getSelectedItem()));
  329. return true;
  330. }
  331. }