package ml.docilealligator.infinityforreddit.settings;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import org.greenrobot.eventbus.EventBus;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.Executor;
import javax.inject.Inject;
import javax.inject.Named;
import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.customviews.CustomFontPreferenceFragmentCompat;
import ml.docilealligator.infinityforreddit.events.RecreateActivityEvent;
import ml.docilealligator.infinityforreddit.font.ContentFontFamily;
import ml.docilealligator.infinityforreddit.font.FontFamily;
import ml.docilealligator.infinityforreddit.font.TitleFontFamily;
import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
public class FontPreferenceFragment extends CustomFontPreferenceFragmentCompat {
private static final int CUSTOM_FONT_FAMILY_REQUEST_CODE = 20;
private static final int CUSTOM_TITLE_FONT_FAMILY_REQUEST_CODE = 21;
private static final int CUSTOM_CONTENT_FONT_FAMILY_REQUEST_CODE = 22;
@Inject
@Named("default")
SharedPreferences sharedPreferences;
@Inject
Executor executor;
private Preference customFontFamilyPreference;
private Preference customTitleFontFamilyPreference;
private Preference customContentFontFamilyPreference;
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.font_preferences, rootKey);
((Infinity) activity.getApplication()).getAppComponent().inject(this);
ListPreference fontFamilyPreference = findPreference(SharedPreferencesUtils.FONT_FAMILY_KEY);
customFontFamilyPreference = findPreference(SharedPreferencesUtils.CUSTOM_FONT_FAMILY_KEY);
ListPreference titleFontFamilyPreference = findPreference(SharedPreferencesUtils.TITLE_FONT_FAMILY_KEY);
customTitleFontFamilyPreference = findPreference(SharedPreferencesUtils.CUSTOM_TITLE_FONT_FAMILY_KEY);
ListPreference contentFontFamilyPreference = findPreference(SharedPreferencesUtils.CONTENT_FONT_FAMILY_KEY);
customContentFontFamilyPreference = findPreference(SharedPreferencesUtils.CUSTOM_CONTENT_FONT_FAMILY_KEY);
ListPreference fontSizePreference = findPreference(SharedPreferencesUtils.FONT_SIZE_KEY);
ListPreference titleFontSizePreference = findPreference(SharedPreferencesUtils.TITLE_FONT_SIZE_KEY);
ListPreference contentFontSizePreference = findPreference(SharedPreferencesUtils.CONTENT_FONT_SIZE_KEY);
if (customFontFamilyPreference != null) {
if (sharedPreferences.getString(SharedPreferencesUtils.FONT_FAMILY_KEY, FontFamily.Default.name()).equals(FontFamily.Custom.name())) {
customFontFamilyPreference.setVisible(true);
}
customFontFamilyPreference.setOnPreferenceClickListener(preference -> {
Intent intent = new Intent();
intent.setType("*/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, getString(R.string.select_a_ttf_font)), CUSTOM_FONT_FAMILY_REQUEST_CODE);
return true;
});
}
if (fontFamilyPreference != null) {
fontFamilyPreference.setOnPreferenceChangeListener((preference, newValue) -> {
EventBus.getDefault().post(new RecreateActivityEvent());
ActivityCompat.recreate(activity);
return true;
});
}
if (customTitleFontFamilyPreference != null) {
if (sharedPreferences.getString(SharedPreferencesUtils.TITLE_FONT_FAMILY_KEY, TitleFontFamily.Default.name()).equals(TitleFontFamily.Custom.name())) {
customTitleFontFamilyPreference.setVisible(true);
}
customTitleFontFamilyPreference.setOnPreferenceClickListener(preference -> {
Intent intent = new Intent();
intent.setType("*/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, getString(R.string.select_a_ttf_font)), CUSTOM_TITLE_FONT_FAMILY_REQUEST_CODE);
return true;
});
}
if (titleFontFamilyPreference != null) {
titleFontFamilyPreference.setOnPreferenceChangeListener((preference, newValue) -> {
EventBus.getDefault().post(new RecreateActivityEvent());
return true;
});
}
if (customContentFontFamilyPreference != null) {
if (sharedPreferences.getString(SharedPreferencesUtils.CONTENT_FONT_FAMILY_KEY, ContentFontFamily.Default.name()).equals(ContentFontFamily.Custom.name())) {
customContentFontFamilyPreference.setVisible(true);
}
customContentFontFamilyPreference.setOnPreferenceClickListener(preference -> {
Intent intent = new Intent();
intent.setType("*/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, getString(R.string.select_a_ttf_font)), CUSTOM_CONTENT_FONT_FAMILY_REQUEST_CODE);
return true;
});
}
if (contentFontFamilyPreference != null) {
contentFontFamilyPreference.setOnPreferenceChangeListener((preference, newValue) -> {
EventBus.getDefault().post(new RecreateActivityEvent());
return true;
});
}
if (fontSizePreference != null) {
fontSizePreference.setOnPreferenceChangeListener((preference, newValue) -> {
EventBus.getDefault().post(new RecreateActivityEvent());
ActivityCompat.recreate(activity);
return true;
});
}
if (titleFontSizePreference != null) {
titleFontSizePreference.setOnPreferenceChangeListener((preference, newValue) -> {
EventBus.getDefault().post(new RecreateActivityEvent());
return true;
});
}
if (contentFontSizePreference != null) {
contentFontSizePreference.setOnPreferenceChangeListener((preference, newValue) -> {
EventBus.getDefault().post(new RecreateActivityEvent());
return true;
});
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK && data != null && data.getData() != null) {
if (requestCode == CUSTOM_FONT_FAMILY_REQUEST_CODE) {
copyFontToInternalStorage(data.getData(), 0);
if (customFontFamilyPreference != null) {
customFontFamilyPreference.setSummary(data.getDataString());
}
} else if (requestCode == CUSTOM_TITLE_FONT_FAMILY_REQUEST_CODE) {
copyFontToInternalStorage(data.getData(), 1);
} else if (requestCode == CUSTOM_CONTENT_FONT_FAMILY_REQUEST_CODE) {
copyFontToInternalStorage(data.getData(), 2);
if (customContentFontFamilyPreference != null) {
customContentFontFamilyPreference.setSummary(data.getDataString());
}
}
}
}
private void copyFontToInternalStorage(Uri uri, int type) {
String destinationFontName;
switch (type) {
case 1:
destinationFontName = "title_font_family.ttf";
break;
case 2:
destinationFontName = "content_font_family.ttf";
break;
default:
destinationFontName = "font_family.ttf";
}
File fontDestinationPath = activity.getExternalFilesDir("fonts");
Handler handler = new Handler();
executor.execute(() -> {
File destinationFontFile = new File(fontDestinationPath, destinationFontName);
try (InputStream in = activity.getContentResolver().openInputStream(uri);
OutputStream out = new FileOutputStream(destinationFontFile)) {
if (in != null) {
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
try {
switch (type) {
case 1:
((Infinity) activity.getApplication()).titleTypeface = Typeface.createFromFile(destinationFontFile);
break;
case 2:
((Infinity) activity.getApplication()).contentTypeface = Typeface.createFromFile(destinationFontFile);
break;
default:
((Infinity) activity.getApplication()).typeface = Typeface.createFromFile(destinationFontFile);
}
} catch (RuntimeException e) {
e.printStackTrace();
handler.post(() -> Toast.makeText(activity, R.string.unable_to_load_font, Toast.LENGTH_SHORT).show());
return;
}
} else {
handler.post(() -> Toast.makeText(activity, R.string.unable_to_get_font_file, Toast.LENGTH_SHORT).show());
return;
}
handler.post(() -> {
EventBus.getDefault().post(new RecreateActivityEvent());
ActivityCompat.recreate(activity);
});
} catch (IOException e) {
e.printStackTrace();
handler.post(() -> {
Toast.makeText(activity, R.string.unable_to_copy_font_file, Toast.LENGTH_SHORT).show();
});
}
});
}
}