forked from organicmaps/organicmaps
[android] Added statistic for subscription trial
This commit is contained in:
parent
d73a113df5
commit
76d1aa2caf
9 changed files with 104 additions and 66 deletions
|
@ -2185,11 +2185,12 @@ Java_com_mapswithme_maps_Framework_nativeHasActiveSubscription(JNIEnv *, jclass,
|
|||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_com_mapswithme_maps_Framework_nativeSetActiveSubscription(JNIEnv *, jclass, jint type,
|
||||
jboolean isActive)
|
||||
jboolean isActive, jboolean isTrial)
|
||||
{
|
||||
auto const & purchase = frm()->GetPurchase();
|
||||
if (purchase == nullptr)
|
||||
return;
|
||||
// TODO: @milchakov pass the 'isTrial' parameter to the purchase please.
|
||||
purchase->SetSubscriptionEnabled(static_cast<SubscriptionType>(type),
|
||||
static_cast<bool>(isActive));
|
||||
}
|
||||
|
|
|
@ -531,7 +531,7 @@ public class Framework
|
|||
|
||||
public static native boolean nativeHasActiveSubscription(@SubscriptionType int type);
|
||||
public static native void nativeSetActiveSubscription(@SubscriptionType int type,
|
||||
boolean isActive);
|
||||
boolean isActive, boolean isTrial);
|
||||
|
||||
public static native int nativeGetCurrentTipIndex();
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.mapswithme.maps.purchase;
|
|||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
@ -71,10 +72,6 @@ abstract class AbstractBookmarkSubscriptionFragment extends BaseAuthFragment
|
|||
mPurchaseController.initialize(requireActivity());
|
||||
mPingCallback.attach(this);
|
||||
BookmarkManager.INSTANCE.addCatalogPingListener(mPingCallback);
|
||||
Statistics.INSTANCE.trackPurchasePreviewShow(getSubscriptionType().getServerId(),
|
||||
getSubscriptionType().getVendor(),
|
||||
getSubscriptionType().getYearlyProductId(),
|
||||
getExtraFrom());
|
||||
View root = onSubscriptionCreateView(inflater, container, savedInstanceState);
|
||||
mDelegate = createFragmentDelegate(this);
|
||||
if (root != null)
|
||||
|
@ -282,6 +279,12 @@ abstract class AbstractBookmarkSubscriptionFragment extends BaseAuthFragment
|
|||
public void onPriceSelection()
|
||||
{
|
||||
mDelegate.onPriceSelection();
|
||||
ProductDetails details = getProductDetailsForPeriod(PurchaseUtils.Period.P1Y);
|
||||
boolean isTrial = !TextUtils.isEmpty(details.getFreeTrialPeriod());
|
||||
Statistics.INSTANCE.trackPurchasePreviewShow(getSubscriptionType().getServerId(),
|
||||
getSubscriptionType().getVendor(),
|
||||
getSubscriptionType().getYearlyProductId(),
|
||||
getExtraFrom(), isTrial);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -438,8 +441,11 @@ abstract class AbstractBookmarkSubscriptionFragment extends BaseAuthFragment
|
|||
|
||||
void trackYearlyProductSelected()
|
||||
{
|
||||
ProductDetails details = getProductDetailsForPeriod(PurchaseUtils.Period.P1Y);
|
||||
boolean isTrial = !TextUtils.isEmpty(details.getFreeTrialPeriod());
|
||||
Statistics.INSTANCE.trackPurchasePreviewSelect(getSubscriptionType().getServerId(),
|
||||
getSubscriptionType().getYearlyProductId());
|
||||
getSubscriptionType().getYearlyProductId(),
|
||||
isTrial);
|
||||
}
|
||||
|
||||
void trackMonthlyProductSelected()
|
||||
|
|
|
@ -20,7 +20,8 @@ abstract class AbstractBookmarkValidationCallback implements ValidationCallback
|
|||
}
|
||||
|
||||
@Override
|
||||
public final void onValidate(@NonNull String purchaseData, @NonNull ValidationStatus status)
|
||||
public final void onValidate(@NonNull String purchaseData, @NonNull ValidationStatus status,
|
||||
boolean isTrial)
|
||||
{
|
||||
LOGGER.i(TAG, "Validation status of 'paid bookmark': " + status);
|
||||
if (status == ValidationStatus.VERIFIED)
|
||||
|
|
|
@ -78,6 +78,6 @@ class DefaultPurchaseValidator implements PurchaseValidator<ValidationCallback>,
|
|||
mOperationObservable.removeValidationObserver(orderId);
|
||||
mValidatedOrderId = null;
|
||||
if (mCallback != null)
|
||||
mCallback.onValidate(purchaseData, status);
|
||||
mCallback.onValidate(purchaseData, status, isTrial);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
package com.mapswithme.maps.purchase;
|
||||
|
||||
import android.app.Activity;
|
||||
import androidx.annotation.NonNull;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import com.android.billingclient.api.Purchase;
|
||||
import com.mapswithme.maps.Framework;
|
||||
import com.mapswithme.util.ConnectionState;
|
||||
|
@ -51,7 +51,8 @@ class SubscriptionPurchaseController extends AbstractPurchaseController<Validati
|
|||
private class ValidationCallbackImpl implements ValidationCallback
|
||||
{
|
||||
@Override
|
||||
public void onValidate(@NonNull String purchaseData, @NonNull ValidationStatus status)
|
||||
public void onValidate(@NonNull String purchaseData, @NonNull ValidationStatus status,
|
||||
boolean isTrial)
|
||||
{
|
||||
LOGGER.i(TAG, "Validation status of '" + mType + "': " + status);
|
||||
if (status == ValidationStatus.VERIFIED)
|
||||
|
@ -66,14 +67,15 @@ class SubscriptionPurchaseController extends AbstractPurchaseController<Validati
|
|||
if (!hasActiveSubscription && shouldActivateSubscription)
|
||||
{
|
||||
LOGGER.i(TAG, "'" + mType + "' subscription activated");
|
||||
Statistics.INSTANCE.trackPurchaseProductDelivered(mType.getServerId(), mType.getVendor());
|
||||
Statistics.INSTANCE.trackPurchaseProductDelivered(mType.getServerId(), mType.getVendor(),
|
||||
isTrial);
|
||||
}
|
||||
else if (hasActiveSubscription && !shouldActivateSubscription)
|
||||
{
|
||||
LOGGER.i(TAG, "'" + mType + "' subscription deactivated");
|
||||
}
|
||||
|
||||
Framework.nativeSetActiveSubscription(mType.ordinal(), shouldActivateSubscription);
|
||||
Framework.nativeSetActiveSubscription(mType.ordinal(), shouldActivateSubscription, isTrial);
|
||||
|
||||
if (getUiCallback() != null)
|
||||
getUiCallback().onValidationFinish(shouldActivateSubscription);
|
||||
|
@ -106,7 +108,7 @@ class SubscriptionPurchaseController extends AbstractPurchaseController<Validati
|
|||
if (Framework.nativeHasActiveSubscription(mType.ordinal()))
|
||||
{
|
||||
LOGGER.i(TAG, "'" + mType + "' subscription deactivated");
|
||||
Framework.nativeSetActiveSubscription(mType.ordinal(), false);
|
||||
Framework.nativeSetActiveSubscription(mType.ordinal(), false, false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -56,6 +56,10 @@ class TwoButtonsSubscriptionFragmentDelegate extends SubscriptionFragmentDelegat
|
|||
return;
|
||||
|
||||
mSelectedPeriod = period;
|
||||
if (mSelectedPeriod == PurchaseUtils.Period.P1Y)
|
||||
getFragment().trackYearlyProductSelected();
|
||||
else if (mSelectedPeriod == PurchaseUtils.Period.P1M)
|
||||
getFragment().trackMonthlyProductSelected();
|
||||
getFragment().pingBookmarkCatalog();
|
||||
}
|
||||
|
||||
|
|
|
@ -4,5 +4,5 @@ import androidx.annotation.NonNull;
|
|||
|
||||
public interface ValidationCallback
|
||||
{
|
||||
void onValidate(@NonNull String purchaseData, @NonNull ValidationStatus status);
|
||||
void onValidate(@NonNull String purchaseData, @NonNull ValidationStatus status, boolean isTrial);
|
||||
}
|
||||
|
|
|
@ -148,6 +148,7 @@ import static com.mapswithme.util.statistics.Statistics.EventParam.RESTAURANT_LO
|
|||
import static com.mapswithme.util.statistics.Statistics.EventParam.SERVER_ID;
|
||||
import static com.mapswithme.util.statistics.Statistics.EventParam.SERVER_IDS;
|
||||
import static com.mapswithme.util.statistics.Statistics.EventParam.STATE;
|
||||
import static com.mapswithme.util.statistics.Statistics.EventParam.TRIAL;
|
||||
import static com.mapswithme.util.statistics.Statistics.EventParam.TURN_ON;
|
||||
import static com.mapswithme.util.statistics.Statistics.EventParam.TYPE;
|
||||
import static com.mapswithme.util.statistics.Statistics.EventParam.VALUE;
|
||||
|
@ -663,67 +664,68 @@ public enum Statistics
|
|||
public static final String DATE = "date";
|
||||
public static final String STATUS = "status";
|
||||
public static final String SOURCE = "source";
|
||||
static final String ID = "id";
|
||||
public static final String GUIDE_CATALOGUE = "guide_catalogue";
|
||||
public static final String SUBSCRIPTION = "subscription";
|
||||
public static final String EXPORT_BOOKMARKS = "export_bookmarks";
|
||||
public static final String BOOKMARKS_BACKUP = "bookmarks_backup";
|
||||
public static final String AFTER_SAVE_REVIEW = "after_save_review";
|
||||
static final String TRACKS = "tracks";
|
||||
static final String POINTS = "points";
|
||||
static final String TOLL = "toll";
|
||||
static final String UNPAVED = "unpaved";
|
||||
static final String FERRY = "ferry";
|
||||
static final String MOTORWAY = "motorway";
|
||||
static final String SCENARIO = "scenario";
|
||||
static final String TARGET = "target";
|
||||
static final String CATEGORY = "category";
|
||||
static final String COUNT = "Count";
|
||||
static final String COUNT_LOWERCASE = "count";
|
||||
static final String CHANNEL = "Channel";
|
||||
static final String BANNER = "banner";
|
||||
static final String BATTERY = "battery";
|
||||
static final String CALLER_ID = "Caller ID";
|
||||
static final String CONNECTION_TYPE = "Connection name";
|
||||
static final String CATEGORY = "category";
|
||||
static final String CHANNEL = "Channel";
|
||||
static final String CHARGING = "charging";
|
||||
static final String CONNECTION_FAST = "Connection fast";
|
||||
static final String CONNECTION_METERED = "Connection limit";
|
||||
static final String MY_POSITION = "my position";
|
||||
static final String POINT = "point";
|
||||
static final String IS_AUTHENTICATED = "is_authenticated";
|
||||
static final String IS_ONLINE = "is_online";
|
||||
static final String CONNECTION_TYPE = "Connection name";
|
||||
static final String COUNT = "Count";
|
||||
static final String COUNT_LOWERCASE = "count";
|
||||
static final String DESTINATION = "destination";
|
||||
static final String ERROR_CODE = "error_code";
|
||||
static final String ERROR_MESSAGE = "error_message";
|
||||
static final String FEATURE_ID = "feature_id";
|
||||
static final String MWM_NAME = "mwm_name";
|
||||
static final String MWM_VERSION = "mwm_version";
|
||||
static final String FERRY = "ferry";
|
||||
static final String FIRST_LAUNCH = "first_launch";
|
||||
static final String FROM_LAT = "from_lat";
|
||||
static final String FROM_LON = "from_lon";
|
||||
static final String HAS_AUTH = "has_auth";
|
||||
static final String HOTEL_LAT = "hotel_lat";
|
||||
static final String HOTEL_LON = "hotel_lon";
|
||||
static final String ID = "id";
|
||||
static final String INTERRUPTED = "interrupted";
|
||||
static final String IS_AUTHENTICATED = "is_authenticated";
|
||||
static final String IS_ONLINE = "is_online";
|
||||
static final String ITEM = "item";
|
||||
static final String MAP_DATA_SIZE = "map_data_size:";
|
||||
static final String METHOD = "method";
|
||||
static final String MODE = "mode";
|
||||
static final String MOTORWAY = "motorway";
|
||||
static final String MWM_NAME = "mwm_name";
|
||||
static final String MWM_VERSION = "mwm_version";
|
||||
static final String MY_POSITION = "my position";
|
||||
static final String NETWORK = "network";
|
||||
static final String OBJECT_LAT = "object_lat";
|
||||
static final String OBJECT_LON = "object_lon";
|
||||
static final String PLACEMENT = "placement";
|
||||
static final String POINT = "point";
|
||||
static final String POINTS = "points";
|
||||
static final String PRODUCT = "product";
|
||||
static final String PURCHASE = "purchase";
|
||||
static final String RESTAURANT = "restaurant";
|
||||
static final String RESTAURANT_LAT = "restaurant_lat";
|
||||
static final String RESTAURANT_LON = "restaurant_lon";
|
||||
static final String FROM_LAT = "from_lat";
|
||||
static final String FROM_LON = "from_lon";
|
||||
static final String TO_LAT = "to_lat";
|
||||
static final String TO_LON = "to_lon";
|
||||
static final String BANNER = "banner";
|
||||
static final String STATE = "state";
|
||||
static final String ERROR_CODE = "error_code";
|
||||
static final String ERROR_MESSAGE = "error_message";
|
||||
static final String MAP_DATA_SIZE = "map_data_size:";
|
||||
static final String BATTERY = "battery";
|
||||
static final String CHARGING = "charging";
|
||||
static final String NETWORK = "network";
|
||||
static final String METHOD = "method";
|
||||
static final String MODE = "mode";
|
||||
static final String OBJECT_LAT = "object_lat";
|
||||
static final String OBJECT_LON = "object_lon";
|
||||
static final String ITEM = "item";
|
||||
static final String DESTINATION = "destination";
|
||||
static final String PLACEMENT = "placement";
|
||||
static final String HAS_AUTH = "has_auth";
|
||||
static final String INTERRUPTED = "interrupted";
|
||||
static final String VENDOR = "vendor";
|
||||
static final String PRODUCT = "product";
|
||||
static final String PURCHASE = "purchase";
|
||||
static final String SCENARIO = "scenario";
|
||||
static final String SERVER_ID = "server_id";
|
||||
static final String SERVER_IDS = "server_ids";
|
||||
static final String FIRST_LAUNCH = "first_launch";
|
||||
static final String STATE = "state";
|
||||
static final String TARGET = "target";
|
||||
static final String TO_LAT = "to_lat";
|
||||
static final String TO_LON = "to_lon";
|
||||
static final String TOLL = "toll";
|
||||
static final String TRACKS = "tracks";
|
||||
static final String TRIAL = "trial";
|
||||
static final String UNPAVED = "unpaved";
|
||||
static final String VENDOR = "vendor";
|
||||
|
||||
private EventParam() {}
|
||||
}
|
||||
|
@ -1734,7 +1736,8 @@ public enum Statistics
|
|||
}
|
||||
|
||||
public void trackPurchasePreviewShow(@NonNull String purchaseId, @NonNull String vendor,
|
||||
@NonNull String productId, @Nullable String from)
|
||||
@NonNull String productId, @Nullable String from,
|
||||
@Nullable Boolean isTrial)
|
||||
{
|
||||
ParameterBuilder params = params().add(VENDOR, vendor)
|
||||
.add(PRODUCT, productId)
|
||||
|
@ -1742,6 +1745,9 @@ public enum Statistics
|
|||
if (!TextUtils.isEmpty(from))
|
||||
params.add(FROM, from);
|
||||
|
||||
if (isTrial != null)
|
||||
params.add(TRIAL, isTrial);
|
||||
|
||||
trackEvent(INAPP_PURCHASE_PREVIEW_SHOW, params,
|
||||
STATISTICS_CHANNEL_REALTIME);
|
||||
}
|
||||
|
@ -1749,7 +1755,7 @@ public enum Statistics
|
|||
public void trackPurchasePreviewShow(@NonNull String purchaseId, @NonNull String vendor,
|
||||
@NonNull String productId)
|
||||
{
|
||||
trackPurchasePreviewShow(purchaseId, vendor, productId, null);
|
||||
trackPurchasePreviewShow(purchaseId, vendor, productId, null, null);
|
||||
}
|
||||
|
||||
public void trackPurchaseEvent(@NonNull String event, @NonNull String purchaseId)
|
||||
|
@ -1765,8 +1771,17 @@ public enum Statistics
|
|||
|
||||
public void trackPurchasePreviewSelect(@NonNull String purchaseId, @NonNull String productId)
|
||||
{
|
||||
trackEvent(INAPP_PURCHASE_PREVIEW_SELECT, params().add(PRODUCT, productId)
|
||||
.add(PURCHASE, purchaseId));
|
||||
trackPurchasePreviewSelect(purchaseId, productId, null);
|
||||
}
|
||||
|
||||
public void trackPurchasePreviewSelect(@NonNull String purchaseId, @NonNull String productId,
|
||||
@Nullable Boolean isTrial)
|
||||
{
|
||||
ParameterBuilder params = params();
|
||||
if (isTrial != null)
|
||||
params.add(TRIAL, isTrial);
|
||||
trackEvent(INAPP_PURCHASE_PREVIEW_SELECT, params.add(PRODUCT, productId)
|
||||
.add(PURCHASE, purchaseId));
|
||||
}
|
||||
|
||||
public void trackPurchaseStoreError(@NonNull String purchaseId,
|
||||
|
@ -1819,8 +1834,17 @@ public enum Statistics
|
|||
|
||||
public void trackPurchaseProductDelivered(@NonNull String purchaseId, @NonNull String vendor)
|
||||
{
|
||||
trackEvent(INAPP_PURCHASE_PRODUCT_DELIVERED, params().add(VENDOR, vendor)
|
||||
.add(PURCHASE, purchaseId),
|
||||
trackPurchaseProductDelivered(purchaseId, vendor, null);
|
||||
}
|
||||
|
||||
public void trackPurchaseProductDelivered(@NonNull String purchaseId, @NonNull String vendor,
|
||||
@Nullable Boolean isTrial)
|
||||
{
|
||||
ParameterBuilder params = params();
|
||||
if (isTrial != null)
|
||||
params.add(TRIAL, isTrial);
|
||||
trackEvent(INAPP_PURCHASE_PRODUCT_DELIVERED, params.add(VENDOR, vendor)
|
||||
.add(PURCHASE, purchaseId),
|
||||
STATISTICS_CHANNEL_REALTIME);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue