/*
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.backend;
import android.app.Activity;
import android.os.Bundle;
import com.swisscom.safeconnect.BuildConfig;
import com.swisscom.safeconnect.billing.Inventory;
import com.swisscom.safeconnect.billing.PurchaseManager;
import com.swisscom.safeconnect.billing.SkuDetails;
import com.swisscom.safeconnect.model.PlumberResponse;
import com.swisscom.safeconnect.model.PlumberSubscriptionResponse;
import com.swisscom.safeconnect.model.PlumberSubscriptionResponseList;
import com.swisscom.safeconnect.model.Subscription;
import com.swisscom.safeconnect.utils.Config;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Created by vadim on 03.10.14.
*/
public class SubscriptionsManager {
public static final String KEY_SUBSCRIPTIONS = "SubscriptionsManager.subscriptions";
public static final String KEY_CURRENT_SUBSCR = "SubscriptionsManager.current_subscription";
private BackendConnector backendConnector;
private PurchaseManager purchaseManager;
private Subscription[] subscriptions;
private Activity activity;
private boolean getSubscriptionsFail = false;
public SubscriptionsManager(Activity activity, Bundle savedInstanceState) {
backendConnector = new BackendConnector(activity);
this.activity = activity;
if (savedInstanceState != null) {
Object[] s = (Object []) savedInstanceState.getSerializable(KEY_SUBSCRIPTIONS);
if (s != null) {
subscriptions = Arrays.copyOf(s, s.length, Subscription[].class);
}
}
}
public void onSaveInstanceState(Bundle outState) {
outState.putSerializable(KEY_SUBSCRIPTIONS, subscriptions);
}
/**
* initializes the purchase manager. Returns over callback SkuDetails about subscriptions
* that are active on backend as well as on market
* @param callback
*/
public void init(final PurchaseManager.Callback<Subscription[]> callback){
if (subscriptions == null) {
backendConnector.getAvailableSubscriptions(Config.getInstance().getPhoneNumber(),
new BackendConnector.ResponseCallback<PlumberSubscriptionResponseList>() {
@Override
public void onRequestComplete(int statusCode, PlumberSubscriptionResponseList response) {
if (statusCode != 200) {
callback.onRequestFailed(0);
getSubscriptionsFail = true;
return;
}
final PlumberSubscriptionResponse[] ss = response.getSubscriptions();
Subscription[] backendSubscriptions = new Subscription[ss.length];
for (int i = 0; i < ss.length; i++) {
backendSubscriptions[i] = new Subscription(ss[i]);
}
final List<Subscription> availSubscr = new ArrayList<Subscription>(backendSubscriptions.length);
purchaseManager = new PurchaseManager(activity, backendSubscriptions);
// init purchase manager and query the inventory
purchaseManager.init(new PurchaseManager.Callback<PlumberResponse>() {
@Override
public void onRequestCompleted(PlumberResponse result) {
purchaseManager.queryInventory(new PurchaseManager.Callback<Inventory>() {
@Override
public void onRequestCompleted(Inventory result) {
// we need subscriptions that active on backend as well as
// on play market
for (PlumberSubscriptionResponse s : ss) {
SkuDetails sd = result.getSkuDetails(s.getName());
if (sd != null) {
availSubscr.add(new Subscription(sd, s));
}
}
completeRequest(availSubscr);
}
@Override
public void onRequestFailed(int errorCode) {
getSubscriptionsFail = true;
}
});
}
@Override
public void onRequestFailed(int errorCode) {
getSubscriptionsFail = true;
}
});
}
private void completeRequest(List<Subscription> availSubscr) {
subscriptions = new Subscription[availSubscr.size()];
availSubscr.toArray(subscriptions);
callback.onRequestCompleted(subscriptions);
getSubscriptionsFail = false;
}
}
);
} else {
callback.onRequestCompleted(subscriptions);
}
}
public Subscription[] getSubscriptions() {
return subscriptions;
}
public void getOwnSubscription(final PurchaseManager.Callback<Subscription> callback) {
if (subscriptions == null) {
if (getSubscriptionsFail) callback.onRequestFailed(0);
return;
}
backendConnector.getOwnSubscription(Config.getInstance().getPhoneNumber(),
Config.getInstance().getDeviceId(),
new BackendConnector.ResponseCallback<PlumberSubscriptionResponse>() {
@Override
public void onRequestComplete(int statusCode, PlumberSubscriptionResponse response) {
if (statusCode == 200) {
// try to find subscription in our list
for (Subscription s: subscriptions) {
if (s.getSku().equals(response.getName())) {
callback.onRequestCompleted(new Subscription(s, response.getValidTill()));
return;
}
}
// did not found active subscription, which means that some subscribtion
// got inactive on google play. We dont want to fail, so return what we can
callback.onRequestCompleted(new Subscription(response));
} else {
callback.onRequestFailed(statusCode);
}
}
}
);
}
public boolean isFailed() {
return getSubscriptionsFail;
}
}