diff --git a/src/PrefsAct.scala b/src/PrefsAct.scala index 1ba59d0..3e5b10f 100644 --- a/src/PrefsAct.scala +++ b/src/PrefsAct.scala @@ -1,11 +1,82 @@ package org.aprsdroid.app +import _root_.android.content.Intent +import _root_.android.net.Uri import _root_.android.os.Bundle +import _root_.android.os.Environment +import _root_.android.preference.Preference +import _root_.android.preference.Preference.OnPreferenceClickListener import _root_.android.preference.PreferenceActivity +import _root_.android.preference.PreferenceManager class PrefsAct extends PreferenceActivity { + def fileChooserPreference(pref_name : String, reqCode : Int, titleId : Int) { + findPreference(pref_name).setOnPreferenceClickListener(new OnPreferenceClickListener() { + def onPreferenceClick(preference : Preference) = { + val get_file = new Intent(Intent.ACTION_GET_CONTENT).setType("*/*") + startActivityForResult(Intent.createChooser(get_file, + getString(titleId)), reqCode) + true + } + }); + } override def onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) addPreferencesFromResource(R.xml.preferences) } + + def resolveContentUri(uri : Uri) = { + val Array(storage, path) = uri.getPath().replace("/document/", "").split(":", 2) + android.util.Log.d("PrefsAct", "resolveContentUri s=" + storage + " p=" + path) + if (storage == "primary") + Environment.getExternalStorageDirectory() + "/" + path + else + "/storage/" + storage + "/" + path + } + + def parseFilePickerResult(data : Intent, pref_name : String, error_id : Int) { + val file = data.getData().getScheme() match { + case "file" => + data.getData().getPath() + case "content" => + // fix up Uri for KitKat+; http://stackoverflow.com/a/20559175/539443 + // http://stackoverflow.com/a/27271131/539443 + if ("com.android.externalstorage.documents".equals(data.getData().getAuthority())) { + resolveContentUri(data.getData()) + } else { + val fixup_uri = Uri.parse(data.getDataString().replace( + "content://com.android.providers.downloads.documents/document", + "content://downloads/public_downloads")) + val cursor = getContentResolver().query(fixup_uri, null, null, null, null) + cursor.moveToFirst() + val idx = cursor.getColumnIndex("_data") + val result = if (idx != -1) cursor.getString(idx) else null + cursor.close() + result + } + case _ => + null + } + if (file != null) { + PreferenceManager.getDefaultSharedPreferences(this) + .edit().putString(pref_name, file).commit() + android.widget.Toast.makeText(this, file, + android.widget.Toast.LENGTH_SHORT).show() + // reload prefs + finish() + startActivity(getIntent()) + } else { + android.widget.Toast.makeText(this, getString(error_id, data.getDataString()), + android.widget.Toast.LENGTH_SHORT).show() + } + } + + override def onActivityResult(reqCode : Int, resultCode : Int, data : Intent) { + android.util.Log.d("PrefsAct", "onActResult: request=" + reqCode + " result=" + resultCode + " " + data) + if (resultCode == android.app.Activity.RESULT_OK && reqCode == 123456) { + } else + if (resultCode == android.app.Activity.RESULT_OK && reqCode == 123457) { + } else + super.onActivityResult(reqCode, resultCode, data) + } }