private File getExternalFilesDirOrThrowException(Context context, String type) throws DownloadRequestException { File result = UserPreferences.getDataFolder(context, type); if (result == null) { throw new DownloadRequestException("Failed to access external storage"); } return result; }
private void showChooseDataFolderDialog() { Context context = ui.getActivity(); File dataFolder = UserPreferences.getDataFolder(null); if (dataFolder == null) { new MaterialDialog.Builder(ui.getActivity()) .title(R.string.error_label) .content(R.string.external_storage_error_msg) .neutralText(android.R.string.ok) .show(); return; } String dataFolderPath = dataFolder.getAbsolutePath(); int selectedIndex = -1; File[] mediaDirs = ContextCompat.getExternalFilesDirs(context, null); List<String> folders = new ArrayList<>(mediaDirs.length); List<CharSequence> choices = new ArrayList<>(mediaDirs.length); for (int i = 0; i < mediaDirs.length; i++) { File dir = mediaDirs[i]; if (dir == null || !dir.exists() || !dir.canRead() || !dir.canWrite()) { continue; } String path = mediaDirs[i].getAbsolutePath(); folders.add(path); if (dataFolderPath.equals(path)) { selectedIndex = i; } int index = path.indexOf("Android"); String choice; if (index >= 0) { choice = path.substring(0, index); } else { choice = path; } long bytes = StorageUtils.getFreeSpaceAvailable(path); String freeSpace = String.format( context.getString(R.string.free_space_label), Converter.byteToString(bytes)); choices.add( Html.fromHtml("<html><small>" + choice + " [" + freeSpace + "]" + "</small></html>")); } if (choices.size() == 0) { new MaterialDialog.Builder(ui.getActivity()) .title(R.string.error_label) .content(R.string.external_storage_error_msg) .neutralText(android.R.string.ok) .show(); return; } MaterialDialog dialog = new MaterialDialog.Builder(ui.getActivity()) .title(R.string.choose_data_directory) .content(R.string.choose_data_directory_message) .items(choices.toArray(new CharSequence[choices.size()])) .itemsCallbackSingleChoice( selectedIndex, (dialog1, itemView, which, text) -> { String folder = folders.get(which); Log.d(TAG, "data folder: " + folder); UserPreferences.setDataFolder(folder); setDataFolderText(); return true; }) .negativeText(R.string.cancel_label) .cancelable(true) .build(); dialog.show(); }
private void setDataFolderText() { File f = UserPreferences.getDataFolder(null); if (f != null) { ui.findPreference(PreferenceController.PREF_CHOOSE_DATA_DIR).setSummary(f.getAbsolutePath()); } }