com.dm.wallpaper.board.fragments.dialogs.InAppBillingFragment.java Source code

Java tutorial

Introduction

Here is the source code for com.dm.wallpaper.board.fragments.dialogs.InAppBillingFragment.java

Source

package com.dm.wallpaper.board.fragments.dialogs;

import android.app.Dialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.afollestad.materialdialogs.MaterialDialog;
import com.anjlab.android.iab.v3.BillingProcessor;
import com.anjlab.android.iab.v3.SkuDetails;
import com.dm.wallpaper.board.R;
import com.dm.wallpaper.board.R2;
import com.dm.wallpaper.board.adapters.InAppBillingAdapter;
import com.dm.wallpaper.board.items.InAppBilling;
import com.dm.wallpaper.board.utils.Extras;
import com.dm.wallpaper.board.utils.LogUtil;
import com.dm.wallpaper.board.utils.listeners.InAppBillingListener;

import butterknife.BindView;
import butterknife.ButterKnife;

/*
 * Wallpaper Board
 *
 * Copyright (c) 2017 Dani Mahardhika
 *
 * 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.
 */

public class InAppBillingFragment extends DialogFragment {

    @BindView(R2.id.listview)
    ListView mListView;
    @BindView(R2.id.progress)
    ProgressBar mProgress;

    private String mKey;
    private String[] mProductsId;

    private InAppBillingAdapter mAdapter;
    private AsyncTask<Void, Void, Boolean> mLoadInAppProducts;

    private static BillingProcessor mBillingProcessor;

    private static final String TAG = "com.dm.wallpaper.board.dialog.inappbilling";

    private static InAppBillingFragment newInstance(String key, String[] productId) {
        InAppBillingFragment fragment = new InAppBillingFragment();
        Bundle bundle = new Bundle();
        bundle.putString(Extras.EXTRA_KEY, key);
        bundle.putStringArray(Extras.EXTRA_PRODUCT_ID, productId);
        fragment.setArguments(bundle);
        return fragment;
    }

    public static void showInAppBillingDialog(@NonNull FragmentManager fm, BillingProcessor billingProcessor,
            @NonNull String key, @NonNull String[] productId) {
        mBillingProcessor = billingProcessor;
        FragmentTransaction ft = fm.beginTransaction();
        Fragment prev = fm.findFragmentByTag(TAG);
        if (prev != null) {
            ft.remove(prev);
        }

        try {
            DialogFragment dialog = InAppBillingFragment.newInstance(key, productId);
            dialog.show(ft, TAG);
        } catch (IllegalArgumentException | IllegalStateException ignored) {
        }
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mKey = getArguments().getString(Extras.EXTRA_KEY);
        mProductsId = getArguments().getStringArray(Extras.EXTRA_PRODUCT_ID);
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        MaterialDialog.Builder builder = new MaterialDialog.Builder(getActivity());
        builder.customView(R.layout.fragment_inappbilling, false).typeface("Font-Medium.ttf", "Font-Regular.ttf")
                .title(R.string.navigation_view_donate).positiveText(R.string.donate).negativeText(R.string.close)
                .onPositive((dialog, which) -> {
                    if (mLoadInAppProducts == null) {
                        try {
                            InAppBillingListener listener = (InAppBillingListener) getActivity();
                            listener.onInAppBillingSelected(mAdapter.getSelectedProduct());
                        } catch (Exception ignored) {
                        }
                        dismiss();
                    }
                });

        MaterialDialog dialog = builder.build();
        dialog.setCancelable(false);
        dialog.setCanceledOnTouchOutside(false);
        dialog.show();
        setCancelable(false);

        ButterKnife.bind(this, dialog);
        return dialog;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (savedInstanceState != null) {
            mKey = savedInstanceState.getString(Extras.EXTRA_KEY);
            mProductsId = savedInstanceState.getStringArray(Extras.EXTRA_PRODUCT_ID);
        }
        loadInAppProducts();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putString(Extras.EXTRA_KEY, mKey);
        outState.putStringArray(Extras.EXTRA_PRODUCT_ID, mProductsId);
        super.onSaveInstanceState(outState);
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        mBillingProcessor = null;
        if (mLoadInAppProducts != null)
            mLoadInAppProducts.cancel(true);
        super.onDismiss(dialog);
    }

    private void loadInAppProducts() {
        mLoadInAppProducts = new AsyncTask<Void, Void, Boolean>() {

            InAppBilling[] inAppBillings;
            boolean isBillingNotReady = false;

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                mProgress.setVisibility(View.VISIBLE);
                inAppBillings = new InAppBilling[mProductsId.length];
            }

            @Override
            protected Boolean doInBackground(Void... voids) {
                while (!isCancelled()) {
                    try {
                        Thread.sleep(1);
                        if (mBillingProcessor == null) {
                            isBillingNotReady = true;
                            return false;
                        }

                        for (int i = 0; i < mProductsId.length; i++) {
                            SkuDetails product = mBillingProcessor.getPurchaseListingDetails(mProductsId[i]);
                            if (product != null) {
                                InAppBilling inAppBilling;
                                String title = product.title.substring(0, product.title.lastIndexOf("("));
                                inAppBilling = new InAppBilling(product.priceText, mProductsId[i], title);
                                inAppBillings[i] = inAppBilling;
                            } else {
                                if (i == mProductsId.length - 1)
                                    return false;
                            }
                        }
                        return true;
                    } catch (Exception e) {
                        LogUtil.e(Log.getStackTraceString(e));
                        return false;
                    }
                }
                return false;
            }

            @Override
            protected void onPostExecute(Boolean aBoolean) {
                super.onPostExecute(aBoolean);
                mProgress.setVisibility(View.GONE);
                if (aBoolean) {
                    mAdapter = new InAppBillingAdapter(getActivity(), inAppBillings);
                    mListView.setAdapter(mAdapter);
                } else {
                    dismiss();
                    if (!isBillingNotReady)
                        Toast.makeText(getActivity(), R.string.billing_load_product_failed, Toast.LENGTH_LONG)
                                .show();
                }
                mLoadInAppProducts = null;
            }

        }.execute();
    }
}