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.content.Intent;
import android.graphics.Paint;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
@ -41,15 +42,17 @@ import butterknife.ButterKnife;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class DonationDialog extends DialogFragment implements BillingProcessor.IBillingHandler {
public static final String TAG = DonationDialog.class.getSimpleName();
public class DonationsDialog extends DialogFragment implements BillingProcessor.IBillingHandler {
public static final String TAG = DonationsDialog.class.getSimpleName();
private static final int DONATION_PRODUCT_IDS = R.array.donation_ids;
private BillingProcessor billingProcessor;
public static DonationDialog create() {
return new DonationDialog();
private AsyncTask skuDetailsLoadAsyncTask;
public static DonationsDialog create() {
return new DonationsDialog();
}
@NonNull
@ -68,7 +71,7 @@ public class DonationDialog extends DialogFragment implements BillingProcessor.I
.build();
}
void donate(int i) {
private void donate(int i) {
final String[] ids = getResources().getStringArray(DONATION_PRODUCT_IDS);
billingProcessor.purchase(getActivity(), ids[i]);
}
@ -82,11 +85,13 @@ public class DonationDialog extends DialogFragment implements BillingProcessor.I
@Override
public void onProductPurchased(String productId, TransactionDetails details) {
loadSkuDetails();
Toast.makeText(getContext(), R.string.thank_you, Toast.LENGTH_SHORT).show();
}
@Override
public void onPurchaseHistoryRestored() {
loadSkuDetails();
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
public void onBillingInitialized() {
new Thread(new LoadAndDisplayPurchasesRunnable(this)).start();
loadSkuDetails();
}
@Override
@ -105,42 +110,66 @@ public class DonationDialog extends DialogFragment implements BillingProcessor.I
if (billingProcessor != null) {
billingProcessor.release();
}
if (skuDetailsLoadAsyncTask != null) {
skuDetailsLoadAsyncTask.cancel(true);
}
super.onDestroy();
}
static class LoadAndDisplayPurchasesRunnable implements Runnable {
WeakReference<DonationDialog> dialogWeakReference;
private void loadSkuDetails() {
if (skuDetailsLoadAsyncTask != null) {
skuDetailsLoadAsyncTask.cancel(false);
}
skuDetailsLoadAsyncTask = new SkuDetailsLoadAsyncTask(this).execute();
}
public LoadAndDisplayPurchasesRunnable(DonationDialog donationDialog) {
dialogWeakReference = new WeakReference<>(donationDialog);
private static class SkuDetailsLoadAsyncTask extends AsyncTask<Void, Void, List<SkuDetails>> {
private final WeakReference<DonationsDialog> donationDialogWeakReference;
public SkuDetailsLoadAsyncTask(DonationsDialog donationsDialog) {
this.donationDialogWeakReference = new WeakReference<>(donationsDialog);
}
@Override
public void run() {
try {
final DonationDialog donationDialog = dialogWeakReference.get();
final String[] ids = donationDialog.getResources().getStringArray(DONATION_PRODUCT_IDS);
final List<SkuDetails> skuDetailsList = donationDialog.billingProcessor.getPurchaseListingDetails(new ArrayList<>(Arrays.asList(ids)));
protected void onPreExecute() {
super.onPreExecute();
DonationsDialog dialog = donationDialogWeakReference.get();
if (dialog == null) return;
donationDialog.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
if (skuDetailsList == null || skuDetailsList.isEmpty()) {
donationDialog.dismiss();
return;
}
View customView = ((MaterialDialog) donationDialog.getDialog()).getCustomView();
if (customView != null) {
customView.findViewById(R.id.progress_container).setVisibility(View.GONE);
ListView listView = ButterKnife.findById(customView, R.id.list);
listView.setAdapter(new SkuDetailsAdapter(donationDialog, skuDetailsList));
listView.setVisibility(View.VISIBLE);
}
}
});
} catch (Exception e) {
e.printStackTrace();
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);
}
@Override
protected List<SkuDetails> doInBackground(Void... params) {
DonationsDialog dialog = donationDialogWeakReference.get();
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;
}
View customView = ((MaterialDialog) dialog.getDialog()).getCustomView();
//noinspection ConstantConditions
customView.findViewById(R.id.progress_container).setVisibility(View.GONE);
ListView listView = ButterKnife.findById(customView, R.id.list);
listView.setAdapter(new SkuDetailsAdapter(dialog, skuDetails));
listView.setVisibility(View.VISIBLE);
}
}
@ -148,11 +177,11 @@ public class DonationDialog extends DialogFragment implements BillingProcessor.I
@LayoutRes
private static int LAYOUT_RES_ID = R.layout.item_donation_option;
DonationDialog donationDialog;
DonationsDialog donationsDialog;
public SkuDetailsAdapter(@NonNull DonationDialog donationDialog, @NonNull List<SkuDetails> objects) {
super(donationDialog.getContext(), LAYOUT_RES_ID, objects);
this.donationDialog = donationDialog;
public SkuDetailsAdapter(@NonNull DonationsDialog donationsDialog, @NonNull List<SkuDetails> objects) {
super(donationsDialog.getContext(), LAYOUT_RES_ID, objects);
this.donationsDialog = donationsDialog;
}
@Override
@ -168,7 +197,7 @@ public class DonationDialog extends DialogFragment implements BillingProcessor.I
viewHolder.text.setText(skuDetails.description);
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 contentTextColor = purchased ? titleTextColor : ThemeStore.textColorSecondary(getContext());
@ -193,7 +222,7 @@ public class DonationDialog extends DialogFragment implements BillingProcessor.I
convertView.setOnClickListener(new View.OnClickListener() {
@Override
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.gramophone.R;
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.intro.AppIntroActivity;
@ -187,7 +187,7 @@ public class AboutActivity extends AbsBaseActivity implements View.OnClickListen
} else if (v == rateOnGooglePlay) {
openUrl(RATE_ON_GOOGLE_PLAY);
} else if (v == donate) {
DonationDialog.create().show(getSupportFragmentManager(), "DONATION_DIALOG");
DonationsDialog.create().show(getSupportFragmentManager(), "DONATION_DIALOG");
} else if (v == aidanFollestadGooglePlus) {
openUrl(AIDAN_FOLLESTAD_GOOGLE_PLUS);
} 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.gramophone.R;
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.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.SearchQueryHelper;
@ -179,7 +179,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
DonationDialog.create().show(getSupportFragmentManager(), "DONATION_DIALOG");
DonationsDialog.create().show(getSupportFragmentManager(), "DONATION_DIALOG");
}
}, 200);
break;