Cleaned up the DonationsDialog.

This commit is contained in:
Karim Abou Zeid 2016-03-31 21:15:45 +02:00
commit 70199b8c5a
3 changed files with 73 additions and 44 deletions

View file

@ -4,6 +4,7 @@ import android.annotation.SuppressLint;
import android.app.Dialog; import android.app.Dialog;
import android.content.Intent; import android.content.Intent;
import android.graphics.Paint; import android.graphics.Paint;
import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.LayoutRes; import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
@ -41,15 +42,17 @@ import butterknife.ButterKnife;
/** /**
* @author Karim Abou Zeid (kabouzeid) * @author Karim Abou Zeid (kabouzeid)
*/ */
public class DonationDialog extends DialogFragment implements BillingProcessor.IBillingHandler { public class DonationsDialog extends DialogFragment implements BillingProcessor.IBillingHandler {
public static final String TAG = DonationDialog.class.getSimpleName(); public static final String TAG = DonationsDialog.class.getSimpleName();
private static final int DONATION_PRODUCT_IDS = R.array.donation_ids; private static final int DONATION_PRODUCT_IDS = R.array.donation_ids;
private BillingProcessor billingProcessor; private BillingProcessor billingProcessor;
public static DonationDialog create() { private AsyncTask skuDetailsLoadAsyncTask;
return new DonationDialog();
public static DonationsDialog create() {
return new DonationsDialog();
} }
@NonNull @NonNull
@ -68,7 +71,7 @@ public class DonationDialog extends DialogFragment implements BillingProcessor.I
.build(); .build();
} }
void donate(int i) { private void donate(int i) {
final String[] ids = getResources().getStringArray(DONATION_PRODUCT_IDS); final String[] ids = getResources().getStringArray(DONATION_PRODUCT_IDS);
billingProcessor.purchase(getActivity(), ids[i]); billingProcessor.purchase(getActivity(), ids[i]);
} }
@ -82,11 +85,13 @@ public class DonationDialog extends DialogFragment implements BillingProcessor.I
@Override @Override
public void onProductPurchased(String productId, TransactionDetails details) { public void onProductPurchased(String productId, TransactionDetails details) {
loadSkuDetails();
Toast.makeText(getContext(), R.string.thank_you, Toast.LENGTH_SHORT).show(); Toast.makeText(getContext(), R.string.thank_you, Toast.LENGTH_SHORT).show();
} }
@Override @Override
public void onPurchaseHistoryRestored() { public void onPurchaseHistoryRestored() {
loadSkuDetails();
Toast.makeText(getContext(), R.string.restored_previous_purchases, Toast.LENGTH_SHORT).show(); Toast.makeText(getContext(), R.string.restored_previous_purchases, Toast.LENGTH_SHORT).show();
} }
@ -97,7 +102,7 @@ public class DonationDialog extends DialogFragment implements BillingProcessor.I
@Override @Override
public void onBillingInitialized() { public void onBillingInitialized() {
new Thread(new LoadAndDisplayPurchasesRunnable(this)).start(); loadSkuDetails();
} }
@Override @Override
@ -105,54 +110,78 @@ public class DonationDialog extends DialogFragment implements BillingProcessor.I
if (billingProcessor != null) { if (billingProcessor != null) {
billingProcessor.release(); billingProcessor.release();
} }
if (skuDetailsLoadAsyncTask != null) {
skuDetailsLoadAsyncTask.cancel(true);
}
super.onDestroy(); super.onDestroy();
} }
static class LoadAndDisplayPurchasesRunnable implements Runnable { private void loadSkuDetails() {
WeakReference<DonationDialog> dialogWeakReference; if (skuDetailsLoadAsyncTask != null) {
skuDetailsLoadAsyncTask.cancel(false);
}
skuDetailsLoadAsyncTask = new SkuDetailsLoadAsyncTask(this).execute();
}
public LoadAndDisplayPurchasesRunnable(DonationDialog donationDialog) { private static class SkuDetailsLoadAsyncTask extends AsyncTask<Void, Void, List<SkuDetails>> {
dialogWeakReference = new WeakReference<>(donationDialog); private final WeakReference<DonationsDialog> donationDialogWeakReference;
public SkuDetailsLoadAsyncTask(DonationsDialog donationsDialog) {
this.donationDialogWeakReference = new WeakReference<>(donationsDialog);
} }
@Override @Override
public void run() { protected void onPreExecute() {
try { super.onPreExecute();
final DonationDialog donationDialog = dialogWeakReference.get(); DonationsDialog dialog = donationDialogWeakReference.get();
final String[] ids = donationDialog.getResources().getStringArray(DONATION_PRODUCT_IDS); if (dialog == null) return;
final List<SkuDetails> skuDetailsList = donationDialog.billingProcessor.getPurchaseListingDetails(new ArrayList<>(Arrays.asList(ids)));
View customView = ((MaterialDialog) dialog.getDialog()).getCustomView();
//noinspection ConstantConditions
customView.findViewById(R.id.progress_container).setVisibility(View.VISIBLE);
customView.findViewById(R.id.list).setVisibility(View.GONE);
}
donationDialog.getActivity().runOnUiThread(new Runnable() {
@Override @Override
public void run() { protected List<SkuDetails> doInBackground(Void... params) {
if (skuDetailsList == null || skuDetailsList.isEmpty()) { DonationsDialog dialog = donationDialogWeakReference.get();
donationDialog.dismiss(); if (dialog != null) {
final String[] ids = dialog.getResources().getStringArray(DONATION_PRODUCT_IDS);
return dialog.billingProcessor.getPurchaseListingDetails(new ArrayList<>(Arrays.asList(ids)));
}
cancel(false);
return null;
}
@Override
protected void onPostExecute(List<SkuDetails> skuDetails) {
super.onPostExecute(skuDetails);
DonationsDialog dialog = donationDialogWeakReference.get();
if (dialog == null) return;
if (skuDetails == null || skuDetails.isEmpty()) {
dialog.dismiss();
return; return;
} }
View customView = ((MaterialDialog) donationDialog.getDialog()).getCustomView();
if (customView != null) { View customView = ((MaterialDialog) dialog.getDialog()).getCustomView();
//noinspection ConstantConditions
customView.findViewById(R.id.progress_container).setVisibility(View.GONE); customView.findViewById(R.id.progress_container).setVisibility(View.GONE);
ListView listView = ButterKnife.findById(customView, R.id.list); ListView listView = ButterKnife.findById(customView, R.id.list);
listView.setAdapter(new SkuDetailsAdapter(donationDialog, skuDetailsList)); listView.setAdapter(new SkuDetailsAdapter(dialog, skuDetails));
listView.setVisibility(View.VISIBLE); listView.setVisibility(View.VISIBLE);
} }
} }
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
static class SkuDetailsAdapter extends ArrayAdapter<SkuDetails> { static class SkuDetailsAdapter extends ArrayAdapter<SkuDetails> {
@LayoutRes @LayoutRes
private static int LAYOUT_RES_ID = R.layout.item_donation_option; private static int LAYOUT_RES_ID = R.layout.item_donation_option;
DonationDialog donationDialog; DonationsDialog donationsDialog;
public SkuDetailsAdapter(@NonNull DonationDialog donationDialog, @NonNull List<SkuDetails> objects) { public SkuDetailsAdapter(@NonNull DonationsDialog donationsDialog, @NonNull List<SkuDetails> objects) {
super(donationDialog.getContext(), LAYOUT_RES_ID, objects); super(donationsDialog.getContext(), LAYOUT_RES_ID, objects);
this.donationDialog = donationDialog; this.donationsDialog = donationsDialog;
} }
@Override @Override
@ -168,7 +197,7 @@ public class DonationDialog extends DialogFragment implements BillingProcessor.I
viewHolder.text.setText(skuDetails.description); viewHolder.text.setText(skuDetails.description);
viewHolder.price.setText(skuDetails.priceText); viewHolder.price.setText(skuDetails.priceText);
final boolean purchased = donationDialog.billingProcessor.isPurchased(skuDetails.productId); final boolean purchased = donationsDialog.billingProcessor.isPurchased(skuDetails.productId);
int titleTextColor = purchased ? ATHUtil.resolveColor(getContext(), android.R.attr.textColorHint) : ThemeStore.textColorPrimary(getContext()); int titleTextColor = purchased ? ATHUtil.resolveColor(getContext(), android.R.attr.textColorHint) : ThemeStore.textColorPrimary(getContext());
int contentTextColor = purchased ? titleTextColor : ThemeStore.textColorSecondary(getContext()); int contentTextColor = purchased ? titleTextColor : ThemeStore.textColorSecondary(getContext());
@ -193,7 +222,7 @@ public class DonationDialog extends DialogFragment implements BillingProcessor.I
convertView.setOnClickListener(new View.OnClickListener() { convertView.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
donationDialog.donate(position); donationsDialog.donate(position);
} }
}); });

View file

@ -17,7 +17,7 @@ import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.kabouzeid.appthemehelper.ThemeStore; import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.ChangelogDialog; import com.kabouzeid.gramophone.dialogs.ChangelogDialog;
import com.kabouzeid.gramophone.dialogs.DonationDialog; import com.kabouzeid.gramophone.dialogs.DonationsDialog;
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
import com.kabouzeid.gramophone.ui.activities.intro.AppIntroActivity; import com.kabouzeid.gramophone.ui.activities.intro.AppIntroActivity;
@ -187,7 +187,7 @@ public class AboutActivity extends AbsBaseActivity implements View.OnClickListen
} else if (v == rateOnGooglePlay) { } else if (v == rateOnGooglePlay) {
openUrl(RATE_ON_GOOGLE_PLAY); openUrl(RATE_ON_GOOGLE_PLAY);
} else if (v == donate) { } else if (v == donate) {
DonationDialog.create().show(getSupportFragmentManager(), "DONATION_DIALOG"); DonationsDialog.create().show(getSupportFragmentManager(), "DONATION_DIALOG");
} else if (v == aidanFollestadGooglePlus) { } else if (v == aidanFollestadGooglePlus) {
openUrl(AIDAN_FOLLESTAD_GOOGLE_PLUS); openUrl(AIDAN_FOLLESTAD_GOOGLE_PLUS);
} else if (v == aidanFollestadGitHub) { } else if (v == aidanFollestadGitHub) {

View file

@ -29,7 +29,7 @@ import com.kabouzeid.appthemehelper.util.ATHUtil;
import com.kabouzeid.appthemehelper.util.NavigationViewUtil; import com.kabouzeid.appthemehelper.util.NavigationViewUtil;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.ChangelogDialog; import com.kabouzeid.gramophone.dialogs.ChangelogDialog;
import com.kabouzeid.gramophone.dialogs.DonationDialog; import com.kabouzeid.gramophone.dialogs.DonationsDialog;
import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.glide.SongGlideRequest;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.SearchQueryHelper; import com.kabouzeid.gramophone.helper.SearchQueryHelper;
@ -179,7 +179,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
new Handler().postDelayed(new Runnable() { new Handler().postDelayed(new Runnable() {
@Override @Override
public void run() { public void run() {
DonationDialog.create().show(getSupportFragmentManager(), "DONATION_DIALOG"); DonationsDialog.create().show(getSupportFragmentManager(), "DONATION_DIALOG");
} }
}, 200); }, 200);
break; break;