package com.alorma.github.ui.fragment.donate; import android.app.Activity; import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentSender; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.support.annotation.Nullable; import android.support.v7.widget.CardView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import butterknife.BindView; import butterknife.ButterKnife; import com.alorma.github.R; import com.alorma.github.ui.fragment.base.BaseFragment; import com.android.vending.billing.IInAppBillingService; import java.util.UUID; import org.json.JSONException; import org.json.JSONObject; public class SkuCardFragment extends BaseFragment { private static final String ARG_DONATE = "ARG_DONATE"; public static final String SKU_BASE_DONATE = "com.alorma.github.donate"; private IInAppBillingService mService; ServiceConnection mServiceConn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { mService = null; } @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = IInAppBillingService.Stub.asInterface(service); } }; @BindView(R.id.cardView) CardView mCardView; @BindView(R.id.skuPrice) TextView skuPrice; @BindView(R.id.button) View button; private String purchaseId; public static SkuCardFragment newInstance(DonateItem donateItem) { SkuCardFragment fragment = new SkuCardFragment(); Bundle args = new Bundle(); args.putParcelable(ARG_DONATE, donateItem); fragment.setArguments(args); return fragment; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); createBillingService(); } private void createBillingService() { Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND"); serviceIntent.setPackage("com.android.vending"); getActivity().bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.sku_card_item, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ButterKnife.bind(this, view); if (getArguments() != null) { DonateItem item = getArguments().getParcelable(ARG_DONATE); if (item != null) { mCardView.setMaxCardElevation(mCardView.getCardElevation() * CardAdapter.MAX_ELEVATION_FACTOR); skuPrice.setText(item.toString()); button.setOnClickListener(view1 -> { if (tracker != null) { tracker.trackEvent("Donate", "selected", item.toString()); } buy(item.getSku()); }); } } } public CardView getCardView() { return mCardView; } private void buy(String sku) { try { if (mService != null) { purchaseId = UUID.randomUUID().toString(); Bundle buyIntentBundle = mService.getBuyIntent(3, getActivity().getPackageName(), sku, "inapp", purchaseId); if (buyIntentBundle != null) { PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT"); if (pendingIntent != null) { getActivity().startIntentSenderForResult(pendingIntent.getIntentSender(), 1001, new Intent(), 0, 0, 0); } } } } catch (RemoteException | IntentSender.SendIntentException e) { e.printStackTrace(); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1001) { String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA"); if (resultCode == Activity.RESULT_OK) { try { JSONObject jo = new JSONObject(purchaseData); String sku = jo.getString("productId"); String developerPayload = jo.getString("developerPayload"); if (developerPayload.equals(purchaseId) && SKU_BASE_DONATE.equals(sku)) { giveThanksForBuyDonate(); } } catch (JSONException e) { e.printStackTrace(); } } } } private void giveThanksForBuyDonate() { Toast.makeText(getActivity(), getString(R.string.thanks_for_donate), Toast.LENGTH_SHORT).show(); } @Override public void onDestroy() { if (mService != null) { getActivity().unbindService(mServiceConn); } super.onDestroy(); } }