/*
* Copyright 2015 Priyesh Patel
*
* 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.chromium.fontinstaller.ui.settings;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.support.v4.app.ActivityCompat;
import android.util.SparseArray;
import android.view.View;
import com.chromium.fontinstaller.BuildConfig;
import com.chromium.fontinstaller.Injector;
import com.chromium.fontinstaller.R;
import com.chromium.fontinstaller.core.CommandRunner;
import com.chromium.fontinstaller.core.FontsterPreferences;
import com.chromium.fontinstaller.ui.main.MainActivity;
import com.chromium.fontinstaller.ui.settings.developer.DeveloperSettingsActivity;
import com.chromium.fontinstaller.util.Licenses;
import com.chromium.fontinstaller.util.billing.IabHelper;
import java.io.File;
import javax.inject.Inject;
import de.psdev.licensesdialog.LicensesDialog;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import static com.chromium.fontinstaller.core.FontsterPreferences.Key;
import static com.chromium.fontinstaller.util.ViewUtils.snackbar;
public class SettingsFragment extends PreferenceFragment {
private static final int TAPS_TO_ENTER_DEV_SETTINGS = 8;
public static final String DONATE_SKU_SMALL = "com.chromium.fontster.mDonate";
public static final String DONATE_SKU_MED = "com.chromium.fontster.donate_med";
public static final String DONATE_SKU_LARGE = "com.chromium.fontster.donate_large";
private static final SparseArray<String> DONATION_SKUS = new SparseArray<String>() {{
put(0, DONATE_SKU_SMALL);
put(1, DONATE_SKU_MED);
put(2, DONATE_SKU_LARGE);
}};
@Inject
FontsterPreferences mPreferences;
private IabHelper mBillingHelper;
private IabHelper.OnIabPurchaseFinishedListener mPurchaseListener;
private ProgressDialog mProgressDialog;
private int mVersionTaps = 0;
@Override public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Injector.get().inject(this);
addPreferencesFromResource(R.xml.settings);
findPreferenceById(R.string.pref_key_true_font)
.setOnPreferenceChangeListener((pref, newValue) -> handleTrueFont(newValue));
findPreferenceById(R.string.pref_key_clear_cache)
.setOnPreferenceClickListener(pref -> clearCache());
findPreferenceById(R.string.pref_key_view_source)
.setOnPreferenceClickListener(pref -> viewSource());
findPreferenceById(R.string.pref_key_licenses)
.setOnPreferenceClickListener(pref -> openLicensesDialog());
final Preference appVersion = findPreferenceById(R.string.pref_key_app_version);
appVersion.setSummary(BuildConfig.VERSION_NAME + " - " + BuildConfig.BUILD_TYPE);
appVersion.setOnPreferenceClickListener(pref -> {
if (++mVersionTaps == TAPS_TO_ENTER_DEV_SETTINGS) {
mVersionTaps = 0;
startActivity(new Intent(getActivity(), DeveloperSettingsActivity.class));
}
return true;
});
final Preference donate = findPreferenceById(R.string.pref_key_donate);
donate.setOnPreferenceClickListener(pref -> showDonationDialog());
mBillingHelper = new IabHelper(getActivity(), BuildConfig.GOOGLE_PLAY_LICENSE_KEY);
mBillingHelper.startSetup(result -> {
if (result.isSuccess()) {
donate.setEnabled(true);
} else {
donate.setSummary(R.string.settings_iab_setup_error);
}
});
}
private Preference findPreferenceById(int key) {
return findPreference(getString(key));
}
@Override public void onDestroy() {
super.onDestroy();
if (mBillingHelper != null) mBillingHelper.dispose();
mBillingHelper = null;
}
public IabHelper getBillingHelper() {
return mBillingHelper;
}
private boolean showDonationDialog() {
new AlertDialog.Builder(getActivity())
.setTitle(R.string.donate_dialog_title)
.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss())
.setSingleChoiceItems(R.array.donation_amounts, -1, (dialog, which) -> {
dialog.dismiss();
makeDonation(DONATION_SKUS.get(which));
}).create().show();
return true;
}
private boolean makeDonation(String sku) {
mBillingHelper.launchPurchaseFlow(getActivity(), sku, 1, mPurchaseListener, "");
mPurchaseListener = (result, purchase) -> {
final View v = getView();
if (result.isFailure()) snackbar(R.string.settings_donation_failed, v);
else if (purchase.getSku().equals(sku)) snackbar(R.string.settings_donation_success, v);
};
return true;
}
private boolean handleTrueFont(Object newValue) {
mPreferences.putBoolean(Key.ENABLE_TRUEFONT, (boolean) newValue);
showRestartDialog();
return true;
}
private boolean clearCache() {
mProgressDialog = new ProgressDialog(getActivity());
mProgressDialog.setMessage(getString(R.string.settings_clear_cache_progress));
mProgressDialog.show();
final File cache = new File(getActivity().getExternalCacheDir() + File.separator);
if (cache.listFiles() != null) {
Observable.from(cache.listFiles())
.filter(file -> !file.getName().equals("Backup"))
.map(file -> "rm -rf " + file.getAbsolutePath())
.toList()
.map(CommandRunner::run)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(o -> onCacheCleared(),
error -> snackbar(getString(R.string.settings_clear_cache_failed), getView()));
} else {
snackbar(getString(R.string.settings_clear_cache_failed), getView());
}
return true;
}
private void onCacheCleared() {
mPreferences.putBoolean(Key.TRUEFONTS_CACHED, false);
mProgressDialog.dismiss();
snackbar(R.string.settings_clear_cache_success, getView());
}
private boolean viewSource() {
final Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse(getString(R.string.settings_link_github)));
startActivity(intent);
return true;
}
private boolean openLicensesDialog() {
new LicensesDialog.Builder(getActivity())
.setNotices(Licenses.getNotices())
.build().show();
return true;
}
private void showRestartDialog() {
new AlertDialog.Builder(getActivity())
.setMessage(R.string.settings_restart_dialog_message)
.setPositiveButton(R.string.settings_restart_dialog_button, (d, i) -> restartApp())
.create().show();
}
private void restartApp() {
ActivityCompat.finishAffinity(getActivity());
startActivity(new Intent(getActivity(), MainActivity.class));
}
}