/* * ServeStream: A HTTP stream browser/player for Android * Copyright 2014 William Seemann * * 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 net.sourceforge.servestream.fragment; import java.math.BigInteger; import java.security.SecureRandom; import net.sourceforge.servestream.R; import net.sourceforge.servestream.activity.AboutActivity; import net.sourceforge.servestream.activity.BluetoothOptionsActivity; import net.sourceforge.servestream.activity.MainActivity; import net.sourceforge.servestream.billing.IabHelper; import net.sourceforge.servestream.billing.IabResult; import net.sourceforge.servestream.billing.Purchase; import net.sourceforge.servestream.utils.BackupUtils; import net.sourceforge.servestream.utils.Constants; import net.sourceforge.servestream.preference.PreferenceConstants; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceScreen; import android.util.Log; import android.widget.Toast; public class SettingsFragment extends net.sourceforge.servestream.preference.PreferenceFragment { private static final String TAG = SettingsFragment.class.getName(); private static final String PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr6Z/tJghrCn7OSo2lWndIo+tibBhZN/mQ/Spu4IsorzHwMVW3BKPzIiyqkZa78sEs6cH68HvfoAW7QpDgJ021ZKQZaTV3m714TkLZ9RZr+rtMdPBvRkcyVWtDj3L941I4cjczs08AhAcxoIRDtA3hHZ1sKfjEgHRY19Z8oas7+f2CqCoCdRBrBCQAN55YrFw06SsnGCjHuGQgx3+pzcxuNO91s7HvJIYtCDMz+dquvQ5cU51Ia5uG3HB8ezFoag1qMq65wGed3uXANwHZUconDG6ZMYhTF4hgsS2/6es0rDZSqsgqOQ8pRIBKSg0aRmvneW6+liSycMAoL+/hl8yRwIDAQAB"; private static final String DONATION_SKU_SMALL = "donation_small"; private static final String DONATION_SKU_MEDIUM = "donation_medium"; private static final String DONATION_SKU_LARGE = "donation_large"; private static final String DONATION_SKU_XLARGE = "donation_xlarge"; private String mPayload; private static final String PREF_BLUETOOTH_OPTIONS = "bluetooth_options"; private static final String PREF_BACKUP = "backup"; private static final String PREF_RESTORE = "restore"; private static final String PREF_ABOUT = "about"; private static final String PREF_DONATE = "donate"; private IabHelper mHelper; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (savedInstanceState == null) { addPreferencesFromResource(R.xml.preferences); findPreference(PREF_BLUETOOTH_OPTIONS).setOnPreferenceClickListener( new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { getActivity().startActivity(new Intent( getActivity(), BluetoothOptionsActivity.class)); return true; } }); findPreference(PREF_ABOUT).setOnPreferenceClickListener( new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { getActivity().startActivity(new Intent( getActivity(), AboutActivity.class)); return true; } }); findPreference(PREF_DONATE).setOnPreferenceClickListener( new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { mHelper = new IabHelper(getActivity(), PUBLIC_KEY); mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { if (!result.isSuccess()) { Log.d(TAG, "Problem setting up In-app Billing: " + result); // IAB couldn't be used lets take the user to the project's webpage instead. Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(Constants.SERVESTREAM_DONATE_PAGE)); startActivity(intent); } else { Log.d(TAG, "Hooray, IAB is fully set up!"); showDonationAmountsDialog(); } } }); return true; } }); findPreference(PreferenceConstants.THEME).setOnPreferenceChangeListener( new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { Intent intent = new Intent(getActivity(), MainActivity.class); intent.putExtra("restart_app", true); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); getActivity().finish(); return true; } }); } } @Override public void onDestroy() { super.onDestroy(); if (mHelper != null) { mHelper.dispose(); mHelper = null; } } @Override public boolean onPreferenceTreeClick (PreferenceScreen preferenceScreen, Preference preference) { if (preference.getKey() != null) { if (preference.getKey().equals(PREF_BACKUP)) { BackupUtils.backup(getActivity()); } else if (preference.getKey().equals(PREF_RESTORE)) { BackupUtils.restore(getActivity()); } } return true; } private void showDonationAmountsDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.donation_amount) .setItems(R.array.donation_amounts, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { makeDonation(which); dialog.dismiss(); } }) .setNegativeButton(android.R.string.cancel, null); builder.create().show(); } private void makeDonation(int which) { String donationSku; switch (which) { case (0): donationSku = DONATION_SKU_SMALL; break; case (1): donationSku = DONATION_SKU_MEDIUM; break; case (2): donationSku = DONATION_SKU_LARGE; break; case (3): donationSku = DONATION_SKU_XLARGE; break; default: return; } mPayload = new BigInteger(130, new SecureRandom()).toString(32); mHelper.launchPurchaseFlow(getActivity(), donationSku, 10001, mPurchaseFinishedListener, mPayload); } /** Verifies the developer payload of a purchase. */ boolean verifyDeveloperPayload(Purchase p) { String payload = p.getDeveloperPayload(); if (mPayload.equals(payload)) { return true; } else { return false; } } // Callback for when a purchase is finished IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { public void onIabPurchaseFinished(IabResult result, Purchase purchase) { Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase); // if we were disposed of in the meantime, quit. if (mHelper == null) return; if (result.isFailure()) { complain("Error purchasing: " + result); return; } if (!verifyDeveloperPayload(purchase)) { complain("Error purchasing. Authenticity verification failed."); return; } Log.d(TAG, "Purchase successful."); if (purchase.getSku().equals(DONATION_SKU_SMALL) || purchase.getSku().equals(DONATION_SKU_MEDIUM) || purchase.getSku().equals(DONATION_SKU_LARGE) || purchase.getSku().equals(DONATION_SKU_XLARGE)) { Toast.makeText(getActivity(), getString(R.string.donation_successful_message), Toast.LENGTH_LONG).show(); mHelper.consumeAsync(purchase, mConsumeFinishedListener); } } }; // Called when consumption is complete IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { public void onConsumeFinished(Purchase purchase, IabResult result) { Log.d(TAG, "Consumption finished. Purchase: " + purchase + ", result: " + result); // if we were disposed of in the meantime, quit. if (mHelper == null) return; } }; private void complain(String message) { Log.e(TAG, "**** Error: " + message); } }