Improve android ent app syncing flow

revert-dabc3590
lasanthaDLPDS 5 years ago
parent c5c4e0a5b9
commit eb2156c54e

@ -70,6 +70,8 @@ public final class AndroidConstants {
public static final String USER_CLAIM_FIRST_NAME_PLACEHOLDER = "$firstName"; public static final String USER_CLAIM_FIRST_NAME_PLACEHOLDER = "$firstName";
public static final String USER_CLAIM_LAST_NAME_PLACEHOLDER = "$lastName"; public static final String USER_CLAIM_LAST_NAME_PLACEHOLDER = "$lastName";
public static final String GOOGLE_PLAY_SYNCED_APP_CATEGORY = "GooglePlaySyncedApp";
public final class DeviceProperties { public final class DeviceProperties {
private DeviceProperties() { private DeviceProperties() {
throw new AssertionError(); throw new AssertionError();
@ -186,6 +188,8 @@ public final class AndroidConstants {
public static final String VERSION = "version"; public static final String VERSION = "version";
public static final String ICON = "icon"; public static final String ICON = "icon";
public static final String IS_ACTIVE = "isActive"; public static final String IS_ACTIVE = "isActive";
public static final String FREE_SUB_METHOD = "FREE";
public static final String PAID_SUB_METHOD = "PAID";
} }
public final class ApplicationInstall { public final class ApplicationInstall {

@ -30,6 +30,7 @@ import com.google.api.services.androidenterprise.model.ProductPolicy;
import com.google.api.services.androidenterprise.model.ProductsListResponse; import com.google.api.services.androidenterprise.model.ProductsListResponse;
import com.google.api.services.androidenterprise.model.VariableSet; import com.google.api.services.androidenterprise.model.VariableSet;
import com.google.common.collect.ImmutableList;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
@ -38,12 +39,14 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.device.application.mgt.common.ApplicationArtifact; import org.wso2.carbon.device.application.mgt.common.ApplicationArtifact;
import org.wso2.carbon.device.application.mgt.common.Filter;
import org.wso2.carbon.device.application.mgt.common.LifecycleChanger; import org.wso2.carbon.device.application.mgt.common.LifecycleChanger;
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
import org.wso2.carbon.device.application.mgt.common.response.Application; import org.wso2.carbon.device.application.mgt.common.response.Application;
import org.wso2.carbon.device.application.mgt.common.response.Category; import org.wso2.carbon.device.application.mgt.common.response.Category;
import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager;
import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager;
import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationUpdateWrapper;
import org.wso2.carbon.device.application.mgt.common.wrapper.PublicAppReleaseWrapper; import org.wso2.carbon.device.application.mgt.common.wrapper.PublicAppReleaseWrapper;
import org.wso2.carbon.device.application.mgt.common.wrapper.PublicAppWrapper; import org.wso2.carbon.device.application.mgt.common.wrapper.PublicAppWrapper;
import org.wso2.carbon.device.mgt.common.DeviceManagementConstants; import org.wso2.carbon.device.mgt.common.DeviceManagementConstants;
@ -76,9 +79,11 @@ import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel; import java.nio.channels.ReadableByteChannel;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
public class AndroidEnterpriseUtils { public class AndroidEnterpriseUtils {
@ -277,54 +282,174 @@ public class AndroidEnterpriseUtils {
ApplicationManager applicationManager = getAppManagerServer(); ApplicationManager applicationManager = getAppManagerServer();
List<Category> categories = applicationManager.getRegisteredCategories(); List<Category> categories = applicationManager.getRegisteredCategories();
if (productListResponse != null && productListResponse.getProduct() != null if (productListResponse != null && productListResponse.getProduct() != null
&& productListResponse.getProduct().size() > 0) { && !productListResponse.getProduct().isEmpty()) {
for (Product product : productListResponse.getProduct()) { List<String> packageNamesOfApps = productListResponse.getProduct().stream()
.map(product -> (product.getProductId().replaceFirst("app:", ""))).collect(Collectors.toList());
List<Application> existingApps = applicationManager.getApplications(packageNamesOfApps);
List<Product> products = productListResponse.getProduct();
for (Application app : existingApps){
for (Product product : products){
if (product.getProductId().replaceFirst("app:", "").equals(app.getPackageName())){
ApplicationUpdateWrapper applicationUpdateWrapper = generatePubAppUpdateWrapper(product, categories);
applicationManager.updateApplication(app.getId(), applicationUpdateWrapper);
PublicAppReleaseWrapper publicAppReleaseWrapper = new PublicAppReleaseWrapper();
if (app.getSubMethod()
.equalsIgnoreCase(AndroidConstants.ApplicationProperties.FREE_SUB_METHOD)) {
publicAppReleaseWrapper.setPrice(0.0);
} else {
publicAppReleaseWrapper.setPrice(1.0);
}
publicAppReleaseWrapper.setDescription(product.getRecentChanges());
publicAppReleaseWrapper.setReleaseType("ga");
publicAppReleaseWrapper.setVersion(getAppString(product.getAppVersion()));
publicAppReleaseWrapper
.setSupportedOsVersions(String.valueOf(product.getMinAndroidSdkVersion()) + "-ALL");
ApplicationArtifact applicationArtifact = generateArtifacts(product);
applicationManager.updatePubAppRelease(app.getApplicationReleases().get(0).getUuid(),
publicAppReleaseWrapper, applicationArtifact);
products.remove(product);
break;
}
}
}
for (Product product : products) {
if (product.getAppVersion() == null) { // This is to handled removed apps from playstore if (product.getAppVersion() == null) { // This is to handled removed apps from playstore
continue; continue;
} }
// Generate App wrapper // Generate App wrapper
PublicAppWrapper publicAppWrapper = new PublicAppWrapper(); PublicAppWrapper publicAppWrapper = generatePubAppWrapper(product, categories);
PublicAppReleaseWrapper appReleaseWrapper = new PublicAppReleaseWrapper(); PublicAppReleaseWrapper appReleaseWrapper = new PublicAppReleaseWrapper();
if (publicAppWrapper.getSubMethod()
.equalsIgnoreCase(AndroidConstants.ApplicationProperties.FREE_SUB_METHOD)) {
appReleaseWrapper.setPrice(0.0);
} else {
appReleaseWrapper.setPrice(1.0);
}
appReleaseWrapper.setDescription(product.getRecentChanges());
appReleaseWrapper.setReleaseType("ga");
appReleaseWrapper.setVersion(getAppString(product.getAppVersion()));
appReleaseWrapper.setPackageName(product.getProductId().replaceFirst("app:", ""));
appReleaseWrapper.setSupportedOsVersions(String.valueOf(product.getMinAndroidSdkVersion()) + "-ALL");
publicAppWrapper.setPublicAppReleaseWrappers(
Arrays.asList(new PublicAppReleaseWrapper[] { appReleaseWrapper }));
// Generate artifacts
ApplicationArtifact applicationArtifact = generateArtifacts(product);
Application application = applicationManager.createPublicApp(publicAppWrapper, applicationArtifact);
if (application != null && (application.getApplicationReleases().get(0).getCurrentStatus() == null
|| application.getApplicationReleases().get(0).getCurrentStatus().equals("CREATED"))) {
String uuid = application.getApplicationReleases().get(0).getUuid();
LifecycleChanger lifecycleChanger = new LifecycleChanger();
lifecycleChanger.setAction("IN-REVIEW");
applicationManager.changeLifecycleState(uuid, lifecycleChanger);
lifecycleChanger.setAction("APPROVED");
applicationManager.changeLifecycleState(uuid, lifecycleChanger);
lifecycleChanger.setAction("PUBLISHED");
applicationManager.changeLifecycleState(uuid, lifecycleChanger);
}
}
}
}
/**
* To generate {@link ApplicationUpdateWrapper}
*
* @param product {@link Product}
* @param categories List of categories registered with app manager
* @return {@link ApplicationUpdateWrapper}
*/
private static ApplicationUpdateWrapper generatePubAppUpdateWrapper(Product product, List<Category> categories) {
ApplicationUpdateWrapper applicationUpdateWrapper = new ApplicationUpdateWrapper();
applicationUpdateWrapper.setName(product.getTitle());
applicationUpdateWrapper.setDescription(product.getDescription());
applicationUpdateWrapper.setCategories(
Collections.singletonList(AndroidConstants.GOOGLE_PLAY_SYNCED_APP_CATEGORY));//Default category
for (Category category : categories) {
if (product.getCategory() == null) {
List<String> pubAppCategories = new ArrayList<>();
pubAppCategories.add(AndroidConstants.GOOGLE_PLAY_SYNCED_APP_CATEGORY);
applicationUpdateWrapper.setCategories(pubAppCategories);
break;
} else if (product.getCategory().equalsIgnoreCase(category.getCategoryName())) {
List<String> pubAppCategories = new ArrayList<>();
pubAppCategories.add(category.getCategoryName());
pubAppCategories.add(AndroidConstants.GOOGLE_PLAY_SYNCED_APP_CATEGORY);
applicationUpdateWrapper.setCategories(pubAppCategories);
break;
}
}
if (product.getProductPricing().equalsIgnoreCase(AndroidConstants.ApplicationProperties.FREE_SUB_METHOD)) {
applicationUpdateWrapper.setSubMethod(AndroidConstants.ApplicationProperties.FREE_SUB_METHOD);
} else {
applicationUpdateWrapper.setSubMethod(AndroidConstants.ApplicationProperties.PAID_SUB_METHOD);
}
// TODO: purchase an app from Playstore and see how to capture the real value for price field.
applicationUpdateWrapper.setPaymentCurrency("$");
return applicationUpdateWrapper;
}
/**
* To generate {@link PublicAppWrapper}
*
* @param product {@link Product}
* @param categories List of categories registered with app manager
* @return {@link PublicAppWrapper}
*/
private static PublicAppWrapper generatePubAppWrapper(Product product, List<Category> categories) {
PublicAppWrapper publicAppWrapper = new PublicAppWrapper();
publicAppWrapper.setName(product.getTitle()); publicAppWrapper.setName(product.getTitle());
publicAppWrapper.setDescription(product.getDescription()); publicAppWrapper.setDescription(product.getDescription());
publicAppWrapper.setCategories(Arrays.asList(new String[]{"GooglePlaySyncedApp"}));//Default category publicAppWrapper.setCategories(
Collections.singletonList(AndroidConstants.GOOGLE_PLAY_SYNCED_APP_CATEGORY));//Default category
for (Category category : categories) { for (Category category : categories) {
if (product.getCategory() == null) { if (product.getCategory() == null) {
publicAppWrapper.setCategories(Arrays.asList(new String[]{"GooglePlaySyncedApp"})); List<String> pubAppCategories = new ArrayList<>();
pubAppCategories.add(AndroidConstants.GOOGLE_PLAY_SYNCED_APP_CATEGORY);
publicAppWrapper.setCategories(pubAppCategories);
break; break;
} else if (product.getCategory().equalsIgnoreCase(category.getCategoryName())) { } else if (product.getCategory().equalsIgnoreCase(category.getCategoryName())) {
publicAppWrapper.setCategories(Arrays.asList(new String[]{category.getCategoryName(), "GooglePlaySyncedApp"})); List<String> pubAppCategories = new ArrayList<>();
pubAppCategories.add(category.getCategoryName());
pubAppCategories.add(AndroidConstants.GOOGLE_PLAY_SYNCED_APP_CATEGORY);
publicAppWrapper.setCategories(pubAppCategories);
break; break;
} }
} }
if (product.getProductPricing().equalsIgnoreCase("free")) { if (product.getProductPricing().equalsIgnoreCase(AndroidConstants.ApplicationProperties.FREE_SUB_METHOD)) {
publicAppWrapper.setSubMethod("FREE"); publicAppWrapper.setSubMethod(AndroidConstants.ApplicationProperties.FREE_SUB_METHOD);
} else { } else {
publicAppWrapper.setSubMethod("PAID"); publicAppWrapper.setSubMethod(AndroidConstants.ApplicationProperties.PAID_SUB_METHOD);
} }
// TODO: purchase an app from Playstore and see how to capture the real value for price field. // TODO: purchase an app from Playstore and see how to capture the real value for price field.
publicAppWrapper.setPaymentCurrency("$"); publicAppWrapper.setPaymentCurrency("$");
appReleaseWrapper.setPrice(1.0);
publicAppWrapper.setDeviceType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); publicAppWrapper.setDeviceType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID);
appReleaseWrapper.setDescription(product.getRecentChanges()); return publicAppWrapper;
appReleaseWrapper.setReleaseType("ga"); }
appReleaseWrapper.setVersion(getAppString(product.getAppVersion()));
appReleaseWrapper.setPackageName(product.getProductId().replaceFirst("app:", ""));
appReleaseWrapper.setSupportedOsVersions(String.valueOf(product.getMinAndroidSdkVersion()) + "-ALL");
publicAppWrapper.setPublicAppReleaseWrappers(Arrays.asList(new PublicAppReleaseWrapper[]{appReleaseWrapper}));
// Generate artifacts /**
* To generate {@link ApplicationArtifact}
*
* @param product {@link Product}
* @return {@link ApplicationArtifact}
* @throws ApplicationManagementException if I/O exception occurred while generating application artifact.
*/
private static ApplicationArtifact generateArtifacts(Product product) throws ApplicationManagementException {
ApplicationArtifact applicationArtifact = new ApplicationArtifact(); ApplicationArtifact applicationArtifact = new ApplicationArtifact();
try {
String iconName = product.getIconUrl().split(".com/")[1]; String iconName = product.getIconUrl().split(".com/")[1];
applicationArtifact.setIconName(iconName); applicationArtifact.setIconName(iconName);
InputStream iconInputStream = getInputStream(iconName, product.getIconUrl()); InputStream iconInputStream = getInputStream(iconName, product.getIconUrl());
applicationArtifact.setIconStream(iconInputStream); applicationArtifact.setIconStream(iconInputStream);
Map<String, InputStream> screenshotMap = new HashMap<>(); Map<String, InputStream> screenshotMap = new HashMap<>();
@ -334,7 +459,6 @@ public class AndroidEnterpriseUtils {
if (product.getScreenshotUrls().size() < 3) { if (product.getScreenshotUrls().size() < 3) {
numberOfScreenShots = product.getScreenshotUrls().size(); numberOfScreenShots = product.getScreenshotUrls().size();
} }
for (int y = 1; y < 4; y++) { for (int y = 1; y < 4; y++) {
int screenshotNumber = y - 1; int screenshotNumber = y - 1;
if (y > numberOfScreenShots) { if (y > numberOfScreenShots) {
@ -353,23 +477,12 @@ public class AndroidEnterpriseUtils {
screenshotMap.put(screenshotName, screenshotInputStream); screenshotMap.put(screenshotName, screenshotInputStream);
} }
} }
applicationArtifact.setScreenshots(screenshotMap); applicationArtifact.setScreenshots(screenshotMap);
return applicationArtifact;
} catch (ApplicationManagementException e) {
Application application = applicationManager.createPublicApp(publicAppWrapper, applicationArtifact); String msg = "Error occurred while generating Application artifact";
if (application != null && (application.getApplicationReleases().get(0).getCurrentStatus() == null log.error(msg);
|| application.getApplicationReleases().get(0).getCurrentStatus().equals("CREATED"))) { throw new ApplicationManagementException(msg, e);
String uuid = application.getApplicationReleases().get(0).getUuid();
LifecycleChanger lifecycleChanger = new LifecycleChanger();
lifecycleChanger.setAction("IN-REVIEW");
applicationManager.changeLifecycleState(uuid, lifecycleChanger);
lifecycleChanger.setAction("APPROVED");
applicationManager.changeLifecycleState(uuid, lifecycleChanger);
lifecycleChanger.setAction("PUBLISHED");
applicationManager.changeLifecycleState(uuid, lifecycleChanger);
}
}
} }
} }

Loading…
Cancel
Save