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();
}
}