package net.rdrei.android.scdl2.ui;
import net.rdrei.android.scdl2.R;
import net.rdrei.android.scdl2.ui.BuyAdFreeActivity.IabSetupFinishedEvent;
import net.rdrei.android.scdl2.ui.BuyAdFreeActivity.IabStatus;
import net.rdrei.android.scdl2.ui.BuyAdFreeActivity.PaymentStatus;
import net.rdrei.android.scdl2.ui.BuyAdFreeActivity.PurchaseAdfreeFinishedEvent;
import net.rdrei.android.scdl2.ui.BuyAdFreeActivity.PurchaseAdfreeRequestEvent;
import net.rdrei.android.scdl2.ui.BuyAdFreeActivity.PurchaseStateChangeEvent;
import roboguice.fragment.RoboFragment;
import roboguice.inject.InjectView;
import roboguice.util.Ln;
import android.os.Bundle;
import android.text.Html;
import android.text.Spanned;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.google.inject.Inject;
import com.squareup.otto.Bus;
import com.squareup.otto.Subscribe;
public class BuyAdFreeTeaserFragment extends RoboFragment {
@InjectView(R.id.buy_ad_free_teaser_text)
private TextView mTeaserText;
@InjectView(R.id.error_message)
private TextView mErrorText;
@InjectView(R.id.buy_ad_free_teaser_button)
private Button mButton;
@InjectView(R.id.progress_bar)
private ProgressBar mProgressBar;
@Inject
private Bus mBus;
private IabStatus mInitialized = IabStatus.UNKNOWN;
private PaymentStatus mBought = PaymentStatus.UNKNOWN;
public static BuyAdFreeTeaserFragment newInstance() {
final BuyAdFreeTeaserFragment fragment = new BuyAdFreeTeaserFragment();
return fragment;
}
@Override
public void onStart() {
super.onResume();
Ln.d("mBus @ fragment: %s", System.identityHashCode(mBus));
mBus.register(this);
}
@Override
public void onStop() {
super.onPause();
mBus.unregister(this);
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final Spanned html = Html.fromHtml(getActivity().getString(
R.string.buy_ad_free_teaser_text));
mTeaserText.setText(html);
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
requestPurchase();
}
});
}
@Override
public View onCreateView(final LayoutInflater inflater,
final ViewGroup container, final Bundle savedInstanceState) {
return inflater.inflate(R.layout.buy_ad_free_teaser, container, false);
}
public void showError(final String error) {
mErrorText.setText(error);
mErrorText.setVisibility(View.VISIBLE);
hideLoadingSpinner();
}
public void clearError() {
mErrorText.setVisibility(View.GONE);
}
public void showLoadingSpinner() {
mButton.setVisibility(View.GONE);
mProgressBar.setVisibility(View.VISIBLE);
}
public void hideLoadingSpinner() {
mButton.setVisibility(View.VISIBLE);
mProgressBar.setVisibility(View.GONE);
}
private void setBillingEnabled(boolean billingEnabled) {
Ln.d("Setting new billing enabled state to %s.", billingEnabled);
mButton.setEnabled(billingEnabled);
}
private void requestPurchase() {
Ln.d("Requesting purchase.");
showLoadingSpinner();
mBus.post(new PurchaseAdfreeRequestEvent());
}
/**
* Updates the UI according to the current state of Play initialization and
* synchronization.
*/
private void updateState() {
if (mInitialized == IabStatus.ENABLED
&& mBought == PaymentStatus.NOT_BOUGHT) {
hideLoadingSpinner();
clearError();
setBillingEnabled(true);
} else if (mInitialized == IabStatus.DISABLED
|| mInitialized == IabStatus.UNKNOWN) {
// This should better only be shown in case Status is DISABLED,
// but at the momenet, we don't get any response if there is no
// Google Play. :/
hideLoadingSpinner();
setBillingEnabled(false);
showError(getString(R.string.error_no_iab));
}
}
@Subscribe
public void onPurchasedFinished(PurchaseAdfreeFinishedEvent event) {
Ln.d("Received PurchaseAdfreeFinishedEvent with success=%s",
event.success);
hideLoadingSpinner();
clearError();
if (!event.success) {
showError(getString(R.string.error_iab_connection));
}
}
@Subscribe
public void onIabStateChange(IabSetupFinishedEvent event) {
Ln.d("Received IabSetupFinishedEvent: %s", event.enabled.toString());
mInitialized = event.enabled;
updateState();
}
@Subscribe
public void onPurchaseStateChange(PurchaseStateChangeEvent event) {
Ln.d("Received PurchaseStateChangeEvent: %s", event);
mBought = event.purchased;
updateState();
}
}