/* Swisscom Safe Connect Copyright (C) 2014 Swisscom This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.swisscom.safeconnect.activity; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.text.Html; import android.text.method.LinkMovementMethod; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.swisscom.safeconnect.BuildConfig; import com.swisscom.safeconnect.R; import com.swisscom.safeconnect.backend.BackendConnector; import com.swisscom.safeconnect.backend.SubscriptionsManager; import com.swisscom.safeconnect.billing.IabHelper; import com.swisscom.safeconnect.billing.PurchaseManager; import com.swisscom.safeconnect.model.PlumberResponse; import com.swisscom.safeconnect.model.PlumberSubscriptionResponse; import com.swisscom.safeconnect.model.Subscription; import com.swisscom.safeconnect.utils.Config; import com.swisscom.safeconnect.view.AboView; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; /** * Created by cianci on 6/10/14. */ public class SubscriptionActivity extends PipeActivity { public static final Subscription S_MONTH = new Subscription("month"); public static final Subscription S_YEAR = new Subscription("year"); private BackendConnector backendConnector = new BackendConnector(this); private TextView tvAboBuyErrorMessage; private TextView tvAboBuyEncouragement; private TextView tvAboBuyExplanation; private AboView aboMonth, aboYear; private PurchaseManager purchaseManager; private List<Subscription> subscriptions; private Subscription currentSubscription; private boolean purchaseManagerReady = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.abo, false); initActionBar(this, R.string.lab_abo, true); TextView tvReadTerms = (TextView) findViewById(R.id.view_abo_terms_read); tvReadTerms.setText(Html.fromHtml(getString(R.string.lab_abo_terms_read))); tvReadTerms.setMovementMethod(LinkMovementMethod.getInstance()); tvAboBuyErrorMessage = (TextView) findViewById(R.id.view_abo_buy_error_message); tvAboBuyEncouragement = (TextView) findViewById(R.id.view_abo_buy_encouragement); tvAboBuyExplanation = (TextView) findViewById(R.id.view_abo_buy_explanation); aboMonth = (AboView) findViewById(R.id.view_abo_month); aboYear = (AboView) findViewById(R.id.view_abo_year); currentSubscription = (Subscription) getIntent() .getSerializableExtra(SubscriptionsManager.KEY_CURRENT_SUBSCR); Object[] aa = (Object [])getIntent().getSerializableExtra(SubscriptionsManager.KEY_SUBSCRIPTIONS); Subscription[] ss = Arrays.copyOf(aa, aa.length, Subscription[].class); if (ss != null) { subscriptions = new ArrayList<>(Arrays.asList(ss)); } else { if (BuildConfig.DEBUG) Log.e(Config.TAG, "activity requires subscriptions in intent"); subscriptions = new LinkedList<>(); } if (!BuildConfig.DEBUG) initPurchaseManager(); setSubscription(S_MONTH, aboMonth, AboView.PricePeriod.MONTH); setSubscription(S_YEAR, aboYear, AboView.PricePeriod.YEAR); aboMonth.setOnBuyListener(new View.OnClickListener() { @Override public void onClick(View v) { aboMonth.setProgressVisible(true); subscribe(aboMonth.getSubscription()); } }); aboYear.setOnBuyListener(new View.OnClickListener() { @Override public void onClick(View v) { aboYear.setProgressVisible(true); subscribe(aboYear.getSubscription()); } }); } private void setSubscription(Subscription searchFor, AboView view, AboView.PricePeriod period) { int index = subscriptions.indexOf(searchFor); if (index >= 0) { view.setSubscription(subscriptions.get(index), currentSubscription, period); } else { if (BuildConfig.DEBUG) Log.e(Config.TAG, "failed to find a subscription!"); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (purchaseManager == null) return; // Pass on the activity result to the helper for handling if (!purchaseManager.handleActivityResult(requestCode, resultCode, data)) { // not handled, so handle it ourselves (here's where you'd // perform any handling of activity results not related to in-app // billing... super.onActivityResult(requestCode, resultCode, data); } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); } private void initPurchaseManager() { Subscription[] s = new Subscription[subscriptions.size()]; subscriptions.toArray(s); purchaseManager = new PurchaseManager(SubscriptionActivity.this, s); purchaseManager.init(new PurchaseManager.Callback<PlumberResponse>() { @Override public void onRequestCompleted(PlumberResponse result) { if (BuildConfig.DEBUG) Log.d(Config.TAG, "purchase manage init completed"); purchaseManagerReady = true; } @Override public void onRequestFailed(int errorCode) { if (BuildConfig.DEBUG) Log.d(Config.TAG, "purchase manager init failed"); purchaseManagerReady = false; } }); } private void setSubscribeEnabled(boolean enabled) { aboMonth.setBtnBuyEnabled(enabled); aboYear.setBtnBuyEnabled(enabled); } private void subscribe(Subscription subscription) { setSubscribeEnabled(false); if (BuildConfig.DEBUG || BuildConfig.TESTING) { backendConnector.subscribe(Config.getInstance().getPhoneNumber(), Config.getInstance().getDeviceId(), subscription.getId(), new BackendConnector.ResponseCallback<PlumberSubscriptionResponse>() { @Override public void onRequestComplete(int statusCode, PlumberSubscriptionResponse response) { setSubscribeEnabled(true); aboYear.setProgressVisible(false); aboMonth.setProgressVisible(false); tvAboBuyErrorMessage.setVisibility(View.GONE); tvAboBuyEncouragement.setVisibility(View.VISIBLE); tvAboBuyExplanation.setVisibility(View.VISIBLE); if (statusCode != 200 || response == null) { showErrorMsg(); return; } //inform widget Config.getInstance().setSubscriptionValidTill(response.getValidTill()); sendBroadcast(new Intent(Config.UPDATE_SUBSCRIPTION)); finish(); } } ); } else { if (!purchaseManagerReady) { if (BuildConfig.DEBUG) Log.e(Config.TAG, "PurchaseManager is not ready!"); setSubscribeEnabled(true); aboMonth.setProgressVisible(false); aboYear.setProgressVisible(false); return; } purchaseManager.purchaseSubscription(subscription, new PurchaseManager.Callback<Subscription>() { @Override public void onRequestCompleted(Subscription result) { if (BuildConfig.DEBUG) Log.d(Config.TAG, "purchased!!!"); setSubscribeEnabled(true); tvAboBuyErrorMessage.setVisibility(View.GONE); tvAboBuyEncouragement.setVisibility(View.VISIBLE); tvAboBuyExplanation.setVisibility(View.VISIBLE); aboMonth.setProgressVisible(false); aboYear.setProgressVisible(false); //inform widget sendBroadcast(new Intent(Config.UPDATE_SUBSCRIPTION)); finish(); } @Override public void onRequestFailed(int errorCode) { aboMonth.setProgressVisible(false); aboYear.setProgressVisible(false); if (errorCode == IabHelper.IABHELPER_USER_CANCELLED) { // Back button pressed aboYear.setBtnBuyEnabled(true); aboMonth.setBtnBuyEnabled(true); tvAboBuyErrorMessage.setVisibility(View.GONE); tvAboBuyEncouragement.setVisibility(View.VISIBLE); tvAboBuyExplanation.setVisibility(View.VISIBLE); } else { setSubscribeEnabled(true); showErrorMsg(); } } }); } } private void showErrorMsg() { tvAboBuyErrorMessage.setVisibility(View.VISIBLE); tvAboBuyExplanation.setVisibility(View.GONE); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { tvAboBuyEncouragement.setVisibility(View.GONE); } } }