Skip to content

Commit

Permalink
Merge pull request #21884 from osmandapp/hmd_promo
Browse files Browse the repository at this point in the history
Add HMD promo
  • Loading branch information
Chumva authored Feb 10, 2025
2 parents c2bc8dd + 1dd9a35 commit f3018bc
Show file tree
Hide file tree
Showing 12 changed files with 144 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ public interface OsmAndCustomizationConstants {
String FRAGMENT_DRAWER_ID = FRAGMENT_ID + "drawer";
String FRAGMENT_TRIPLTEK_PROMO_ID = FRAGMENT_ID + "tripltek_promo";
String FRAGMENT_HUGEROCK_PROMO_ID = FRAGMENT_ID + "hugerock_promo";
String FRAGMENT_HMD_PROMO_ID = FRAGMENT_ID + "hmd_promo";

//Map Context Menu rows:
String MAP_CONTEXT_MENU_ROWS = "context.menu.rows.";
Expand Down
1 change: 1 addition & 0 deletions OsmAnd/res/values/no_translate.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
<string name="app_store_name">OsmAnd Maps</string>

<!-- Not translatable -->
<string name="hmd">HMD</string>
<string name="hugerock">Hugerock</string>
<string name="tripltek">TRIPLTEK</string>
<string name="number_in_breckets">(%d)</string>
Expand Down
2 changes: 2 additions & 0 deletions OsmAnd/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
- For wording and consistency, please note https://docs.osmand.net/docs/technical/contributions/translating-osmand
Thx - Hardy
-->
<string name="hmd_promo">HMD Promo for %1$s months</string>
<string name="hmd_promo_description">Free access to features including unlimited map downloads, 3D relief etc. for %1$s month</string>
<string name="shared_string_road_exit">Exit</string>
<string name="popular_places_nearby">Popular places nearby</string>
<string name="recently_visited">Recently visited</string>
Expand Down
13 changes: 11 additions & 2 deletions OsmAnd/src/net/osmand/plus/Version.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ public class Version {

public static final String TRIPLTEK_NAME = "TRIPLTEK";
public static final String HUGEROCK_NAME = "Hugerock";
public static final String HMD_BRAND_NAME = "HMD";
public static final String HMD_MANUFACTURER_NAME = "HMD Global";
public static final String HMD_MODEL_NAME = "Cupra";

public static final String FULL_VERSION_NAME = "net.osmand.plus";
private static final String FREE_VERSION_NAME = "net.osmand";
private static final String FREE_DEV_VERSION_NAME = "net.osmand.dev";
Expand Down Expand Up @@ -160,8 +164,7 @@ public static boolean isPaidVersion(@NonNull OsmandApplication app) {
|| InAppPurchaseUtils.isLiveUpdatesAvailable(app)
|| InAppPurchaseUtils.isMapsPlusAvailable(app)
|| InAppPurchaseUtils.isOsmAndProAvailable(app)
|| InAppPurchaseUtils.isTripltekPromoAvailable(app)
|| InAppPurchaseUtils.isHugerockPromoAvailable(app);
|| InAppPurchaseUtils.isBrandPromoAvailable(app);
}

public static boolean isDeveloperVersion(@NonNull OsmandApplication app) {
Expand All @@ -181,6 +184,12 @@ public static boolean isHugerockBuild() {
|| "alps".equalsIgnoreCase(Build.BRAND) && "SOTEN".equalsIgnoreCase(Build.MANUFACTURER);
}

public static boolean isHMDBuild() {
return HMD_BRAND_NAME.equalsIgnoreCase(Build.BRAND)
&& HMD_MANUFACTURER_NAME.equalsIgnoreCase(Build.MANUFACTURER)
&& HMD_MODEL_NAME.equalsIgnoreCase(Build.MODEL);
}

public static String getVersionForTracker(@NonNull OsmandApplication app) {
String v = getAppName(app);
if (isProductionVersion(app)) {
Expand Down
4 changes: 4 additions & 0 deletions OsmAnd/src/net/osmand/plus/activities/MapActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
import net.osmand.plus.base.ContextMenuFragment;
import net.osmand.plus.base.MapViewTrackingUtilities;
import net.osmand.plus.chooseplan.ChoosePlanFragment;
import net.osmand.plus.chooseplan.HMDPromoFragment;
import net.osmand.plus.chooseplan.HugerockPromoFragment;
import net.osmand.plus.chooseplan.TripltekPromoFragment;
import net.osmand.plus.configmap.ConfigureMapFragment;
Expand Down Expand Up @@ -594,6 +595,9 @@ protected void onResume() {
} else if (HugerockPromoFragment.shouldShow(app)) {
SecondSplashScreenFragment.SHOW = false;
HugerockPromoFragment.showInstance(fragmentManager);
} else if (HMDPromoFragment.shouldShow(app)) {
SecondSplashScreenFragment.SHOW = false;
HMDPromoFragment.showInstance(fragmentManager);
}
}

Expand Down
62 changes: 62 additions & 0 deletions OsmAnd/src/net/osmand/plus/chooseplan/HMDPromoFragment.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package net.osmand.plus.chooseplan;

import static net.osmand.aidlapi.OsmAndCustomizationConstants.FRAGMENT_HMD_PROMO_ID;
import static net.osmand.plus.chooseplan.OsmAndFeature.*;
import static net.osmand.plus.inapp.InAppPurchaseUtils.HMD_PROMO_MONTHS;

import android.view.View;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentManager;

import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.Version;
import net.osmand.plus.inapp.InAppPurchaseUtils;
import net.osmand.plus.utils.AndroidUtils;

import java.util.Arrays;
import java.util.List;

public class HMDPromoFragment extends PromoCompanyFragment {

public static final String TAG = HMDPromoFragment.class.getSimpleName();

@Override
public void onResume() {
super.onResume();
settings.HMD_PROMO_SHOWED.set(true);
}

@NonNull
@Override
protected List<OsmAndFeature> getFeatures() {
return Arrays.asList(UNLIMITED_MAP_DOWNLOADS, RELIEF_3D, TERRAIN, ANDROID_AUTO, WIKIPEDIA,
WIKIVOYAGE, WEATHER, MONTHLY_MAP_UPDATES, HOURLY_MAP_UPDATES, EXTERNAL_SENSORS_SUPPORT, NAUTICAL);
}

protected void setupContent(@NonNull View view) {
super.setupContent(view);

TextView title = view.findViewById(R.id.title);
TextView description = view.findViewById(R.id.description);

title.setText(getString(R.string.hmd_promo, String.valueOf(HMD_PROMO_MONTHS)));
description.setText(getString(R.string.hmd_promo_description, String.valueOf(HMD_PROMO_MONTHS)));
}

public static boolean shouldShow(@NonNull OsmandApplication app) {
if (Version.isHMDBuild() && app.getAppCustomization().isFeatureEnabled(FRAGMENT_HMD_PROMO_ID)) {
return InAppPurchaseUtils.isHMDPromoAvailable(app) && !app.getSettings().HMD_PROMO_SHOWED.get();
}
return false;
}

public static void showInstance(@NonNull FragmentManager manager) {
if (AndroidUtils.isFragmentCanBeAdded(manager, TAG, true)) {
HMDPromoFragment fragment = new HMDPromoFragment();
fragment.show(manager, TAG);
}
}
}
38 changes: 30 additions & 8 deletions OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

public class InAppPurchaseUtils {

public static final int HMD_PROMO_MONTHS = 6;
public static final int HUGEROCK_PROMO_MONTHS = 6;
public static final int TRIPLTEK_PROMO_MONTHS = 12;
private static final long ANDROID_AUTO_START_DATE_MS = 10L * 1000L * 60L * 60L * 24L; // 10 days
Expand Down Expand Up @@ -87,17 +88,15 @@ public static boolean isSubscribedToAny(@NonNull OsmandApplication app, boolean
|| isOsmAndProAvailable(app, checkDevBuild)
|| isMapperUpdatesSubscribed(app)
|| isLiveUpdatesPurchased(app)
|| isTripltekPromoAvailable(app)
|| isHugerockPromoAvailable(app);
|| isBrandPromoAvailable(app);
}

public static boolean isLiveUpdatesAvailable(@NonNull OsmandApplication app) {
return isLiveUpdatesPurchased(app)
|| isOsmAndProAvailable(app)
|| isMapperUpdatesSubscribed(app)
|| checkDeveloperBuildIfNeeded(app, true)
|| isHugerockPromoAvailable(app)
|| isTripltekPromoAvailable(app);
|| isBrandPromoAvailable(app);
}

public static boolean isWidgetPurchased(@NonNull OsmandApplication app, @NonNull WidgetType wt) {
Expand All @@ -112,11 +111,11 @@ public static boolean isVehicleMetricsAvailable(@NonNull OsmandApplication app)
}

public static boolean isProWidgetsAvailable(@NonNull OsmandApplication app) {
return isOsmAndProAvailable(app) || isTripltekPromoAvailable(app) || isHugerockPromoAvailable(app);
return isOsmAndProAvailable(app) || isBrandPromoAvailable(app);
}

public static boolean is3dMapsAvailable(@NonNull OsmandApplication app) {
return isOsmAndProAvailable(app) || isTripltekPromoAvailable(app) || isHugerockPromoAvailable(app);
return isOsmAndProAvailable(app) || isBrandPromoAvailable(app);
}

public static boolean isExportTypeAvailable(@NonNull OsmandApplication app,
Expand All @@ -129,11 +128,15 @@ public static boolean isBackupAvailable(@NonNull OsmandApplication app) {
}

public static boolean isWeatherAvailable(@NonNull OsmandApplication app) {
return isOsmAndProAvailable(app) || isTripltekPromoAvailable(app) || isHugerockPromoAvailable(app);
return isOsmAndProAvailable(app) || isBrandPromoAvailable(app);
}

public static boolean isColoringTypeAvailable(@NonNull OsmandApplication app) {
return isOsmAndProAvailable(app) || isTripltekPromoAvailable(app) || isHugerockPromoAvailable(app);
return isOsmAndProAvailable(app) || isBrandPromoAvailable(app);
}

public static boolean isBrandPromoAvailable(@NonNull OsmandApplication app) {
return isTripltekPromoAvailable(app) || isHugerockPromoAvailable(app) || isHMDPromoAvailable(app);
}

public static boolean isDepthContoursAvailable(@NonNull OsmandApplication app) {
Expand Down Expand Up @@ -192,4 +195,23 @@ public static long getHugerockPromoExpirationTime(@NonNull OsmandApplication app
}
return 0;
}

public static boolean isHMDPromoAvailable(@NonNull OsmandApplication app) {
if (Version.isHMDBuild()) {
long expirationTime = getHMDPromoExpirationTime(app);
return expirationTime >= System.currentTimeMillis();
}
return false;
}

public static long getHMDPromoExpirationTime(@NonNull OsmandApplication app) {
if (Version.isHMDBuild()) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(Version.getInstallTime(app));
calendar.add(Calendar.MONTH, HMD_PROMO_MONTHS);

return calendar.getTimeInMillis();
}
return 0;
}
}
3 changes: 2 additions & 1 deletion OsmAnd/src/net/osmand/plus/inapp/InAppPurchases.java
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,8 @@ public enum PurchaseOrigin {
IOS(R.string.apple_app_store),
PROMO(R.string.promo),
TRIPLTEK_PROMO(R.string.tripltek),
HUGEROCK_PROMO(R.string.hugerock);
HUGEROCK_PROMO(R.string.hugerock),
HMD_PROMO(R.string.hmd);

private final int storeNameId;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3320,6 +3320,7 @@ public Set<String> getCustomAppModesKeys() {

public final OsmandPreference<Boolean> TRIPLTEK_PROMO_SHOWED = new BooleanPreference(this, "tripltek_promo_showed", false).makeGlobal().makeShared();
public final OsmandPreference<Boolean> HUGEROCK_PROMO_SHOWED = new BooleanPreference(this, "hugerock_promo_showed", false).makeGlobal().makeShared();
public final OsmandPreference<Boolean> HMD_PROMO_SHOWED = new BooleanPreference(this, "hmd_promo_showed", false).makeGlobal().makeShared();
public final CommonPreference<Integer> CONTEXT_GALLERY_SPAN_GRID_COUNT = new IntPreference(this, "context_gallery_span_grid_count", 3).makeProfile();
public final CommonPreference<Integer> CONTEXT_GALLERY_SPAN_GRID_COUNT_LANDSCAPE = new IntPreference(this, "context_gallery_span_grid_count_landscape", 7).makeProfile();
}
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@ private void initRefreshableData() {
purchase = PurchaseUiDataUtils.createTripltekPurchaseUiData(app);
} else if (CollectionUtils.startsWithAny(promoType, app.getString(R.string.hugerock))) {
purchase = PurchaseUiDataUtils.createHugerockPurchaseUiData(app);
} else if (CollectionUtils.startsWithAny(promoType, app.getString(R.string.hmd))) {
purchase = PurchaseUiDataUtils.createHMDPurchaseUiData(app);
} else {
purchase = PurchaseUiDataUtils.createBackupSubscriptionUiData(app);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,20 @@ private void updateCards() {
cardsContainer.addView(purchaseCard.build(activity));
}

setupPromoCard(activity);

boolean hasMainPurchases = !Algorithms.isEmpty(mainPurchases);
if (!needToShowFreeAccountSubscriptionCard && (!Version.isPaidVersion(app) || (!hasMainPurchases && !showBackupSubscription))) {
themedInflater.inflate(R.layout.list_item_divider, cardsContainer);
cardsContainer.addView(new NoPurchasesCard(activity, this).build(activity));
} else {
themedInflater.inflate(R.layout.list_item_divider, cardsContainer);
cardsContainer.addView(new ExploreOsmAndPlansCard(activity, this).build(activity));
}
cardsContainer.addView(new TroubleshootingCard(activity, purchaseHelper, false).build(activity));
}

private void setupPromoCard(@NonNull FragmentActivity activity) {
if (Version.isTripltekBuild()) {
themedInflater.inflate(R.layout.list_item_divider, cardsContainer);
PurchaseUiData purchase = PurchaseUiDataUtils.createTripltekPurchaseUiData(app);
Expand All @@ -109,17 +123,13 @@ private void updateCards() {
PurchaseItemCard purchaseCard = new PurchaseItemCard(activity, purchaseHelper, purchase);
purchaseCard.setListener(PurchasesFragment.this);
cardsContainer.addView(purchaseCard.build(activity));
}

boolean hasMainPurchases = !Algorithms.isEmpty(mainPurchases);
if (!needToShowFreeAccountSubscriptionCard && (!Version.isPaidVersion(app) || (!hasMainPurchases && !showBackupSubscription))) {
themedInflater.inflate(R.layout.list_item_divider, cardsContainer);
cardsContainer.addView(new NoPurchasesCard(activity, this).build(activity));
} else {
} else if (Version.isHMDBuild()) {
themedInflater.inflate(R.layout.list_item_divider, cardsContainer);
cardsContainer.addView(new ExploreOsmAndPlansCard(activity, this).build(activity));
PurchaseUiData purchase = PurchaseUiDataUtils.createHMDPurchaseUiData(app);
PurchaseItemCard purchaseCard = new PurchaseItemCard(activity, purchaseHelper, purchase);
purchaseCard.setListener(PurchasesFragment.this);
cardsContainer.addView(purchaseCard.build(activity));
}
cardsContainer.addView(new TroubleshootingCard(activity, purchaseHelper, false).build(activity));
}

@Nullable
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package net.osmand.plus.settings.purchase.data;

import static net.osmand.plus.inapp.InAppPurchases.InAppPurchase.PurchaseOrigin.HMD_PROMO;
import static net.osmand.plus.inapp.InAppPurchases.InAppPurchase.PurchaseOrigin.HUGEROCK_PROMO;
import static net.osmand.plus.inapp.InAppPurchases.InAppPurchase.PurchaseOrigin.PROMO;
import static net.osmand.plus.inapp.InAppPurchases.InAppPurchase.PurchaseOrigin.TRIPLTEK_PROMO;
Expand Down Expand Up @@ -197,6 +198,14 @@ public static PurchaseUiData createHugerockPurchaseUiData(@NonNull OsmandApplica
return createPromoUiData(app, HUGEROCK_PROMO, state, expireTime);
}

@NonNull
public static PurchaseUiData createHMDPurchaseUiData(@NonNull OsmandApplication app) {
long expireTime = InAppPurchaseUtils.getHMDPromoExpirationTime(app);
SubscriptionState state = InAppPurchaseUtils.isHMDPromoAvailable(app) ? ACTIVE : EXPIRED;

return createPromoUiData(app, HMD_PROMO, state, expireTime);
}

@NonNull
public static PurchaseUiData createPromoUiData(@NonNull OsmandApplication app, @NonNull PurchaseOrigin origin,
@NonNull SubscriptionState state, long expireTime) {
Expand Down

0 comments on commit f3018bc

Please sign in to comment.