diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/pom.xml b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/pom.xml index 589cbba98..74529af69 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/pom.xml +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/pom.xml @@ -251,7 +251,6 @@ com.google.apis google-api-services-androidenterprise - v1-rev186-1.25.0 guava @@ -318,6 +317,12 @@ org.wso2.carbon.devicemgt-plugins org.wso2.carbon.device.mgt.mobile.android.common provided + + + google-api-services-androidenterprise + com.google.apis + + org.wso2.carbon.devicemgt-plugins diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/device/mgt/mobile/android/api/impl/AndroidEnterpriseAPIImpl.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/device/mgt/mobile/android/api/impl/AndroidEnterpriseAPIImpl.java index 23bbfa553..35c8589b3 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/device/mgt/mobile/android/api/impl/AndroidEnterpriseAPIImpl.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/device/mgt/mobile/android/api/impl/AndroidEnterpriseAPIImpl.java @@ -43,7 +43,6 @@ import org.wso2.carbon.device.mgt.common.policy.mgt.ProfileFeature; import org.wso2.carbon.device.mgt.core.operation.mgt.CommandOperation; import org.wso2.carbon.device.mgt.mobile.android.api.AndroidEnterpriseAPI; import org.wso2.carbon.device.mgt.mobile.android.common.AndroidConstants; -import org.wso2.carbon.device.mgt.mobile.android.common.GoogleAPIInvoker; import org.wso2.carbon.device.mgt.mobile.android.common.bean.EnterpriseConfigs; import org.wso2.carbon.device.mgt.mobile.android.common.bean.EnterpriseStoreCluster; import org.wso2.carbon.device.mgt.mobile.android.common.bean.EnterpriseStorePackages; @@ -65,6 +64,7 @@ import org.wso2.carbon.device.mgt.mobile.android.common.exception.UnexpectedServ import org.wso2.carbon.device.mgt.mobile.android.core.util.AndroidAPIUtils; import org.wso2.carbon.device.mgt.mobile.android.core.util.AndroidDeviceUtils; import org.wso2.carbon.device.mgt.mobile.android.core.util.AndroidEnterpriseUtils; +import org.wso2.carbon.device.mgt.mobile.android.api.invoker.GoogleAPIInvoker; import org.wso2.carbon.policy.mgt.common.FeatureManagementException; import javax.ws.rs.Consumes; @@ -146,7 +146,7 @@ public class AndroidEnterpriseAPIImpl implements AndroidEnterpriseAPI { List androidEnterpriseUsers = AndroidAPIUtils.getAndroidPluginService() .getEnterpriseUser(CarbonContext.getThreadLocalCarbonContext().getUsername()); GoogleAPIInvoker googleAPIInvoker = new GoogleAPIInvoker(enterpriseConfigs.getEsa()); - if (androidEnterpriseUsers != null && androidEnterpriseUsers.size() > 0) { + if (androidEnterpriseUsers != null && !androidEnterpriseUsers.isEmpty()) { googleUserId = androidEnterpriseUsers.get(0).getGoogleUserId(); // If this device is also present, only need to provide a token for this request. for (AndroidEnterpriseUser enterprise : androidEnterpriseUsers) { diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/device/mgt/mobile/android/api/impl/DeviceManagementAPIImpl.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/device/mgt/mobile/android/api/impl/DeviceManagementAPIImpl.java index bccd9a4ce..68d94fa64 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/device/mgt/mobile/android/api/impl/DeviceManagementAPIImpl.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/device/mgt/mobile/android/api/impl/DeviceManagementAPIImpl.java @@ -35,22 +35,39 @@ package org.wso2.carbon.device.mgt.mobile.android.api.impl; import com.google.api.client.http.HttpStatusCodes; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.context.CarbonContext; +import org.wso2.carbon.device.application.mgt.common.SubAction; +import org.wso2.carbon.device.application.mgt.common.SubscriptionType; +import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManagementException; import org.wso2.carbon.device.mgt.common.exceptions.DeviceManagementException; import org.wso2.carbon.device.mgt.common.exceptions.InvalidDeviceException; import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; +import org.wso2.carbon.device.mgt.core.operation.mgt.ProfileOperation; import org.wso2.carbon.device.mgt.mobile.android.api.DeviceManagementAPI; +import org.wso2.carbon.device.mgt.mobile.android.api.invoker.GoogleAPIInvoker; +import org.wso2.carbon.device.mgt.mobile.android.common.AndroidConstants; +import org.wso2.carbon.device.mgt.mobile.android.common.AndroidPluginConstants; import org.wso2.carbon.device.mgt.mobile.android.common.Message; +import org.wso2.carbon.device.mgt.mobile.android.common.bean.EnterpriseConfigs; import org.wso2.carbon.device.mgt.mobile.android.common.bean.ErrorResponse; import org.wso2.carbon.device.mgt.mobile.android.common.bean.wrapper.AndroidApplication; import org.wso2.carbon.device.mgt.mobile.android.common.bean.wrapper.AndroidDevice; +import org.wso2.carbon.device.mgt.mobile.android.common.bean.wrapper.EnterpriseApp; +import org.wso2.carbon.device.mgt.mobile.android.common.bean.wrapper.EnterpriseInstallPolicy; +import org.wso2.carbon.device.mgt.mobile.android.common.bean.wrapper.EnterpriseUser; +import org.wso2.carbon.device.mgt.mobile.android.common.dto.AndroidEnterpriseUser; import org.wso2.carbon.device.mgt.mobile.android.common.exception.*; import org.wso2.carbon.device.mgt.mobile.android.common.spi.AndroidService; import org.wso2.carbon.device.mgt.mobile.android.core.util.AndroidAPIUtils; import org.wso2.carbon.device.mgt.mobile.android.core.util.AndroidDeviceUtils; +import org.wso2.carbon.device.mgt.mobile.android.core.util.AndroidEnterpriseUtils; import javax.validation.Valid; import javax.validation.constraints.NotNull; @@ -68,6 +85,8 @@ import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; @Path("/devices") @@ -112,8 +131,12 @@ public class DeviceManagementAPIImpl implements DeviceManagementAPI { } try { AndroidService androidService = AndroidAPIUtils.getAndroidService(); + DeviceIdentifier deviceIdentifier = AndroidDeviceUtils.convertToDeviceIdentifierObject(id); List pendingOperations = androidService - .getPendingOperations(id, resultOperations, disableGoogleApps); + .getPendingOperations(deviceIdentifier, resultOperations); + if (pendingOperations != null && !disableGoogleApps) { + handleEnrollmentGoogleApps(pendingOperations, deviceIdentifier); + } return Response.status(Response.Status.CREATED).entity(pendingOperations).build(); } catch (InvalidDeviceException e) { String msg = "Device identifier is invalid. Device identifier " + id; @@ -146,7 +169,33 @@ public class DeviceManagementAPIImpl implements DeviceManagementAPI { } try { AndroidService androidService = AndroidAPIUtils.getAndroidService(); + String token = null; + String googleEMMAndroidId = null; + String googleEMMDeviceId = null; + if (androidDevice.getProperties() != null) { + for (Device.Property property : androidDevice.getProperties()) { + if (property.getName().equals(AndroidPluginConstants.GOOGLE_AFW_EMM_ANDROID_ID)) { + googleEMMAndroidId = property.getValue(); + } else if (property.getName().equals(AndroidPluginConstants.GOOGLE_AFW_DEVICE_ID)) { + googleEMMDeviceId = property.getValue(); + } + } + if (googleEMMAndroidId != null && googleEMMDeviceId != null) { + EnterpriseUser user = new EnterpriseUser(); + user.setAndroidPlayDeviceId(googleEMMAndroidId); + user.setEmmDeviceIdentifier(googleEMMDeviceId); + try { + AndroidEnterpriseAPIImpl enterpriseService = new AndroidEnterpriseAPIImpl(); + token = enterpriseService.insertUser(user); + } catch (EnterpriseServiceException e) { + //todo + } + } + } Message message = androidService.enrollDevice(androidDevice); + if (token != null) { + message.setResponseMessage("Google response token" + token); + } return Response.status(Integer.parseInt(message.getResponseCode())) .entity(message.getResponseMessage()).build(); } catch (DeviceManagementException e) { @@ -258,5 +307,96 @@ public class DeviceManagementAPIImpl implements DeviceManagementAPI { } } + private void handleEnrollmentGoogleApps(List operations, DeviceIdentifier + deviceIdentifier) { + boolean containsGoogleAppPolicy = false; + for (int x = 0; x < operations.size() && !containsGoogleAppPolicy; x++) { + Operation operation = operations.get(x); + + // Check if the operation has a policy bundle inside. + if (operation.getCode().equals(AndroidConstants.OperationCodes.POLICY_BUNDLE)) { + ArrayList operationPayLoad = (ArrayList) operation.getPayLoad(); + + + // If there is a policy bundle, read its payload + for (int i = 0; i < operationPayLoad.size() && !containsGoogleAppPolicy; i++) { + Object policy = operationPayLoad.get(i); + ProfileOperation profileOperation = (ProfileOperation) policy; + String code = profileOperation.getCode(); + + // Find if there is an ENROLLMENT_APP_INSTALL payload + if (code.equals(AndroidConstants.ApplicationInstall.ENROLLMENT_APP_INSTALL_FEATURE_CODE)) { + String payload = profileOperation.getPayLoad().toString(); + JsonElement appListElement = new JsonParser().parse(payload).getAsJsonObject() + .get(AndroidConstants.ApplicationInstall.ENROLLMENT_APP_INSTALL_CODE); + JsonArray appListArray = appListElement.getAsJsonArray(); + + // Find if there are Apps with Work profile configurations + boolean alreadySendToGoogle = false; + for (JsonElement appElement : appListArray) { + JsonElement googlePolicyPayload = appElement.getAsJsonObject(). + get(AndroidConstants.ApplicationInstall.GOOGLE_POLICY_PAYLOAD); + if (googlePolicyPayload != null) { + String uuid = appElement.getAsJsonObject().get("uuid").toString(); + containsGoogleAppPolicy = true;// breaking out of outer for loop + try { + uuid = uuid.replace("\"", ""); + if (alreadySendToGoogle) { + sendPayloadToGoogle(uuid, payload, deviceIdentifier, false); + } else { + sendPayloadToGoogle(uuid, payload, deviceIdentifier, true); + alreadySendToGoogle = true; + } + } catch (org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException e) { + String errorMessage = "App install failed for device " + deviceIdentifier.getId(); + log.error(errorMessage, e); + } + } + } + + } + } + } + } + } + + /** + * Sends the app install policy to Google + * @param payload policy profile + * @param deviceIdentifier device to apply policy + */ + private void sendPayloadToGoogle(String uuid, String payload, DeviceIdentifier deviceIdentifier, + boolean requireSendingToGoogle) throws + org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException { + try { + EnterpriseConfigs enterpriseConfigs = AndroidEnterpriseUtils.getEnterpriseConfigsFromGoogle(); + if (enterpriseConfigs.getErrorResponse() == null) { + GoogleAPIInvoker googleAPIInvoker = new GoogleAPIInvoker(enterpriseConfigs.getEsa()); + AndroidEnterpriseUser userDetail = AndroidAPIUtils.getAndroidPluginService() + .getEnterpriseUserByDevice(deviceIdentifier.getId()); + if (userDetail != null && userDetail.getEnterpriseId() != null && !userDetail.getEnterpriseId() + .isEmpty() && userDetail.getEmmUsername() != null && payload != null) { + EnterpriseInstallPolicy enterpriseInstallPolicy = AndroidEnterpriseUtils + .getDeviceAppPolicy(payload, null, userDetail); + List apps = new ArrayList<>(); + for (EnterpriseApp enterpriseApp : enterpriseInstallPolicy.getApps()) { + apps.add(enterpriseApp.getProductId()); + } + if (requireSendingToGoogle) { + googleAPIInvoker.approveAppsForUser(enterpriseConfigs.getEnterpriseId(), userDetail + .getGoogleUserId(), apps, enterpriseInstallPolicy.getProductSetBehavior()); + googleAPIInvoker.updateAppsForUser(enterpriseConfigs.getEnterpriseId(), userDetail.getGoogleUserId(), + AndroidEnterpriseUtils.convertToDeviceInstance(enterpriseInstallPolicy)); + } + AndroidEnterpriseUtils.getAppSubscriptionService().performEntAppSubscription(uuid, + Arrays.asList(CarbonContext.getThreadLocalCarbonContext().getUsername()), + SubscriptionType.USER.toString(), SubAction.INSTALL.toString(), false); + } + } + } catch (EnterpriseServiceException e) { + String errorMessage = "App install failed for device " + deviceIdentifier.getId(); + log.error(errorMessage); + } + } } diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.common/src/main/java/org/wso2/carbon/device/mgt/mobile/android/common/GoogleAPIInvoker.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/device/mgt/mobile/android/api/invoker/GoogleAPIInvoker.java similarity index 99% rename from components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.common/src/main/java/org/wso2/carbon/device/mgt/mobile/android/common/GoogleAPIInvoker.java rename to components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/device/mgt/mobile/android/api/invoker/GoogleAPIInvoker.java index da1cc2023..2fd195f2d 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.common/src/main/java/org/wso2/carbon/device/mgt/mobile/android/common/GoogleAPIInvoker.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/device/mgt/mobile/android/api/invoker/GoogleAPIInvoker.java @@ -16,7 +16,7 @@ * under the License. */ -package org.wso2.carbon.device.mgt.mobile.android.common; +package org.wso2.carbon.device.mgt.mobile.android.api.invoker; import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; @@ -71,8 +71,6 @@ public class GoogleAPIInvoker { this.esa = esa; } - private GoogleAPIInvoker(){} - public String insertUser(String enterpriseId, String username) throws EnterpriseServiceException { AndroidEnterprise androidEnterprise = getEnterpriseClient(); diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.common/pom.xml b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.common/pom.xml index 7d14948c6..6b11c155e 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.common/pom.xml +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.common/pom.xml @@ -91,17 +91,6 @@ com.google.code.gson gson - - com.google.apis - google-api-services-androidenterprise - v1-rev186-1.25.0 - - - commons-logging - commons-logging - - - io.swagger swagger-annotations @@ -163,5 +152,15 @@ + + com.google.apis + google-api-services-androidenterprise + + + commons-logging + commons-logging + + + diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.common/src/main/java/org/wso2/carbon/device/mgt/mobile/android/common/AndroidPluginConstants.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.common/src/main/java/org/wso2/carbon/device/mgt/mobile/android/common/AndroidPluginConstants.java index 79835c2bb..dbf5e77f6 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.common/src/main/java/org/wso2/carbon/device/mgt/mobile/android/common/AndroidPluginConstants.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.common/src/main/java/org/wso2/carbon/device/mgt/mobile/android/common/AndroidPluginConstants.java @@ -57,6 +57,9 @@ public final class AndroidPluginConstants { public static final String OS_BUILD_DATE = "OS_BUILD_DATE"; public static final String MAC_ADDRESS = "MAC"; + public static final String GOOGLE_AFW_EMM_ANDROID_ID = "googleEMMAndroidId"; + public static final String GOOGLE_AFW_DEVICE_ID = "googleEMMDeviceId"; + //Properties related to AD_FEATURE table public static final String ANDROID_FEATURE_ID = "ID"; public static final String ANDROID_FEATURE_CODE = "CODE"; diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.common/src/main/java/org/wso2/carbon/device/mgt/mobile/android/common/spi/AndroidService.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.common/src/main/java/org/wso2/carbon/device/mgt/mobile/android/common/spi/AndroidService.java index 9467460ef..013a70936 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.common/src/main/java/org/wso2/carbon/device/mgt/mobile/android/common/spi/AndroidService.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.common/src/main/java/org/wso2/carbon/device/mgt/mobile/android/common/spi/AndroidService.java @@ -400,15 +400,14 @@ public interface AndroidService { /** * Method for get pending operations * - * @param id Id of the device to get pending operations + * @param deviceIdentifier Device Identifier of the device to get pending operations * @param resultOperations Result operations list - * @param disableGoogleApps Check whether google apps are disabled * @return * @throws {@link DeviceManagementException} * @throws {@link InvalidDeviceException} */ List getPendingOperations - (String id, List resultOperations, boolean disableGoogleApps) + (DeviceIdentifier deviceIdentifier, List resultOperations) throws DeviceManagementException, InvalidDeviceException, AndroidDeviceMgtPluginException; /** diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.core/src/main/java/org/wso2/carbon/device/mgt/mobile/android/core/impl/AndroidServiceImpl.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.core/src/main/java/org/wso2/carbon/device/mgt/mobile/android/core/impl/AndroidServiceImpl.java index a70324eb9..f7f679d05 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.core/src/main/java/org/wso2/carbon/device/mgt/mobile/android/core/impl/AndroidServiceImpl.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.core/src/main/java/org/wso2/carbon/device/mgt/mobile/android/core/impl/AndroidServiceImpl.java @@ -18,7 +18,6 @@ package org.wso2.carbon.device.mgt.mobile.android.core.impl; import com.google.api.client.http.HttpStatusCodes; -import com.google.api.services.androidenterprise.model.ProductsListResponse; import com.google.gson.Gson; import com.google.gson.JsonObject; import org.apache.commons.lang.StringUtils; @@ -26,8 +25,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.analytics.datasource.commons.exception.AnalyticsException; import org.wso2.carbon.base.ServerConfiguration; -import org.wso2.carbon.context.CarbonContext; -import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.mgt.analytics.data.publisher.exception.DataPublisherConfigurationException; import org.wso2.carbon.device.mgt.common.Device; @@ -55,16 +52,13 @@ import org.wso2.carbon.device.mgt.core.operation.mgt.ProfileOperation; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil; import org.wso2.carbon.device.mgt.mobile.android.common.AndroidConstants; -import org.wso2.carbon.device.mgt.mobile.android.common.GoogleAPIInvoker; import org.wso2.carbon.device.mgt.mobile.android.common.Message; import org.wso2.carbon.device.mgt.mobile.android.common.bean.*; import org.wso2.carbon.device.mgt.mobile.android.common.bean.wrapper.*; -import org.wso2.carbon.device.mgt.mobile.android.common.dto.AndroidEnterpriseUser; import org.wso2.carbon.device.mgt.mobile.android.common.exception.*; import org.wso2.carbon.device.mgt.mobile.android.common.spi.AndroidService; import org.wso2.carbon.device.mgt.mobile.android.core.util.AndroidAPIUtils; import org.wso2.carbon.device.mgt.mobile.android.core.util.AndroidDeviceUtils; -import org.wso2.carbon.device.mgt.mobile.android.core.util.AndroidEnterpriseUtils; import org.wso2.carbon.policy.mgt.common.PolicyManagementException; import org.wso2.carbon.policy.mgt.core.PolicyManagerService; @@ -85,8 +79,6 @@ public class AndroidServiceImpl implements AndroidService { private static final Log log = LogFactory.getLog(AndroidServiceImpl.class); private static final String OPERATION_ERROR_STATUS = "ERROR"; - public static final String GOOGLE_AFW_EMM_ANDROID_ID = "googleEMMAndroidId"; - public static final String GOOGLE_AFW_DEVICE_ID = "googleEMMDeviceId"; private static final String EVENT_STREAM_DEFINITION = "org.wso2.iot.LocationStream"; private Gson gson = new Gson(); @@ -918,21 +910,20 @@ public class AndroidServiceImpl implements AndroidService { } @Override - public List getPendingOperations(String deviceId, List resultOperations, - boolean disableGoogleApps) + public List getPendingOperations(DeviceIdentifier deviceIdentifier, + List resultOperations) throws DeviceManagementException, InvalidDeviceException, AndroidDeviceMgtPluginException { - DeviceIdentifier deviceIdentifier = AndroidDeviceUtils.convertToDeviceIdentifierObject(deviceId); try { if (!AndroidDeviceUtils.isValidDeviceIdentifier(deviceIdentifier)) { - String msg = "Device not found for identifier '" + deviceId + "'"; + String msg = "Device not found for identifier '" + deviceIdentifier.getId() + "'"; log.error(msg); throw new InvalidDeviceException(msg); } if (log.isDebugEnabled()) { - log.debug("Invoking Android pending operations:" + deviceId); + log.debug("Invoking Android pending operations:" + deviceIdentifier.getId()); } if (resultOperations != null && !resultOperations.isEmpty()) { - updateOperations(deviceId, resultOperations); + updateOperations(deviceIdentifier.getId(), resultOperations); } } catch (OperationManagementException e) { String msg = "Issue in retrieving operation management service instance"; @@ -952,7 +943,7 @@ public class AndroidServiceImpl implements AndroidService { throw new DeviceManagementException(msg, e); } try { - return AndroidDeviceUtils.getPendingOperations(deviceIdentifier, !disableGoogleApps); + return AndroidDeviceUtils.getPendingOperations(deviceIdentifier); } catch (OperationManagementException e) { String msg = "Issue in retrieving operation management service instance"; log.error(msg, e); @@ -990,7 +981,6 @@ public class AndroidServiceImpl implements AndroidService { public Message enrollDevice(AndroidDevice androidDevice) throws DeviceManagementException, AndroidDeviceMgtPluginException { try { - String token = null; Device device = new Device(); device.setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); device.setEnrolmentInfo(androidDevice.getEnrolmentInfo()); @@ -1002,30 +992,6 @@ public class AndroidServiceImpl implements AndroidService { device.setFeatures(androidDevice.getFeatures()); device.setProperties(androidDevice.getProperties()); - String googleEMMAndroidId = null; - String googleEMMDeviceId = null; - if (androidDevice.getProperties() != null) { - for (Device.Property property : androidDevice.getProperties()) { - if (property.getName().equals(GOOGLE_AFW_EMM_ANDROID_ID)) { - googleEMMAndroidId = property.getValue(); - } else if (property.getName().equals(GOOGLE_AFW_DEVICE_ID)) { - googleEMMDeviceId = property.getValue(); - } - } - - if (googleEMMAndroidId != null && googleEMMDeviceId != null) { - EnterpriseUser user = new EnterpriseUser(); - user.setAndroidPlayDeviceId(googleEMMAndroidId); - user.setEmmDeviceIdentifier(googleEMMDeviceId); - try { - token = insertUser(user); - } catch (EnterpriseServiceException e) { - - } - } - } - - boolean status = AndroidAPIUtils.getDeviceManagementService().enrollDevice(device); if (status) { DeviceIdentifier deviceIdentifier = new DeviceIdentifier(androidDevice.getDeviceIdentifier(), @@ -1082,20 +1048,14 @@ public class AndroidServiceImpl implements AndroidService { Message responseMessage = new Message(); responseMessage.setResponseCode(String.valueOf(HttpStatusCodes.STATUS_CODE_OK)); - if (token == null) { - responseMessage.setResponseMessage("Android device, which carries the id '" + - androidDevice.getDeviceIdentifier() + "' has successfully been enrolled"); - } else { - responseMessage.setResponseMessage("Google response token" + token); - } + responseMessage.setResponseMessage("Android device, which carries the id '" + + androidDevice.getDeviceIdentifier() + "' has successfully been enrolled"); return responseMessage; } else { - Message responseMessage = new Message(); - responseMessage.setResponseCode(String.valueOf(HttpStatusCodes.STATUS_CODE_SERVER_ERROR)); - responseMessage.setResponseMessage("Failed to enroll '" + - device.getType() + "' device, which carries the id '" + - androidDevice.getDeviceIdentifier() + "'"); - return responseMessage; + String msg = "Failed to enroll '" + device.getType() + "' device, which carries the id '" + + androidDevice.getDeviceIdentifier() + "'"; + log.error(msg); + throw new DeviceManagementException(msg); } } catch (PolicyManagementException | InvalidDeviceException | OperationManagementException e) { String msg = "Error occurred while enforcing default enrollment policy upon android " + @@ -1392,84 +1352,6 @@ public class AndroidServiceImpl implements AndroidService { return location; } - private int recursiveSync(GoogleAPIInvoker googleAPIInvoker, String enterpriseId, ProductsListResponse - productsListResponse) throws EnterpriseServiceException, ApplicationManagementException { - // Are there more pages - if (productsListResponse == null || productsListResponse.getTokenPagination() == null - || productsListResponse.getTokenPagination().getNextPageToken() == null) { - return 0; - } - - // Get next page - ProductsListResponse productsListResponseNext = googleAPIInvoker.listProduct(enterpriseId, - productsListResponse.getTokenPagination().getNextPageToken()); - AndroidEnterpriseUtils.persistApp(productsListResponseNext); - if (productsListResponseNext != null && productsListResponseNext.getTokenPagination() != null && - productsListResponseNext.getTokenPagination().getNextPageToken() != null) { - return recursiveSync(googleAPIInvoker, enterpriseId, productsListResponseNext) - + productsListResponseNext.getProduct().size(); - } else { - return productsListResponseNext.getProduct().size(); - } - } - - public String insertUser(EnterpriseUser enterpriseUser) - throws EnterpriseServiceException, AndroidDeviceMgtPluginException { - try { - EnterpriseConfigs enterpriseConfigs = AndroidEnterpriseUtils.getEnterpriseConfigs(); - - String token; - boolean deviceIdExist = false; - - String googleUserId; - List androidEnterpriseUsers = AndroidAPIUtils.getAndroidPluginService() - .getEnterpriseUser(CarbonContext.getThreadLocalCarbonContext().getUsername()); - GoogleAPIInvoker googleAPIInvoker = new GoogleAPIInvoker(enterpriseConfigs.getEsa()); - if (androidEnterpriseUsers != null && !androidEnterpriseUsers.isEmpty()) { - googleUserId = androidEnterpriseUsers.get(0).getGoogleUserId(); - // If this device is also present, only need to provide a token for this request. - for (AndroidEnterpriseUser enterprise : androidEnterpriseUsers) { - if (enterprise.getEmmDeviceId() != null - && enterprise.getEmmDeviceId().equals(enterpriseUser.getAndroidPlayDeviceId())) { - deviceIdExist = true; - } - } - } else { - googleUserId = googleAPIInvoker.insertUser(enterpriseConfigs.getEnterpriseId(), CarbonContext - .getThreadLocalCarbonContext() - .getUsername()); - } - // Fetching an auth token from Google EMM API - token = googleAPIInvoker.getToken(enterpriseConfigs.getEnterpriseId(), googleUserId); - - if (!deviceIdExist) { - AndroidEnterpriseUser androidEnterpriseUser = new AndroidEnterpriseUser(); - androidEnterpriseUser.setEmmUsername(CarbonContext.getThreadLocalCarbonContext().getUsername()); - androidEnterpriseUser.setTenantId(CarbonContext.getThreadLocalCarbonContext().getTenantId()); - androidEnterpriseUser.setAndroidPlayDeviceId(enterpriseUser.getAndroidPlayDeviceId()); - androidEnterpriseUser.setEnterpriseId(enterpriseConfigs.getEnterpriseId()); - androidEnterpriseUser.setEmmDeviceId(enterpriseUser.getEmmDeviceIdentifier()); - androidEnterpriseUser.setGoogleUserId(googleUserId); - - AndroidAPIUtils.getAndroidPluginService().addEnterpriseUser(androidEnterpriseUser); - } - return token; - } catch (NotFoundException e) { - String errorMessage = "Not found"; - log.error(errorMessage); - throw new NotFoundException(errorMessage); - } catch (UnexpectedServerErrorException e) { - String errorMessage = "Unexpected server error"; - log.error(errorMessage); - throw new UnexpectedServerErrorException(errorMessage); - } catch (AndroidDeviceMgtPluginException e) { - String errorMessage = "Error occured while executing wipe enterprice command"; - log.error(errorMessage); - throw new AndroidDeviceMgtPluginException(errorMessage); - } - } - - private static void validateApplicationUrl(String apkUrl) throws BadRequestException { try { URL url = new URL(apkUrl); diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.core/src/main/java/org/wso2/carbon/device/mgt/mobile/android/core/util/AndroidDeviceUtils.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.core/src/main/java/org/wso2/carbon/device/mgt/mobile/android/core/util/AndroidDeviceUtils.java index be73152c6..45970fb71 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.core/src/main/java/org/wso2/carbon/device/mgt/mobile/android/core/util/AndroidDeviceUtils.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.core/src/main/java/org/wso2/carbon/device/mgt/mobile/android/core/util/AndroidDeviceUtils.java @@ -60,9 +60,6 @@ import org.wso2.carbon.apimgt.application.extension.dto.ApiApplicationKey; import org.wso2.carbon.apimgt.application.extension.exception.APIManagerException; import org.wso2.carbon.context.CarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext; -import org.wso2.carbon.device.application.mgt.common.SubAction; -import org.wso2.carbon.device.application.mgt.common.SubscriptionType; -import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; @@ -83,20 +80,13 @@ import org.wso2.carbon.device.mgt.common.policy.mgt.monitor.ComplianceFeature; import org.wso2.carbon.device.mgt.common.policy.mgt.monitor.PolicyComplianceException; import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceDetailsMgtException; import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceInformationManager; -import org.wso2.carbon.device.mgt.core.operation.mgt.ProfileOperation; import org.wso2.carbon.device.mgt.core.search.mgt.impl.Utils; import org.wso2.carbon.device.mgt.mobile.android.common.AndroidConstants; -import org.wso2.carbon.device.mgt.mobile.android.common.GoogleAPIInvoker; import org.wso2.carbon.device.mgt.mobile.android.common.bean.DeviceState; -import org.wso2.carbon.device.mgt.mobile.android.common.bean.EnterpriseConfigs; import org.wso2.carbon.device.mgt.mobile.android.common.bean.ErrorListItem; import org.wso2.carbon.device.mgt.mobile.android.common.bean.ErrorResponse; -import org.wso2.carbon.device.mgt.mobile.android.common.bean.wrapper.EnterpriseApp; -import org.wso2.carbon.device.mgt.mobile.android.common.bean.wrapper.EnterpriseInstallPolicy; -import org.wso2.carbon.device.mgt.mobile.android.common.dto.AndroidEnterpriseUser; import org.wso2.carbon.device.mgt.mobile.android.common.exception.AndroidDeviceMgtPluginException; import org.wso2.carbon.device.mgt.mobile.android.common.exception.BadRequestException; -import org.wso2.carbon.device.mgt.mobile.android.common.exception.EnterpriseServiceException; import org.wso2.carbon.identity.jwt.client.extension.dto.AccessTokenInfo; import org.wso2.carbon.policy.mgt.common.FeatureManagementException; import org.wso2.carbon.policy.mgt.common.PolicyManagementException; @@ -107,7 +97,6 @@ import org.apache.http.impl.client.CloseableHttpClient; import javax.validation.ConstraintViolation; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -288,110 +277,12 @@ public class AndroidDeviceUtils { } public static List getPendingOperations - (DeviceIdentifier deviceIdentifier, boolean handleGoogleAps) throws OperationManagementException { - + (DeviceIdentifier deviceIdentifier) throws OperationManagementException { List operations; operations = AndroidAPIUtils.getDeviceManagementService().getPendingOperations(deviceIdentifier); - if (operations != null && handleGoogleAps) { - handleEnrollmentGoogleApps(operations, deviceIdentifier); - } return operations; } - private static void handleEnrollmentGoogleApps(List operations, DeviceIdentifier - deviceIdentifier) { - boolean containsGoogleAppPolicy = false; - for (int x = 0; x < operations.size() && !containsGoogleAppPolicy; x++) { - Operation operation = operations.get(x); - - // Check if the operation has a policy bundle inside. - if (operation.getCode().equals(AndroidConstants.OperationCodes.POLICY_BUNDLE)) { - ArrayList operationPayLoad = (ArrayList) operation.getPayLoad(); - - - // If there is a policy bundle, read its payload - for (int i = 0; i < operationPayLoad.size() && !containsGoogleAppPolicy; i++) { - Object policy = operationPayLoad.get(i); - ProfileOperation profileOperation = (ProfileOperation) policy; - String code = profileOperation.getCode(); - - // Find if there is an ENROLLMENT_APP_INSTALL payload - if (code.equals(AndroidConstants.ApplicationInstall.ENROLLMENT_APP_INSTALL_FEATURE_CODE)) { - String payload = profileOperation.getPayLoad().toString(); - JsonElement appListElement = new JsonParser().parse(payload).getAsJsonObject() - .get(AndroidConstants.ApplicationInstall.ENROLLMENT_APP_INSTALL_CODE); - JsonArray appListArray = appListElement.getAsJsonArray(); - - // Find if there are Apps with Work profile configurations - boolean alreadySendToGoogle = false; - for (JsonElement appElement : appListArray) { - JsonElement googlePolicyPayload = appElement.getAsJsonObject(). - get(AndroidConstants.ApplicationInstall.GOOGLE_POLICY_PAYLOAD); - if (googlePolicyPayload != null) { - String uuid = appElement.getAsJsonObject().get("uuid").toString(); - containsGoogleAppPolicy = true;// breaking out of outer for loop - try { - uuid = uuid.replace("\"", ""); - if (alreadySendToGoogle) { - sendPayloadToGoogle(uuid, payload, deviceIdentifier, false); - } else { - sendPayloadToGoogle(uuid, payload, deviceIdentifier, true); - alreadySendToGoogle = true; - } - } catch (org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException e) { - String errorMessage = "App install failed for device " + deviceIdentifier.getId(); - log.error(errorMessage, e); - } - } - } - - } - } - } - } - } - - /** - * Sends the app install policy to Google - * @param payload policy profile - * @param deviceIdentifier device to apply policy - */ - private static void sendPayloadToGoogle(String uuid, String payload, DeviceIdentifier deviceIdentifier, - boolean requireSendingToGoogle) throws ApplicationManagementException { - try { - EnterpriseConfigs enterpriseConfigs = AndroidEnterpriseUtils.getEnterpriseConfigsFromGoogle(); - if (enterpriseConfigs.getErrorResponse() == null) { - GoogleAPIInvoker googleAPIInvoker = new GoogleAPIInvoker(enterpriseConfigs.getEsa()); - AndroidEnterpriseUser userDetail = AndroidAPIUtils.getAndroidPluginService() - .getEnterpriseUserByDevice(deviceIdentifier.getId()); - if (userDetail != null && userDetail.getEnterpriseId() != null && !userDetail.getEnterpriseId() - .isEmpty() && userDetail.getEmmUsername() != null && payload != null) { - EnterpriseInstallPolicy enterpriseInstallPolicy = AndroidEnterpriseUtils - .getDeviceAppPolicy(payload, null, userDetail); - - List apps = new ArrayList<>(); - for (EnterpriseApp enterpriseApp : enterpriseInstallPolicy.getApps()) { - apps.add(enterpriseApp.getProductId()); - } - if (requireSendingToGoogle) { - googleAPIInvoker.approveAppsForUser(enterpriseConfigs.getEnterpriseId(), userDetail - .getGoogleUserId(), apps, enterpriseInstallPolicy.getProductSetBehavior()); - googleAPIInvoker.updateAppsForUser(enterpriseConfigs.getEnterpriseId(), userDetail.getGoogleUserId(), - AndroidEnterpriseUtils.convertToDeviceInstance(enterpriseInstallPolicy)); - } - AndroidEnterpriseUtils.getAppSubscriptionService().performEntAppSubscription(uuid, - Arrays.asList(CarbonContext.getThreadLocalCarbonContext().getUsername()), - SubscriptionType.USER.toString(), SubAction.INSTALL.toString(), false); - - } - } - - } catch (EnterpriseServiceException e) { - String errorMessage = "App install failed for device " + deviceIdentifier.getId(); - log.error(errorMessage); - } - } - private static void updateApplicationList(Operation operation, DeviceIdentifier deviceIdentifier) throws org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManagementException { // Parsing json string to get applications list. @@ -748,7 +639,7 @@ public class AndroidDeviceUtils { public static void updateDisEnrollOperationStatus(DeviceIdentifier deviceIdentifier) throws DeviceManagementException { try { - List pendingOperations = getPendingOperations(deviceIdentifier, false); + List pendingOperations = getPendingOperations(deviceIdentifier); if (pendingOperations != null && !pendingOperations.isEmpty()) { for (Operation operation : pendingOperations) { operation.setStatus(Operation.Status.ERROR); diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.core/src/test/java/org/wso2/carbon/device/mgt/mobile/android/core/DeviceManagementServiceTests.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.core/src/test/java/org/wso2/carbon/device/mgt/mobile/android/core/DeviceManagementServiceTests.java index 2a5b818e4..f365290f2 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.core/src/test/java/org/wso2/carbon/device/mgt/mobile/android/core/DeviceManagementServiceTests.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.core/src/test/java/org/wso2/carbon/device/mgt/mobile/android/core/DeviceManagementServiceTests.java @@ -29,11 +29,11 @@ import org.testng.annotations.BeforeClass; import org.testng.annotations.ObjectFactory; import org.testng.annotations.Test; import org.wso2.carbon.device.mgt.common.Device; +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManagementException; import org.wso2.carbon.device.mgt.common.exceptions.DeviceManagementException; import org.wso2.carbon.device.mgt.common.exceptions.InvalidDeviceException; import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; -import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManagementException; import org.wso2.carbon.device.mgt.mobile.android.common.Message; import org.wso2.carbon.device.mgt.mobile.android.common.bean.wrapper.AndroidDevice; import org.wso2.carbon.device.mgt.mobile.android.common.exception.AndroidDeviceMgtPluginException; @@ -45,6 +45,7 @@ import org.wso2.carbon.device.mgt.mobile.android.core.mokcs.NotificationManageme import org.wso2.carbon.device.mgt.mobile.android.core.mokcs.PolicyManagerServiceMock; import org.wso2.carbon.device.mgt.mobile.android.core.util.AndroidAPIUtils; import org.wso2.carbon.device.mgt.mobile.android.core.mokcs.utils.TestUtils; +import org.wso2.carbon.device.mgt.mobile.android.core.util.AndroidDeviceUtils; import javax.ws.rs.core.Response; import java.util.ArrayList; @@ -111,7 +112,7 @@ public class DeviceManagementServiceTests { public void testGetPendingOperationsForNullDevice() throws DeviceManagementException, InvalidDeviceException, AndroidDeviceMgtPluginException { List resultOperations = new ArrayList<>(); - androidService.getPendingOperations(null, resultOperations, true); + androidService.getPendingOperations(null, resultOperations); } @Test (expectedExceptions = {InvalidDeviceException.class}) @@ -119,15 +120,17 @@ public class DeviceManagementServiceTests { throws DeviceManagementException, InvalidDeviceException, AndroidDeviceMgtPluginException { mockDeviceManagementService(); List resultOperations = new ArrayList<>(); - androidService.getPendingOperations("1234", resultOperations, true); + DeviceIdentifier deviceIdentifier = AndroidDeviceUtils.convertToDeviceIdentifierObject("1234"); + androidService.getPendingOperations(deviceIdentifier, resultOperations); } @Test public void testGetPendingOperationsNullResponse() throws DeviceManagementException, InvalidDeviceException, AndroidDeviceMgtPluginException { mockDeviceManagementService(); + DeviceIdentifier deviceIdentifier = AndroidDeviceUtils.convertToDeviceIdentifierObject(TestUtils.getDeviceId()); List pendingOperations = androidService - .getPendingOperations(TestUtils.getDeviceId(), null, true); + .getPendingOperations(deviceIdentifier, null); Assert.assertNotNull(pendingOperations); Assert.assertFalse((pendingOperations.isEmpty())); } @@ -137,8 +140,9 @@ public class DeviceManagementServiceTests { throws DeviceManagementException, InvalidDeviceException, AndroidDeviceMgtPluginException { mockDeviceManagementService(); mockPolicyManagerService(); + DeviceIdentifier deviceIdentifier = AndroidDeviceUtils.convertToDeviceIdentifierObject(TestUtils.getDeviceId()); List pendingOperations = androidService - .getPendingOperations(TestUtils.getDeviceId(), TestUtils.getSuccessMonitorOperationResponse(), true); + .getPendingOperations(deviceIdentifier, TestUtils.getSuccessMonitorOperationResponse()); Assert.assertNotNull(pendingOperations); Assert.assertFalse((pendingOperations.isEmpty())); } @@ -148,9 +152,9 @@ public class DeviceManagementServiceTests { throws DeviceManagementException, InvalidDeviceException, AndroidDeviceMgtPluginException { mockDeviceManagementService(); mockApplicationManagerService(); + DeviceIdentifier deviceIdentifier = AndroidDeviceUtils.convertToDeviceIdentifierObject(TestUtils.getDeviceId()); List pendingOperations = androidService - .getPendingOperations(TestUtils.getDeviceId(), TestUtils.getSuccessApplicationOperationResponse(), - true); + .getPendingOperations(deviceIdentifier, TestUtils.getSuccessApplicationOperationResponse()); Assert.assertNotNull(pendingOperations); Assert.assertFalse((pendingOperations.isEmpty())); } @@ -160,20 +164,20 @@ public class DeviceManagementServiceTests { throws DeviceManagementException, InvalidDeviceException, AndroidDeviceMgtPluginException { mockDeviceManagementService(); mockDeviceInformationManagerService(); + DeviceIdentifier deviceIdentifier = AndroidDeviceUtils.convertToDeviceIdentifierObject(TestUtils.getDeviceId()); List pendingOperations = androidService - .getPendingOperations(TestUtils.getDeviceId(), - TestUtils.getSuccessInfoOperationResponse(), true); + .getPendingOperations(deviceIdentifier, TestUtils.getSuccessInfoOperationResponse()); Assert.assertNotNull(pendingOperations); Assert.assertFalse((pendingOperations.isEmpty())); } @Test public void testGetPendingOperationsWithInProgressResponse() - throws DeviceManagementException, OperationManagementException, InvalidDeviceException, AndroidDeviceMgtPluginException { + throws DeviceManagementException, InvalidDeviceException, AndroidDeviceMgtPluginException { mockDeviceManagementService(); + DeviceIdentifier deviceIdentifier = AndroidDeviceUtils.convertToDeviceIdentifierObject(TestUtils.getDeviceId()); List pendingOperations = androidService - .getPendingOperations(TestUtils.getDeviceId(), - TestUtils.getInProgressOperationResponse(), true); + .getPendingOperations(deviceIdentifier, TestUtils.getInProgressOperationResponse()); Assert.assertNotNull(pendingOperations); Assert.assertFalse((pendingOperations.isEmpty())); } @@ -183,9 +187,9 @@ public class DeviceManagementServiceTests { throws DeviceManagementException, InvalidDeviceException, AndroidDeviceMgtPluginException { mockDeviceManagementService(); mockNotificationManagementService(); + DeviceIdentifier deviceIdentifier = AndroidDeviceUtils.convertToDeviceIdentifierObject(TestUtils.getDeviceId()); List pendingOperations = androidService - .getPendingOperations(TestUtils.getDeviceId(), - TestUtils.getErrorOperationResponse(), true); + .getPendingOperations(deviceIdentifier, TestUtils.getErrorOperationResponse()); Assert.assertNotNull(pendingOperations); Assert.assertFalse((pendingOperations.isEmpty())); } diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.core/src/test/java/org/wso2/carbon/device/mgt/mobile/android/core/mokcs/DeviceManagementProviderServiceMock.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.core/src/test/java/org/wso2/carbon/device/mgt/mobile/android/core/mokcs/DeviceManagementProviderServiceMock.java index 67dbd2b12..717510346 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.core/src/test/java/org/wso2/carbon/device/mgt/mobile/android/core/mokcs/DeviceManagementProviderServiceMock.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.core/src/test/java/org/wso2/carbon/device/mgt/mobile/android/core/mokcs/DeviceManagementProviderServiceMock.java @@ -661,6 +661,18 @@ public class DeviceManagementProviderServiceMock implements DeviceManagementProv return null; } + @Override public boolean deleteDeviceTypeVersions(DeviceType deviceType) throws DeviceManagementException { + return false; + } + + @Override public void disEnrollDevices(List list) throws DeviceManagementException { + + } + + @Override public boolean deleteDeviceType(String s, DeviceType deviceType) throws DeviceManagementException { + return false; + } + @Override public DeviceConfiguration getDeviceConfiguration(Map propertyMap) throws DeviceManagementException, DeviceNotFoundException, UnauthorizedDeviceAccessException, diff --git a/pom.xml b/pom.xml index dd8ff2fa0..814a1301a 100644 --- a/pom.xml +++ b/pom.xml @@ -1154,6 +1154,11 @@ apk ${android.agent.version} + + com.google.apis + google-api-services-androidenterprise + v1-rev214-1.25.0 +