/* * Copyright 2016 Hippo Seven * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.hippo.ehviewer.ui.fragment; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceFragment; import android.support.annotation.Nullable; import android.support.v7.app.AlertDialog; import android.widget.Toast; import com.hippo.ehviewer.R; import com.hippo.ehviewer.Settings; import com.hippo.ehviewer.ui.CommonOperations; import com.hippo.ehviewer.ui.DirPickerActivity; import com.hippo.unifile.UniFile; public class DownloadFragment extends PreferenceFragment implements Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener { public static final int REQUEST_CODE_PICK_IMAGE_DIR = 0; public static final int REQUEST_CODE_PICK_IMAGE_DIR_L = 1; public static final String KEY_DOWNLOAD_LOCATION = "download_location"; @Nullable private Preference mDownloadLocation; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.download_settings); Preference mediaScan = findPreference(Settings.KEY_MEDIA_SCAN); Preference imageResolution = findPreference(Settings.KEY_IMAGE_RESOLUTION); mDownloadLocation = findPreference(KEY_DOWNLOAD_LOCATION); onUpdateDownloadLocation(); mediaScan.setOnPreferenceChangeListener(this); imageResolution.setOnPreferenceChangeListener(this); if (mDownloadLocation != null) { mDownloadLocation.setOnPreferenceClickListener(this); } } @Override public void onDestroy() { super.onDestroy(); mDownloadLocation = null; } public void onUpdateDownloadLocation() { UniFile file = Settings.getDownloadLocation(); if (mDownloadLocation != null) { if (file != null) { mDownloadLocation.setSummary(file.getUri().toString()); } else { mDownloadLocation.setSummary(R.string.settings_download_invalid_download_location); } } } @Override public boolean onPreferenceClick(Preference preference) { String key = preference.getKey(); if (KEY_DOWNLOAD_LOCATION.equals(key)) { int sdk = Build.VERSION.SDK_INT; if (sdk < Build.VERSION_CODES.KITKAT) { openDirPicker(); } else if (sdk < Build.VERSION_CODES.LOLLIPOP) { showDirPickerDialogKK(); } else { showDirPickerDialogL(); } return true; } return false; } private void showDirPickerDialogKK() { new AlertDialog.Builder(getActivity()).setMessage(R.string.settings_download_pick_dir_kk) .setPositiveButton(R.string.settings_download_continue, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { openDirPicker(); } }).show(); } private void showDirPickerDialogL() { DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case DialogInterface.BUTTON_POSITIVE: openDirPicker(); break; case DialogInterface.BUTTON_NEUTRAL: openDirPickerL(); break; } } }; new AlertDialog.Builder(getActivity()).setMessage(R.string.settings_download_pick_dir_l) .setPositiveButton(R.string.settings_download_continue, listener) .setNeutralButton(R.string.settings_download_document, listener) .show(); } private void openDirPicker() { UniFile uniFile = Settings.getDownloadLocation(); Intent intent = new Intent(getActivity(), DirPickerActivity.class); if (uniFile != null) { intent.putExtra(DirPickerActivity.KEY_FILE_URI, uniFile.getUri()); } startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE_DIR); } private void openDirPickerL() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); try { startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE_DIR_L); } catch (ActivityNotFoundException e) { Toast.makeText(getActivity(), R.string.error_cant_find_activity, Toast.LENGTH_SHORT).show(); } } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQUEST_CODE_PICK_IMAGE_DIR: { if (resultCode == Activity.RESULT_OK) { UniFile uniFile = UniFile.fromUri(getActivity(), data.getData()); if (uniFile != null) { Settings.putDownloadLocation(uniFile); onUpdateDownloadLocation(); } else { Toast.makeText(getActivity(), R.string.settings_download_cant_get_download_location, Toast.LENGTH_SHORT).show(); } } break; } case REQUEST_CODE_PICK_IMAGE_DIR_L: { if (resultCode == Activity.RESULT_OK && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Uri treeUri = data.getData(); getActivity().getContentResolver().takePersistableUriPermission( treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); UniFile uniFile = UniFile.fromTreeUri(getActivity(), treeUri); if (uniFile != null) { Settings.putDownloadLocation(uniFile); onUpdateDownloadLocation(); } else { Toast.makeText(getActivity(), R.string.settings_download_cant_get_download_location, Toast.LENGTH_SHORT).show(); } } break; } default: { super.onActivityResult(requestCode, resultCode, data); } } } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { String key = preference.getKey(); if (Settings.KEY_MEDIA_SCAN.equals(key)) { if (newValue instanceof Boolean) { UniFile downloadLocation = Settings.getDownloadLocation(); if ((Boolean) newValue) { CommonOperations.removeNoMediaFile(downloadLocation); } else { CommonOperations.ensureNoMediaFile(downloadLocation); } } return true; } else if (Settings.KEY_IMAGE_RESOLUTION.equals(key)) { if (newValue instanceof String) { Settings.putImageResolution((String) newValue); } return true; } return false; } }