From 3d87e578561caa4a31cd9f0efcf6492db925edb8 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Sun, 6 Sep 2015 19:57:29 +0200 Subject: [PATCH] Finished the new about screen. Also the DonationDialog loads its content now async. --- .../gramophone/dialogs/ChangelogDialog.java | 1 - .../gramophone/dialogs/DonationDialog.java | 216 ++++++++++++++++++ .../ui/activities/AboutActivity.java | 157 ++++++++++++- .../ui/activities/MainActivity.java | 143 +----------- .../ic_play_shopping_bag_white_24dp.png | Bin 0 -> 279 bytes .../ic_play_shopping_bag_white_24dp.png | Bin 0 -> 195 bytes .../ic_play_shopping_bag_white_24dp.png | Bin 0 -> 332 bytes .../ic_play_shopping_bag_white_24dp.png | Bin 0 -> 464 bytes .../ic_play_shopping_bag_white_24dp.png | Bin 0 -> 599 bytes .../res/layout/card_support_development.xml | 42 ++++ app/src/main/res/layout/dialog_donation.xml | 50 ++++ .../main/res/layout/item_donation_option.xml | 1 + app/src/main/res/values/strings.xml | 4 + 13 files changed, 464 insertions(+), 150 deletions(-) create mode 100644 app/src/main/java/com/kabouzeid/gramophone/dialogs/DonationDialog.java create mode 100644 app/src/main/res/drawable-hdpi/ic_play_shopping_bag_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_play_shopping_bag_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_play_shopping_bag_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_play_shopping_bag_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_play_shopping_bag_white_24dp.png create mode 100644 app/src/main/res/layout/dialog_donation.xml diff --git a/app/src/main/java/com/kabouzeid/gramophone/dialogs/ChangelogDialog.java b/app/src/main/java/com/kabouzeid/gramophone/dialogs/ChangelogDialog.java index 992ec2d6..73566497 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/dialogs/ChangelogDialog.java +++ b/app/src/main/java/com/kabouzeid/gramophone/dialogs/ChangelogDialog.java @@ -31,7 +31,6 @@ public class ChangelogDialog extends LeakDetectDialogFragment { return new ChangelogDialog(); } - @SuppressLint("InflateParams") @NonNull @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/dialogs/DonationDialog.java b/app/src/main/java/com/kabouzeid/gramophone/dialogs/DonationDialog.java new file mode 100644 index 00000000..f51db0d8 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/dialogs/DonationDialog.java @@ -0,0 +1,216 @@ +package com.kabouzeid.gramophone.dialogs; + +import android.annotation.SuppressLint; +import android.app.Dialog; +import android.content.Intent; +import android.graphics.Paint; +import android.os.Bundle; +import android.support.annotation.LayoutRes; +import android.support.annotation.NonNull; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; + +import com.afollestad.materialdialogs.MaterialDialog; +import com.afollestad.materialdialogs.ThemeSingleton; +import com.afollestad.materialdialogs.internal.MDTintHelper; +import com.anjlab.android.iab.v3.BillingProcessor; +import com.anjlab.android.iab.v3.SkuDetails; +import com.anjlab.android.iab.v3.TransactionDetails; +import com.kabouzeid.gramophone.App; +import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.util.ColorUtil; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import butterknife.Bind; +import butterknife.ButterKnife; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public class DonationDialog extends LeakDetectDialogFragment implements BillingProcessor.IBillingHandler { + public static final String TAG = DonationDialog.class.getSimpleName(); + + private static final int DONATION_PRODUCT_IDS = R.array.donation_ids; + + private BillingProcessor billingProcessor; + + public static DonationDialog create() { + return new DonationDialog(); + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + billingProcessor = new BillingProcessor(getContext(), App.GOOGLE_PLAY_LICENSE_KEY, this); + + @SuppressLint("InflateParams") + View customView = LayoutInflater.from(getContext()).inflate(R.layout.dialog_donation, null); + ProgressBar progressBar = ButterKnife.findById(customView, R.id.progress); + MDTintHelper.setTint(progressBar, ThemeSingleton.get().positiveColor.getDefaultColor()); + + return new MaterialDialog.Builder(getContext()) + .title(R.string.support_development) + .customView(customView, false) + .build(); + } + + void donate(int i) { + final String[] ids = getResources().getStringArray(DONATION_PRODUCT_IDS); + billingProcessor.purchase(getActivity(), ids[i]); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (!billingProcessor.handleActivityResult(requestCode, resultCode, data)) { + super.onActivityResult(requestCode, resultCode, data); + } + } + + @Override + public void onProductPurchased(String productId, TransactionDetails details) { + Toast.makeText(getContext(), R.string.thank_you, Toast.LENGTH_SHORT).show(); + } + + @Override + public void onPurchaseHistoryRestored() { + Toast.makeText(getContext(), R.string.restored_previous_purchases, Toast.LENGTH_SHORT).show(); + } + + @Override + public void onBillingError(int errorCode, Throwable error) { + Log.e(TAG, "Billing error: code = " + errorCode, error); + } + + @Override + public void onBillingInitialized() { + new Thread(new LoadAndDisplayPurchasesRunnable(this)).start(); + } + + @Override + public void onDestroy() { + if (billingProcessor != null) { + billingProcessor.release(); + } + super.onDestroy(); + } + + static class LoadAndDisplayPurchasesRunnable implements Runnable { + WeakReference dialogWeakReference; + + public LoadAndDisplayPurchasesRunnable(DonationDialog donationDialog) { + dialogWeakReference = new WeakReference<>(donationDialog); + } + + @Override + public void run() { + try { + final DonationDialog donationDialog = dialogWeakReference.get(); + final String[] ids = donationDialog.getResources().getStringArray(DONATION_PRODUCT_IDS); + final List skuDetailsList = donationDialog.billingProcessor.getPurchaseListingDetails(new ArrayList<>(Arrays.asList(ids))); + + 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(); + } + } + } + + static class SkuDetailsAdapter extends ArrayAdapter { + @LayoutRes + private static int LAYOUT_RES_ID = R.layout.item_donation_option; + + DonationDialog donationDialog; + + public SkuDetailsAdapter(@NonNull DonationDialog donationDialog, @NonNull List objects) { + super(donationDialog.getContext(), LAYOUT_RES_ID, objects); + this.donationDialog = donationDialog; + } + + @Override + public View getView(final int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = LayoutInflater.from(getContext()).inflate(LAYOUT_RES_ID, parent, false); + } + + SkuDetails skuDetails = getItem(position); + ViewHolder viewHolder = new ViewHolder(convertView); + + viewHolder.title.setText(skuDetails.title.replace("(Phonograph Music Player)", "").trim()); + viewHolder.text.setText(skuDetails.description); + viewHolder.price.setText(skuDetails.priceText); + + final boolean purchased = donationDialog.billingProcessor.isPurchased(skuDetails.productId); + + int titleTextColor = purchased ? ColorUtil.resolveColor(getContext(), android.R.attr.textColorHint) : ColorUtil.resolveColor(getContext(), android.R.attr.textColorPrimary); + int contentTextColor = purchased ? titleTextColor : ColorUtil.resolveColor(getContext(), android.R.attr.textColorSecondary); + + viewHolder.title.setTextColor(titleTextColor); + viewHolder.text.setTextColor(contentTextColor); + viewHolder.price.setTextColor(titleTextColor); + + strikeThrough(viewHolder.title, purchased); + strikeThrough(viewHolder.text, purchased); + strikeThrough(viewHolder.price, purchased); + + convertView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return purchased; + } + }); + + convertView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + donationDialog.donate(position); + } + }); + + return convertView; + } + + private static void strikeThrough(TextView textView, boolean strikeThrough) { + textView.setPaintFlags(strikeThrough ? textView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG : textView.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG); + } + + static class ViewHolder { + @Bind(R.id.title) + TextView title; + @Bind(R.id.text) + TextView text; + @Bind(R.id.price) + TextView price; + + public ViewHolder(View view) { + ButterKnife.bind(this, view); + } + } + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AboutActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AboutActivity.java index a64414c0..034fa603 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AboutActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AboutActivity.java @@ -1,13 +1,21 @@ package com.kabouzeid.gramophone.ui.activities; import android.content.Context; +import android.content.Intent; import android.content.pm.PackageManager; +import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.v7.widget.AppCompatButton; import android.support.v7.widget.Toolbar; import android.view.MenuItem; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.dialogs.ChangelogDialog; +import com.kabouzeid.gramophone.dialogs.DonationDialog; import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity; import butterknife.Bind; @@ -16,9 +24,64 @@ import butterknife.ButterKnife; /** * @author Karim Abou Zeid (kabouzeid) */ -public class AboutActivity extends AbsBaseActivity { +public class AboutActivity extends AbsBaseActivity implements View.OnClickListener { + + private static String GOOGLE_PLUS = "https://google.com/+KarimAbouZeid23697"; + private static String TWITTER = "https://twitter.com/karim23697"; + private static String GITHUB = "https://github.com/kabouzeid"; + private static String WEBSITE = "http://kabouzeid.de/"; + + private static String REPORT_BUGS = "https://github.com/kabouzeid/phonograph-issue-tracker"; + private static String GOOGLE_PLUS_COMMUNITY = "https://plus.google.com/u/0/communities/106227738496107108513"; + private static String TRANSLATE = "https://phonograph.oneskyapp.com/collaboration/project?id=26521"; + private static String RATE_ON_GOOGLE_PLAY = "https://play.google.com/store/apps/details?id=com.kabouzeid.gramophone"; + + private static String AIDAN_FOLLESTAD_GOOGLE_PLUS = "https://google.com/+AidanFollestad"; + private static String AIDAN_FOLLESTAD_GITHUB = "https://github.com/afollestad"; + + private static String MICHAEL_COOK_GOOGLE_PLUS = "https://google.com/+michaelcook"; + private static String MICHAEL_COOK_WEBSITE = "http://cookicons.co/"; + + private static String MAARTEN_CORPEL_GOOGLE_PLUS = "https://google.com/+MaartenCorpel"; + + private static String ALEKSANDAR_TESIC_GOOGLE_PLUS = "https://google.com/+aleksandartešić"; + @Bind(R.id.toolbar) Toolbar toolbar; + @Bind(R.id.app_version) + TextView appVersion; + @Bind(R.id.changelog) + LinearLayout changelog; + @Bind(R.id.add_to_google_plus_circles) + LinearLayout addToGooglePlusCircles; + @Bind(R.id.follow_on_twitter) + LinearLayout followOnTwitter; + @Bind(R.id.fork_on_git_hub) + LinearLayout forkOnGitHub; + @Bind(R.id.visit_website) + LinearLayout visitWebsite; + @Bind(R.id.report_bugs) + LinearLayout reportBugs; + @Bind(R.id.join_google_plus_community) + LinearLayout joinGooglePlusCommunity; + @Bind(R.id.translate) + LinearLayout translate; + @Bind(R.id.donate) + LinearLayout donate; + @Bind(R.id.rate_on_google_play) + LinearLayout rateOnGooglePlay; + @Bind(R.id.aidan_follestad_google_plus) + AppCompatButton aidanFollestadGooglePlus; + @Bind(R.id.aidan_follestad_git_hub) + AppCompatButton aidanFollestadGitHub; + @Bind(R.id.michael_cook_google_plus) + AppCompatButton michaelCookGooglePlus; + @Bind(R.id.michael_cook_website) + AppCompatButton michaelCookWebsite; + @Bind(R.id.maarten_corpel_google_plus) + AppCompatButton maartenCorpelGooglePlus; + @Bind(R.id.aleksandar_tesic_google_plus) + AppCompatButton aleksandarTesicGooglePlus; @Override protected void onCreate(Bundle savedInstanceState) { @@ -27,16 +90,49 @@ public class AboutActivity extends AbsBaseActivity { setStatusBarTransparent(); ButterKnife.bind(this); - toolbar.setBackgroundColor(getThemeColorPrimary()); - setSupportActionBar(toolbar); - //noinspection ConstantConditions - getSupportActionBar().setDisplayHomeAsUpEnabled(true); + setUpViews(); if (shouldColorNavigationBar()) setNavigationBarThemeColor(); setStatusBarThemeColor(); } + private void setUpViews() { + setUpToolbar(); + setUpAppVersion(); + setUpOnClickListeners(); + } + + private void setUpToolbar() { + toolbar.setBackgroundColor(getThemeColorPrimary()); + setSupportActionBar(toolbar); + //noinspection ConstantConditions + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + + private void setUpAppVersion() { + appVersion.setText(getCurrentVersionName(this)); + } + + private void setUpOnClickListeners() { + changelog.setOnClickListener(this); + addToGooglePlusCircles.setOnClickListener(this); + followOnTwitter.setOnClickListener(this); + forkOnGitHub.setOnClickListener(this); + visitWebsite.setOnClickListener(this); + reportBugs.setOnClickListener(this); + joinGooglePlusCommunity.setOnClickListener(this); + translate.setOnClickListener(this); + rateOnGooglePlay.setOnClickListener(this); + donate.setOnClickListener(this); + aidanFollestadGooglePlus.setOnClickListener(this); + aidanFollestadGitHub.setOnClickListener(this); + michaelCookGooglePlus.setOnClickListener(this); + michaelCookWebsite.setOnClickListener(this); + maartenCorpelGooglePlus.setOnClickListener(this); + aleksandarTesicGooglePlus.setOnClickListener(this); + } + @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { if (item.getItemId() == android.R.id.home) { @@ -47,12 +143,55 @@ public class AboutActivity extends AbsBaseActivity { } private static String getCurrentVersionName(@NonNull final Context context) { - String versionName; try { - versionName = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName; + return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName; } catch (PackageManager.NameNotFoundException e) { - return "Unknown"; + e.printStackTrace(); } - return versionName; + return "0.0.0"; + } + + @Override + public void onClick(View v) { + if (v == changelog) { + ChangelogDialog.create().show(getSupportFragmentManager(), "CHANGELOG_DIALOG"); + } else if (v == addToGooglePlusCircles) { + openUrl(GOOGLE_PLUS); + } else if (v == followOnTwitter) { + openUrl(TWITTER); + } else if (v == forkOnGitHub) { + openUrl(GITHUB); + } else if (v == visitWebsite) { + openUrl(WEBSITE); + } else if (v == reportBugs) { + openUrl(REPORT_BUGS); + } else if (v == joinGooglePlusCommunity) { + openUrl(GOOGLE_PLUS_COMMUNITY); + } else if (v == translate) { + openUrl(TRANSLATE); + } else if (v == rateOnGooglePlay) { + openUrl(RATE_ON_GOOGLE_PLAY); + } else if (v == donate) { + DonationDialog.create().show(getSupportFragmentManager(), "DONATION_DIALOG"); + } else if (v == aidanFollestadGooglePlus) { + openUrl(AIDAN_FOLLESTAD_GOOGLE_PLUS); + } else if (v == aidanFollestadGitHub) { + openUrl(AIDAN_FOLLESTAD_GITHUB); + } else if (v == michaelCookGooglePlus) { + openUrl(MICHAEL_COOK_GOOGLE_PLUS); + } else if (v == michaelCookWebsite) { + openUrl(MICHAEL_COOK_WEBSITE); + } else if (v == maartenCorpelGooglePlus) { + openUrl(MAARTEN_CORPEL_GOOGLE_PLUS); + } else if (v == aleksandarTesicGooglePlus) { + openUrl(ALEKSANDAR_TESIC_GOOGLE_PLUS); + } + } + + private void openUrl(String url) { + Intent i = new Intent(Intent.ACTION_VIEW); + i.setData(Uri.parse(url)); + i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(i); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index 8fbb6d46..9fe32153 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -7,14 +7,12 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.ColorStateList; import android.graphics.Color; -import android.graphics.Paint; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.provider.MediaStore; -import android.support.annotation.LayoutRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.AppBarLayout; @@ -27,30 +25,21 @@ import android.support.v4.view.ViewPager; import android.support.v4.widget.DrawerLayout; import android.support.v7.widget.Toolbar; import android.util.Log; -import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; -import android.view.MotionEvent; import android.view.SubMenu; import android.view.View; import android.view.ViewGroup; -import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; -import android.widget.Toast; import com.afollestad.materialcab.MaterialCab; -import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.ThemeSingleton; -import com.anjlab.android.iab.v3.BillingProcessor; -import com.anjlab.android.iab.v3.BillingProcessor.IBillingHandler; -import com.anjlab.android.iab.v3.SkuDetails; -import com.anjlab.android.iab.v3.TransactionDetails; -import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.PagerAdapter; import com.kabouzeid.gramophone.dialogs.ChangelogDialog; import com.kabouzeid.gramophone.dialogs.CreatePlaylistDialog; +import com.kabouzeid.gramophone.dialogs.DonationDialog; import com.kabouzeid.gramophone.dialogs.SleepTimerDialog; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.SearchQueryHelper; @@ -76,14 +65,12 @@ import com.sothree.slidinguppanel.SlidingUpPanelLayout; import java.io.File; import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; public class MainActivity extends AbsSlidingMusicPanelActivity - implements KabViewsDisableAble, CabHolder, IBillingHandler { + implements KabViewsDisableAble, CabHolder { public static final String TAG = MainActivity.class.getSimpleName(); @@ -105,8 +92,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity private PagerAdapter pagerAdapter; private MaterialCab cab; - private BillingProcessor billingProcessor; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -127,8 +112,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity setNavigationBarThemeColor(); setStatusBarThemeColor(); - billingProcessor = new BillingProcessor(this, App.GOOGLE_PLAY_LICENSE_KEY, this); - checkChangelog(); } @@ -237,7 +220,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity new Handler().postDelayed(new Runnable() { @Override public void run() { - showDonationDialog(); + DonationDialog.create().show(getSupportFragmentManager(), "DONATION_DIALOG"); } }, 300); break; @@ -598,124 +581,4 @@ public class MainActivity extends AbsSlidingMusicPanelActivity e.printStackTrace(); } } - - static class SkuDetailsAdapter extends ArrayAdapter { - @LayoutRes - private static int LAYOUT_RES_ID = R.layout.item_donation_option; - - public SkuDetailsAdapter(@NonNull MainActivity mainActivity, @NonNull List objects) { - super(mainActivity, LAYOUT_RES_ID, objects); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = LayoutInflater.from(getContext()).inflate(LAYOUT_RES_ID, parent, false); - } - - SkuDetails skuDetails = getItem(position); - ViewHolder viewHolder = new ViewHolder(convertView); - - viewHolder.title.setText(skuDetails.title.replace("(Phonograph Music Player)", "").trim()); - viewHolder.text.setText(skuDetails.description); - viewHolder.price.setText(skuDetails.priceText); - - final boolean purchased = ((MainActivity) getContext()).billingProcessor.isPurchased(skuDetails.productId); - - int titleTextColor = purchased ? ColorUtil.resolveColor(getContext(), android.R.attr.textColorHint) : ColorUtil.resolveColor(getContext(), android.R.attr.textColorPrimary); - int contentTextColor = purchased ? titleTextColor : ColorUtil.resolveColor(getContext(), android.R.attr.textColorSecondary); - - viewHolder.title.setTextColor(titleTextColor); - viewHolder.text.setTextColor(contentTextColor); - viewHolder.price.setTextColor(titleTextColor); - - strikeThrough(viewHolder.title, purchased); - strikeThrough(viewHolder.text, purchased); - strikeThrough(viewHolder.price, purchased); - - convertView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return purchased; - } - }); - - return convertView; - } - - private static void strikeThrough(TextView textView, boolean strikeThrough) { - textView.setPaintFlags(strikeThrough ? textView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG : textView.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG); - } - - static class ViewHolder { - @Bind(R.id.title) - TextView title; - @Bind(R.id.text) - TextView text; - @Bind(R.id.price) - TextView price; - - public ViewHolder(View view) { - ButterKnife.bind(this, view); - } - } - } - - private void showDonationDialog() { - billingProcessor.loadOwnedPurchasesFromGoogle(); - - final String[] ids = getResources().getStringArray(R.array.donation_ids); - List skuDetailsList = billingProcessor.getPurchaseListingDetails(new ArrayList<>(Arrays.asList(ids))); - if (skuDetailsList == null) return; - - new MaterialDialog.Builder(this) - .title(R.string.support_development) - .adapter(new SkuDetailsAdapter(this, skuDetailsList), new MaterialDialog.ListCallback() { - @Override - public void onSelection(MaterialDialog materialDialog, View view, int i, CharSequence charSequence) { - materialDialog.dismiss(); - donate(i); - } - }).show(); - } - - private void donate(int i) { - final String[] ids = getResources().getStringArray(R.array.donation_ids); - billingProcessor.purchase(MainActivity.this, ids[i]); - } - - @Override - public void onProductPurchased(String productId, TransactionDetails details) { - Toast.makeText(this, R.string.thank_you, Toast.LENGTH_SHORT).show(); - } - - @Override - public void onPurchaseHistoryRestored() { - // ignore - } - - @Override - public void onBillingError(int errorCode, Throwable error) { - Log.e(TAG, "Billing error: code = " + errorCode, error); - } - - @Override - public void onBillingInitialized() { - // ignore - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (!billingProcessor.handleActivityResult(requestCode, resultCode, data)) { - super.onActivityResult(requestCode, resultCode, data); - } - } - - @Override - protected void onDestroy() { - if (billingProcessor != null) { - billingProcessor.release(); - } - super.onDestroy(); - } } \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/ic_play_shopping_bag_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_play_shopping_bag_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..85a5f8832bb080a3930e716be67fddffea12c3ad GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4mJh`hKCF@W-u@?-1BsC45_%4{Nw+B`@;!` zcoy?5YHYsISivQ*|9`)9P0Omp> zVm_%#zFizg=Ce(1mTHI)=}>3*c>drcg&A^{3UM4q>e;)S6C&6<%z4$=4{qQUkeBq~ zYf6+?*k>|BhUJit!=9oI793N!!}+HPaIroLZ&u`;D5PalF0gW;lQH{5X)TjN0o8?0 zq3pg(omTLieRh05W5JpD8opfy418AI=N-!&{!H!b`^mGm=VMv(lZG7(vnFSBer}9N iE3rts;&|m4Lmlsu)tbT^tr!>>7(8A5T-G@yGywp`J!&8T literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_play_shopping_bag_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_play_shopping_bag_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..922b313b39d59309de577611682e81eba63a4825 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJox;$MRLn>}1|M>sko>|xM zaKZ)!iH`XH$63}lSWJ)-OE8vUiwio;B%u&i^FU{TnM9)44u+4JQBe$&(peq_DD3mp z=1!Qw+Htwzhvr(HhD1LFJ@!ZCTQ)T?N~NsNNNm&)SidY(;9;?;tC+y!tWCNK*RC?p xo*W-|@q_pc9gdbTg)0Vk>I1HxY`)FJpmG0t+AhXyB?blt22WQ%mvv4FO#lKSMNI$z literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_play_shopping_bag_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_play_shopping_bag_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..5e7107cc7d4c61ddbfa0d4e6cd7a3f37bddb338a GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?FXjRfGhH#=oSvnmof)AWeyxua+!34W8QtobrTy5ci!2{{{G

)qh8)=Gz`(SCF=C-e=&SEjG#tIP7;1mC|Ee#N=8$d(DV;xqX~8Q-4Go5U z$G<&iRbaTz@JgA1k;8%E>}E&ta}0m)3f@|z9o~@HQ}*JRXu_-owx@P5`2>qBQV(y) z?BjcJR5T%KfpS$b>x^qJ&PWZrAIdvW7wR;bHMy2F^r>D{Kqme?MX2pMUkd;M#w4uXXI$mm-ok nd&SESUU8eb92l5B++**X9y`5G#n6y}fq}u()z4*}Q$iB}|DT6D literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_play_shopping_bag_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_play_shopping_bag_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..f2741a198805513b3c7de81caeb801cf1e61ae9f GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84mJh`hS0a0-5D4dr+d0MhE&{od&kg=*-_-! zN70reC1Pex8$Ywi9n`L1%{F9N|3Gw4liWe&91kweM~pc-I)|Gce3riHG@)n5yW5qY zpGp6i&Uw0j`)QSwpiYmY+uT{01Unp9lrDq|o49LVIdMO{;;hiw3pb=M7*RZ(--ZXCc9-!A?@;zW(gUPo5y~b7Frd6w6IL~*%HsA2>%0l)l->>Xox->&d z++kMmWZMbfuB33AT)C3MY4YSs3hR`ltWAtwrl!vtgZz6l6}W?wg-%?$GJ|=Ond!3z z9epOjjD!Wt6z2GfFGzKCC>382>F6*$w&76ag;GX~{tOk_^I1M~m09N~|9qY}&A{{F zhc`}_{+cX(&t7!*UYN3B!L9cHdmI#)3_<>6Q3`0QWjeB8(w;BpIC2;m7#KWV{an^L HB{Ts5AX>!~ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_play_shopping_bag_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_play_shopping_bag_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..53ee64219d1f9a9538e4c0b234ee639748a35126 GIT binary patch literal 599 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4mJh`hDS5XEf^S>~)y=&;j>?m^V zBS%wI)Qt)TYr%uc6|CzYi0)~sRod<3x4>OM<;E@Pr2OPWO-`p{=6PbQoHujSD)ZC+ z@$WN>y!YPFnwk4@;knX|xC|x+1_1^J1qKEOh94(aE}62&OD*r~r~QVLL?#I{JWKb# zRQ`JHOP+G^hW}^li)OEG6lKw7sNMcki{VG?XVa{#hjSAc7nD?$GCOR&eQ}i{L*lks zx!F7i9&P&fn*j+-P-55`#fT&TXBzB3r+S{@1>=wZcP7Q`c(pi+K}5bHx=6E<+2MQR z-{ZT(C-F0s$XCP{>HcJKc-fe4IpvPmK86d7D~eTi7GIryjzNRrisfV*h6U^a#~(>5 zX)|=Ecf4U(GgomF>xQDX6LJo}c^Df$Nis1!HD+NrmCnH+_Qauxzk#p8UVqPKmRz}n zyTSYopRO=3u=&cM;cv@u3d~LCO-OvTnRSEF*PDzHvwy8&(DADkW0c9mevRFah6EHr|BDZZ_AxDE?ZBDGdA_Ld2 z8@qNXGW;=>53br-@^hYSJHv&2X)4!VnZC>oW~hI9xnZ8!I`@-)9t~0pQ!Jx)y!kTA ztUj_~|9h7D-xmtDolROD`L=AA@3lVy3@x`q7{PJI(7?dJz{tSB + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_donation_option.xml b/app/src/main/res/layout/item_donation_option.xml index 4cbc5f93..0016e144 100644 --- a/app/src/main/res/layout/item_donation_option.xml +++ b/app/src/main/res/layout/item_donation_option.xml @@ -2,6 +2,7 @@ back Support development Thank you! + Restored previous purchases. Play Store illustration by Version Application @@ -189,6 +190,8 @@ If you need help or have questions, the Phonograph community on Google Plus is a good place to go. Translate Help translating Phonograph to your native language. + Rate + Leave a positive rating on Google Play if you like Phonograph. Donate If you think I deserve to get paid for my work, you can leave me a few dollars here. For the theme engine and some other great stuff. @@ -196,4 +199,5 @@ For making the Play Store illustration and the empty album cover. For helping me with the design. Website + Loading products…