/** * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. */ package android.support.v7.preference; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.AlertDialog; import android.text.ClipboardManager; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Base64; import android.widget.Toast; import com.ubergeek42.WeechatAndroid.R; import com.ubergeek42.WeechatAndroid.utils.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; public class FilePreference extends DialogPreference { private static Logger logger = LoggerFactory.getLogger("FilePreference"); public FilePreference(Context context, AttributeSet attrs) { super(context, attrs); } @Override public CharSequence getSummary() { final String set_not_set = getContext().getString(Utils.isEmpty(getData(getPersistedString(null))) ? R.string.pref_file_not_set : R.string.pref_file_set); return getContext().getString(R.string.pref_file_summary, super.getSummary(), set_not_set); } protected void saveData(@Nullable byte[] bytes) { if (callChangeListener(bytes)) { persistString(bytes == null ? null : Base64.encodeToString(bytes, Base64.NO_WRAP)); notifyChanged(); } } public static @Nullable byte[] getData(String data) { try {return Base64.decode(data.getBytes(), Base64.NO_WRAP);} catch (IllegalArgumentException | NullPointerException ignored) {return null;} } //////////////////////////////////////////////////////////////////////////////////////////////// // this gets called when a file has been picked public void onActivityResult(@NonNull Intent intent) { try { saveData(Utils.readFromUri(getContext(), intent.getData())); Toast.makeText(getContext(), getContext().getString(R.string.pref_file_imported), Toast.LENGTH_SHORT).show(); } catch (IOException e) { Toast.makeText(getContext(), getContext().getString(R.string.pref_file_error, e.getMessage()), Toast.LENGTH_SHORT).show(); logger.error("onActivityResult()", e); } } //////////////////////////////////////////////////////////////////////////////////////////////// public static class FilePreferenceFragment extends PreferenceDialogFragmentCompat { public static FilePreferenceFragment newInstance(String key, int code) { FilePreferenceFragment fragment = new FilePreferenceFragment(); Bundle b = new Bundle(1); b.putString("key", key); b.putInt("code", code); fragment.setArguments(b); return fragment; } @Override protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { builder.setNeutralButton(getString(R.string.pref_file_clear_button), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ((FilePreference) getPreference()).saveData(null); Toast.makeText(getContext(), getString(R.string.pref_file_cleared), Toast.LENGTH_SHORT).show(); } }) .setNegativeButton(getString(R.string.pref_file_paste_button), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // noinspection deprecation ClipboardManager cm = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE); CharSequence clip = cm.getText(); if (TextUtils.isEmpty(clip)) Toast.makeText(getContext(), getString(R.string.pref_file_empty_clipboard), Toast.LENGTH_SHORT).show(); else { ((FilePreference) getPreference()).saveData(clip.toString().getBytes()); Toast.makeText(getContext(), getString(R.string.pref_file_pasted), Toast.LENGTH_SHORT).show(); } } }) .setPositiveButton(getString(R.string.pref_file_choose_button), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("*/*"); getTargetFragment().startActivityForResult(intent, getArguments().getInt("code")); } }); } @Override public void onDialogClosed(boolean b) {} } }