package info.kghost.android.openvpn; import java.lang.reflect.Field; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.preference.PreferenceManager; import android.preference.RingtonePreference; import android.util.AttributeSet; public class FilePickPreference extends RingtonePreference implements PreferenceManager.OnActivityResultListener { public FilePickPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public FilePickPreference(Context context, AttributeSet attrs) { super(context, attrs); } public FilePickPreference(Context context) { super(context); } @Override protected void onPrepareRingtonePickerIntent(Intent intent) { Intent target = new Intent(Intent.ACTION_GET_CONTENT); target.setType("*/*"); target.addCategory(Intent.CATEGORY_OPENABLE); intent.setAction(Intent.ACTION_CHOOSER); intent.putExtra(Intent.EXTRA_INTENT, target); if (getTitle() != null) { intent.putExtra(Intent.EXTRA_TITLE, getTitle()); } } @Override public boolean onActivityResult(int requestCode, int resultCode, Intent data) { try { Field[] fs = RingtonePreference.class.getDeclaredFields(); Field f = null; for (int i = 0; i < fs.length; ++i) { if ("mRequestCode".equals(fs[i].getName())) { f = fs[i]; f.setAccessible(true); } } int code = (Integer) f.get(this); if (requestCode == code) { if (data != null) { Uri uri = data.getData(); if (callChangeListener(uri != null ? uri.toString() : "")) { onSaveRingtone(uri); } } return true; } } catch (IllegalArgumentException e) { } catch (IllegalAccessException e) { } return false; } }