From 2374f26f3cebdf711aca3e253fadcf689baaf496 Mon Sep 17 00:00:00 2001 From: Nipun Nadeen De Silva Date: Sat, 16 Nov 2019 07:50:55 +0000 Subject: [PATCH 1/5] Create the display-message-configuration policy --- .../services/android/bean/DisplayMessage.java | 65 ++++++++++++++ .../wrapper/DisplayMessageBeanWrapper.java | 54 ++++++++++++ .../DeviceManagementAdminService.java | 57 +++++++++++++ .../DeviceManagementAdminServiceImpl.java | 44 ++++++++++ .../android/util/AndroidConstants.java | 1 + .../public/js/operation-mod.js | 23 ++++- .../public/js/android-policy-edit.js | 35 +++++++- .../public/templates/android-policy-edit.hbs | 84 +++++++++++++++++++ .../public/templates/android-policy-view.hbs | 80 ++++++++++++++++++ .../public/js/android-policy-operations.js | 35 +++++++- .../templates/android-policy-operations.hbs | 83 ++++++++++++++++++ 11 files changed, 556 insertions(+), 5 deletions(-) create mode 100644 components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/DisplayMessage.java create mode 100644 components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/DisplayMessageBeanWrapper.java diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/DisplayMessage.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/DisplayMessage.java new file mode 100644 index 000000000..20531f6f9 --- /dev/null +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/DisplayMessage.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.wso2.carbon.mdm.services.android.bean; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; + +/** + * This class represents the information of configuring display message operation. + */ +@ApiModel(value = "LockScreenMessage", description = "This class represents the information of configuring wifi operation") +public class DisplayMessage extends AndroidOperation implements Serializable { + + @ApiModelProperty(name = "lockScreenMessage", value = "The message of the lock screen that you wish to configure", + required = true) + private String lockScreenMessage; + @ApiModelProperty(name = "settingAppSupportMessage", value = "The message of the administrators applications that you wish to configure", + required = true) + private String settingAppSupportMessage; + @ApiModelProperty(name = "disabledSettingSupportMessage", value = "The password to connect to the specified Wifi network", + required = true) + private String disabledSettingSupportMessage; + + public String getLockScreenMessage() { + return lockScreenMessage; + } + + public void setLockScreenMessage(String lockScreenMessage) { + this.lockScreenMessage = lockScreenMessage; + } + + public String getSettingAppSupportMessage() { + return settingAppSupportMessage; + } + + public void setSettingAppSupportMessage(String settingAppSupportMessage) { + this.settingAppSupportMessage = settingAppSupportMessage; + } + + public String getDisabledSettingSupportMessage() { + return disabledSettingSupportMessage; + } + + public void setDisabledSettingSupportMessage(String disabledSettingSupportMessage) { + this.disabledSettingSupportMessage = disabledSettingSupportMessage; + } +} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/DisplayMessageBeanWrapper.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/DisplayMessageBeanWrapper.java new file mode 100644 index 000000000..8ef1fe644 --- /dev/null +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/DisplayMessageBeanWrapper.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.wso2.carbon.mdm.services.android.bean.wrapper; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.wso2.carbon.mdm.services.android.bean.DisplayMessage; + +import java.util.List; + +/** + * This class is used to wrap the Wifi bean with devices. + */ +@ApiModel(value = "DisplayMessageBeanWrapper", + description = "Mapping between display message operation and device list to be applied.") +public class DisplayMessageBeanWrapper { + + @ApiModelProperty(name = "operation", value = "Information of configuring display message operation", required = true) + private DisplayMessage operation; + @ApiModelProperty(name = "deviceIDs", value = "List of device Ids", required = true) + private List deviceIDs; + + public DisplayMessage getOperation() { + return operation; + } + + public void setOperation(DisplayMessage operation) { + this.operation = operation; + } + + public List getDeviceIDs() { + return deviceIDs; + } + + public void setDeviceIDs(List deviceIDs) { + this.deviceIDs = deviceIDs; + } +} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceManagementAdminService.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceManagementAdminService.java index 5e1ddd7f1..89787ea68 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceManagementAdminService.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceManagementAdminService.java @@ -257,6 +257,12 @@ import java.util.List; description = "Send app restrictions to an application in the device", key = "perm:android:send-app-restrictions", permissions = {"/device-mgt/devices/owning-device/operations/android/send-app-conf"} + ), + @Scope( + name = "Configure display message", + description = "Configure display message on Android Device", + key = "perm:android:configure-display-message", + permissions = {"/device-mgt/devices/owning-device/operations/android/display-message"} ) } ) @@ -2052,4 +2058,55 @@ public interface DeviceManagementAdminService { value = "The properties to set the global proxy settings.", required = true) GlobalProxyBeanWrapper globalProxyBeanWrapper); + + @POST + @Path("/configure-display-message") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Sending a messages to Android Devices.", + notes = "Send a message to Android Devices.", + response = Activity.class, + tags = "Android Device Management Administrative Service", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = AndroidConstants.SCOPE, value = "perm:android:configure-display-message") + }) + } + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Successfully sent the message.", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource was last modified.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new display messages operation.") + }) + Response configureDisplayMessage( + @ApiParam( + name = "display-message", + value = "The properties required to send a messages. Provide the message you wish to send and the ID of the " + + "Android device. Multiple device IDs can be added by using comma separated values.", + required = true) + DisplayMessageBeanWrapper displayMessageBeanWrapper); } diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/DeviceManagementAdminServiceImpl.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/DeviceManagementAdminServiceImpl.java index 03d7a9114..0ed723cce 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/DeviceManagementAdminServiceImpl.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/DeviceManagementAdminServiceImpl.java @@ -37,6 +37,7 @@ package org.wso2.carbon.mdm.services.android.services.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.http.HttpStatus; 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.Activity; @@ -56,6 +57,7 @@ import org.wso2.carbon.mdm.services.android.bean.ErrorResponse; import org.wso2.carbon.mdm.services.android.bean.FileTransfer; import org.wso2.carbon.mdm.services.android.bean.GlobalProxy; import org.wso2.carbon.mdm.services.android.bean.LockCode; +import org.wso2.carbon.mdm.services.android.bean.DisplayMessage; import org.wso2.carbon.mdm.services.android.bean.Notification; import org.wso2.carbon.mdm.services.android.bean.PasscodePolicy; import org.wso2.carbon.mdm.services.android.bean.UpgradeFirmware; @@ -74,6 +76,7 @@ import org.wso2.carbon.mdm.services.android.bean.wrapper.EncryptionBeanWrapper; import org.wso2.carbon.mdm.services.android.bean.wrapper.FileTransferBeanWrapper; import org.wso2.carbon.mdm.services.android.bean.wrapper.GlobalProxyBeanWrapper; import org.wso2.carbon.mdm.services.android.bean.wrapper.LockCodeBeanWrapper; +import org.wso2.carbon.mdm.services.android.bean.wrapper.DisplayMessageBeanWrapper; import org.wso2.carbon.mdm.services.android.bean.wrapper.NotificationBeanWrapper; import org.wso2.carbon.mdm.services.android.bean.wrapper.PasswordPolicyBeanWrapper; import org.wso2.carbon.mdm.services.android.bean.wrapper.UpgradeFirmwareBeanWrapper; @@ -1090,6 +1093,47 @@ public class DeviceManagementAdminServiceImpl implements DeviceManagementAdminSe } } + @POST + @Path("/configure-display-message") + @Override + public Response configureDisplayMessage(DisplayMessageBeanWrapper displayMessageBeanWrapper) { + if (log.isDebugEnabled()) { + log.debug("Invoking 'configure-display-message' operation"); + } + + try { + if (displayMessageBeanWrapper == null || displayMessageBeanWrapper.getOperation() == null) { + String errorMessage = "The payload of the display message operation is incorrect"; + log.error(errorMessage); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(HttpStatus.SC_BAD_REQUEST). + setMessage(errorMessage).build()); + } + DisplayMessage configureDisplayMessage = displayMessageBeanWrapper.getOperation(); + ProfileOperation operation = new ProfileOperation(); + operation.setCode(AndroidConstants.OperationCodes.DISPLAY_MESSAGE_CONFIGURATION); + operation.setType(Operation.Type.PROFILE); + operation.setPayLoad(configureDisplayMessage.toJSON()); + + Activity activity = AndroidDeviceUtils.getOperationResponse(displayMessageBeanWrapper. + getDeviceIDs(), operation); + return Response.status(Response.Status.CREATED).entity(activity).build(); + + } catch (InvalidDeviceException e) { + String errorMessage = "Invalid Device Identifiers found."; + log.error(errorMessage, e); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(HttpStatus.SC_BAD_REQUEST). + setMessage(errorMessage).build()); + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder(). + setCode(HttpStatus.SC_INTERNAL_SERVER_ERROR).setMessage(errorMessage).build()); + } + } + private static void validateApplicationUrl(String apkUrl) { try { URL url = new URL(apkUrl); diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidConstants.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidConstants.java index 18cd1d997..fd29cb29e 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidConstants.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidConstants.java @@ -151,6 +151,7 @@ public final class AndroidConstants { public static final String NOTIFIER_FREQUENCY = "NOTIFIER_FREQUENCY"; public static final String GLOBAL_PROXY = "SET_GLOBAL_PROXY"; public static final String REMOTE_APP_CONFIG = "REMOTE_APP_CONFIG"; + public static final String DISPLAY_MESSAGE_CONFIGURATION = "DISPLAY_MESSAGE_CONFIGURATION"; } public final class StatusCodes { diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.operation-mod/public/js/operation-mod.js b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.operation-mod/public/js/operation-mod.js index adb2d38d6..c0a1268b3 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.operation-mod/public/js/operation-mod.js +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.operation-mod/public/js/operation-mod.js @@ -110,7 +110,8 @@ var androidOperationModule = function () { "DISALLOW_BLUETOOTH_SHARING": "DISALLOW_BLUETOOTH_SHARING", "DISALLOW_REMOVE_USER": "DISALLOW_REMOVE_USER", "DISALLOW_DATA_ROAMING": "DISALLOW_DATA_ROAMING", - "CERT_ADD_OPERATION_CODE": "INSTALL_CERT" + "CERT_ADD_OPERATION_CODE": "INSTALL_CERT", + "DISPLAY_MESSAGE_CONFIGURATION_OPERATION_CODE": "DISPLAY_MESSAGE_CONFIGURATION" }; /** @@ -333,6 +334,13 @@ var androidOperationModule = function () { "CERT_LIST": listNew }; break; + case androidOperationConstants["DISPLAY_MESSAGE_CONFIGURATION_OPERATION_CODE"]: + payload = { + "lockScreenMessage": operationPayload["lockScreenMessage"], + "settingAppSupportMessage": operationPayload["settingAppSupportMessage"], + "disabledSettingSupportMessage": operationPayload["disabledSettingSupportMessage"] + }; + break; } return payload; }; @@ -717,6 +725,16 @@ var androidOperationModule = function () { } }; break; + case androidOperationConstants["DISPLAY_MESSAGE_CONFIGURATION_OPERATION_CODE"]: + operationType = operationTypeConstants["PROFILE"]; + payload = { + "operation": { + "lockScreenMessage": operationData["lockScreenMessage"], + "settingAppSupportMessage": operationData["settingAppSupportMessage"], + "disabledSettingSupportMessage": operationData["disabledSettingSupportMessage"] + } + }; + break; default: // If the operation is neither of above, it is a command operation operationType = operationTypeConstants["COMMAND"]; @@ -757,7 +775,8 @@ var androidOperationModule = function () { "BLACKLIST_APPLICATIONS": "blacklist-applications", "PASSCODE_POLICY": "set-password-policy", "ENTERPRISE_WIPE": "enterprise-wipe", - "WIPE_DATA": "wipe" + "WIPE_DATA": "wipe", + "DISPLAY_MESSAGE_CONFIGURATION": "configure-display-message" }; return "/api/device-mgt/android/v1.0/admin/devices/" + featureMap[operationCode]; }; diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-edit/public/js/android-policy-edit.js b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-edit/public/js/android-policy-edit.js index abbbd343d..4aa6b0a8c 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-edit/public/js/android-policy-edit.js +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-edit/public/js/android-policy-edit.js @@ -59,7 +59,9 @@ var androidOperationConstants = { "COSU_PROFILE_CONFIGURATION_OPERATION_CODE": "COSU_PROFILE", "ENROLLMENT_APP_INSTALL": "enrollment-app-install", "ENROLLMENT_APP_INSTALL_CODE": "ENROLLMENT_APP_INSTALL", - "CERT_ADD_OPERATION_CODE": "INSTALL_CERT" + "CERT_ADD_OPERATION_CODE": "INSTALL_CERT", + "DISPLAY_MESSAGE_CONFIGURATION_OPERATION": "display-message-configuration", + "DISPLAY_MESSAGE_CONFIGURATION_OPERATION_CODE": "DISPLAY_MESSAGE_CONFIGURATION" }; /** @@ -662,6 +664,37 @@ var validatePolicyProfile = function () { validationStatusArray.push(validationStatus); } + // Validating DISPLAY MESSAGE CONFIGURATION + if ($.inArray(androidOperationConstants["DISPLAY_MESSAGE_CONFIGURATION_OPERATION_CODE"], configuredOperations) != -1) { + // if DISPLAY_MESSAGE_CONFIGURATION policy is configured + operation = androidOperationConstants["DISPLAY_MESSAGE_CONFIGURATION_OPERATION"]; + // initializing continueToCheckNextInputs to true + continueToCheckNextInputs = true; + + var lockScreenMessage = $("textarea#lock-screen-message").val(); + var settingAppMessage = $("textarea#setting-app-message").val(); + var disabledSettingMessage = $("textarea#disabled-setting-message").val(); + if (!lockScreenMessage && !settingAppMessage && !disabledSettingMessage) { + validationStatus = { + "error": true, + "subErrorMsg": "Please fill at-least a one field.", + "erroneousFeature": operation + }; + continueToCheckNextInputs = false; + } + // at-last, if the value of continueToCheckNextInputs is still true + // this means that no error is found + if (continueToCheckNextInputs) { + validationStatus = { + "error": false, + "okFeature": operation + }; + } + + // updating validationStatusArray with validationStatus + validationStatusArray.push(validationStatus); + } + // Validating PROXY if ($.inArray(androidOperationConstants["GLOBAL_PROXY_OPERATION_CODE"], configuredOperations) !== -1) { // if PROXY is configured diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-edit/public/templates/android-policy-edit.hbs b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-edit/public/templates/android-policy-edit.hbs index 835ffbdee..e82c1132a 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-edit/public/templates/android-policy-edit.hbs +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-edit/public/templates/android-policy-edit.hbs @@ -162,6 +162,18 @@ + + + + + + Display Message Configuration + + + + +
@@ -3318,6 +3330,78 @@
+ + +
+
+ +
+
+
+ +
+ +
+ Below lock screen message is valid only when the Agent is the + device owner. +
+ +

+ + +

+ + +
+
+
+
+ + \ No newline at end of file diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-view/public/templates/android-policy-view.hbs b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-view/public/templates/android-policy-view.hbs index ba006b6ee..77f5cef57 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-view/public/templates/android-policy-view.hbs +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-view/public/templates/android-policy-view.hbs @@ -144,6 +144,18 @@ + + + + + + Display Message Configuration + + + + +
@@ -3235,6 +3247,74 @@
+ + +
+
+ +
+
+
+ +
+ Below lock screen message is valid only when the Agent is the + device owner. +
+ +

+ + +

+ + +
+
+
+
+ + diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-wizard/public/js/android-policy-operations.js b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-wizard/public/js/android-policy-operations.js index 330bdee1a..312f56704 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-wizard/public/js/android-policy-operations.js +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-wizard/public/js/android-policy-operations.js @@ -56,7 +56,9 @@ var androidOperationConstants = { "COSU_PROFILE_CONFIGURATION_OPERATION_CODE": "COSU_PROFILE", "ENROLLMENT_APP_INSTALL": "enrollment-app-install", "ENROLLMENT_APP_INSTALL_CODE": "ENROLLMENT_APP_INSTALL", - "CERTIFICATE_INSTALL": "INSTALL_CERT" + "CERTIFICATE_INSTALL": "INSTALL_CERT", + "DISPLAY_MESSAGE_CONFIGURATION_OPERATION": "display-message-configuration", + "DISPLAY_MESSAGE_CONFIGURATION_OPERATION_CODE": "DISPLAY_MESSAGE_CONFIGURATION" }; /** @@ -593,6 +595,36 @@ var validatePolicyProfile = function () { // updating validationStatusArray with validationStatus validationStatusArray.push(validationStatus); } + // Validating DISPLAY MESSAGE CONFIGURATION + if ($.inArray(androidOperationConstants["DISPLAY_MESSAGE_CONFIGURATION_OPERATION_CODE"], configuredOperations) !== -1) { + // if DISPLAY_MESSAGE_CONFIGURATION policy is configured + operation = androidOperationConstants["DISPLAY_MESSAGE_CONFIGURATION_OPERATION"]; + // initializing continueToCheckNextInputs to true + continueToCheckNextInputs = true; + + var lockScreenMessage = $("textarea#lock-screen-message").val(); + var settingAppMessage = $("textarea#setting-app-message").val(); + var disabledSettingMessage = $("textarea#disabled-setting-message").val(); + if (!lockScreenMessage && !settingAppMessage && !disabledSettingMessage) { + validationStatus = { + "error": true, + "subErrorMsg": "Please fill at-least a one field.", + "erroneousFeature": operation + }; + continueToCheckNextInputs = false; + } + // at-last, if the value of continueToCheckNextInputs is still true + // this means that no error is found + if (continueToCheckNextInputs) { + validationStatus = { + "error": false, + "okFeature": operation + }; + } + + // updating validationStatusArray with validationStatus + validationStatusArray.push(validationStatus); + } // Validating PROXY if ($.inArray(androidOperationConstants["GLOBAL_PROXY_OPERATION_CODE"], configuredOperations) !== -1) { @@ -600,7 +632,6 @@ var validatePolicyProfile = function () { operation = androidOperationConstants["GLOBAL_PROXY_OPERATION"]; // initializing continueToCheckNextInputs to true continueToCheckNextInputs = true; - if ($("input#manual-proxy-configuration-radio-button").is(":checked")) { var proxyHost = $("input#proxy-host").val(); var proxyPort = $("input#proxy-port").val(); diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-wizard/public/templates/android-policy-operations.hbs b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-wizard/public/templates/android-policy-operations.hbs index 3eb127619..2a4df56b1 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-wizard/public/templates/android-policy-operations.hbs +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-wizard/public/templates/android-policy-operations.hbs @@ -170,6 +170,18 @@ + + + + + + Display Message Configuration + + + + +
@@ -3335,6 +3347,77 @@
+ + +
+
+ +
+
+
+ +
+ +
+ Below lock screen message is valid only when the Agent is the + device owner. +
+ +

+ + +

+ + +
+
+
+
+ From eb2156c54ee3065cffad0a7ace8fe6e0f271c156 Mon Sep 17 00:00:00 2001 From: lasanthaDLPDS Date: Thu, 14 Nov 2019 08:48:27 +0530 Subject: [PATCH 2/5] Improve android ent app syncing flow --- .../android/util/AndroidConstants.java | 4 + .../android/util/AndroidEnterpriseUtils.java | 233 +++++++++++++----- 2 files changed, 177 insertions(+), 60 deletions(-) diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidConstants.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidConstants.java index fd29cb29e..e7d618b70 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidConstants.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidConstants.java @@ -70,6 +70,8 @@ public final class AndroidConstants { public static final String USER_CLAIM_FIRST_NAME_PLACEHOLDER = "$firstName"; public static final String USER_CLAIM_LAST_NAME_PLACEHOLDER = "$lastName"; + public static final String GOOGLE_PLAY_SYNCED_APP_CATEGORY = "GooglePlaySyncedApp"; + public final class DeviceProperties { private DeviceProperties() { throw new AssertionError(); @@ -186,6 +188,8 @@ public final class AndroidConstants { public static final String VERSION = "version"; public static final String ICON = "icon"; 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 { diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidEnterpriseUtils.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidEnterpriseUtils.java index 9bd2a953f..c2bd0f4d3 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidEnterpriseUtils.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidEnterpriseUtils.java @@ -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.VariableSet; +import com.google.common.collect.ImmutableList; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -38,12 +39,14 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.context.PrivilegedCarbonContext; 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.exception.ApplicationManagementException; 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.services.ApplicationManager; 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.PublicAppWrapper; import org.wso2.carbon.device.mgt.common.DeviceManagementConstants; @@ -76,9 +79,11 @@ import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class AndroidEnterpriseUtils { @@ -277,85 +282,70 @@ public class AndroidEnterpriseUtils { ApplicationManager applicationManager = getAppManagerServer(); List categories = applicationManager.getRegisteredCategories(); if (productListResponse != null && productListResponse.getProduct() != null - && productListResponse.getProduct().size() > 0) { + && !productListResponse.getProduct().isEmpty()) { + + List packageNamesOfApps = productListResponse.getProduct().stream() + .map(product -> (product.getProductId().replaceFirst("app:", ""))).collect(Collectors.toList()); + + List existingApps = applicationManager.getApplications(packageNamesOfApps); + List 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"); - for (Product product : productListResponse.getProduct()) { + 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 continue; } // Generate App wrapper - PublicAppWrapper publicAppWrapper = new PublicAppWrapper(); + PublicAppWrapper publicAppWrapper = generatePubAppWrapper(product, categories); PublicAppReleaseWrapper appReleaseWrapper = new PublicAppReleaseWrapper(); - publicAppWrapper.setName(product.getTitle()); - publicAppWrapper.setDescription(product.getDescription()); - publicAppWrapper.setCategories(Arrays.asList(new String[]{"GooglePlaySyncedApp"}));//Default category - for (Category category : categories) { - if (product.getCategory() == null) { - publicAppWrapper.setCategories(Arrays.asList(new String[]{"GooglePlaySyncedApp"})); - break; - } else if (product.getCategory().equalsIgnoreCase(category.getCategoryName())) { - publicAppWrapper.setCategories(Arrays.asList(new String[]{category.getCategoryName(), "GooglePlaySyncedApp"})); - break; - } - } - if (product.getProductPricing().equalsIgnoreCase("free")) { - publicAppWrapper.setSubMethod("FREE"); + + if (publicAppWrapper.getSubMethod() + .equalsIgnoreCase(AndroidConstants.ApplicationProperties.FREE_SUB_METHOD)) { + appReleaseWrapper.setPrice(0.0); } else { - publicAppWrapper.setSubMethod("PAID"); + appReleaseWrapper.setPrice(1.0); } - // TODO: purchase an app from Playstore and see how to capture the real value for price field. - publicAppWrapper.setPaymentCurrency("$"); - appReleaseWrapper.setPrice(1.0); - publicAppWrapper.setDeviceType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); 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})); + publicAppWrapper.setPublicAppReleaseWrappers( + Arrays.asList(new PublicAppReleaseWrapper[] { appReleaseWrapper })); // Generate artifacts - ApplicationArtifact applicationArtifact = new ApplicationArtifact(); - - String iconName = product.getIconUrl().split(".com/")[1]; - applicationArtifact.setIconName(iconName); - - - InputStream iconInputStream = getInputStream(iconName, product.getIconUrl()); - applicationArtifact.setIconStream(iconInputStream); - Map screenshotMap = new HashMap<>(); - - int numberOfScreenShots = 3;// This is to handle some apps in playstore without 3 screenshots. - if (product.getScreenshotUrls() != null) { - if (product.getScreenshotUrls().size() < 3) { - numberOfScreenShots = product.getScreenshotUrls().size(); - } - - for (int y = 1; y < 4; y++) { - int screenshotNumber = y - 1; - if (y > numberOfScreenShots) { - screenshotNumber = 0; - } - String screenshot = product.getScreenshotUrls().get(screenshotNumber); - String screenshotName = screenshot.split(".com/")[1]; - InputStream screenshotInputStream = getInputStream(screenshotName, screenshot); - screenshotMap.put(screenshotName, screenshotInputStream); - } - } else { // Private apps doesn't seem to send screenshots. Handling it. - for (int a = 0; a < 3; a++) { - String screenshot = product.getIconUrl(); - String screenshotName = screenshot.split(".com/")[1]; - InputStream screenshotInputStream = getInputStream(screenshotName, screenshot); - screenshotMap.put(screenshotName, screenshotInputStream); - } - } - - applicationArtifact.setScreenshots(screenshotMap); - + ApplicationArtifact applicationArtifact = generateArtifacts(product); Application application = applicationManager.createPublicApp(publicAppWrapper, applicationArtifact); if (application != null && (application.getApplicationReleases().get(0).getCurrentStatus() == null @@ -373,6 +363,129 @@ public class AndroidEnterpriseUtils { } } + /** + * 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 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 pubAppCategories = new ArrayList<>(); + pubAppCategories.add(AndroidConstants.GOOGLE_PLAY_SYNCED_APP_CATEGORY); + applicationUpdateWrapper.setCategories(pubAppCategories); + break; + } else if (product.getCategory().equalsIgnoreCase(category.getCategoryName())) { + List 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 categories) { + PublicAppWrapper publicAppWrapper = new PublicAppWrapper(); + publicAppWrapper.setName(product.getTitle()); + publicAppWrapper.setDescription(product.getDescription()); + publicAppWrapper.setCategories( + Collections.singletonList(AndroidConstants.GOOGLE_PLAY_SYNCED_APP_CATEGORY));//Default category + for (Category category : categories) { + if (product.getCategory() == null) { + List pubAppCategories = new ArrayList<>(); + pubAppCategories.add(AndroidConstants.GOOGLE_PLAY_SYNCED_APP_CATEGORY); + publicAppWrapper.setCategories(pubAppCategories); + break; + } else if (product.getCategory().equalsIgnoreCase(category.getCategoryName())) { + List pubAppCategories = new ArrayList<>(); + pubAppCategories.add(category.getCategoryName()); + pubAppCategories.add(AndroidConstants.GOOGLE_PLAY_SYNCED_APP_CATEGORY); + publicAppWrapper.setCategories(pubAppCategories); + break; + } + } + if (product.getProductPricing().equalsIgnoreCase(AndroidConstants.ApplicationProperties.FREE_SUB_METHOD)) { + publicAppWrapper.setSubMethod(AndroidConstants.ApplicationProperties.FREE_SUB_METHOD); + } else { + publicAppWrapper.setSubMethod(AndroidConstants.ApplicationProperties.PAID_SUB_METHOD); + } + // TODO: purchase an app from Playstore and see how to capture the real value for price field. + publicAppWrapper.setPaymentCurrency("$"); + publicAppWrapper.setDeviceType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); + return publicAppWrapper; + } + + /** + * 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(); + try { + String iconName = product.getIconUrl().split(".com/")[1]; + applicationArtifact.setIconName(iconName); + InputStream iconInputStream = getInputStream(iconName, product.getIconUrl()); + applicationArtifact.setIconStream(iconInputStream); + Map screenshotMap = new HashMap<>(); + + int numberOfScreenShots = 3;// This is to handle some apps in playstore without 3 screenshots. + if (product.getScreenshotUrls() != null) { + if (product.getScreenshotUrls().size() < 3) { + numberOfScreenShots = product.getScreenshotUrls().size(); + } + for (int y = 1; y < 4; y++) { + int screenshotNumber = y - 1; + if (y > numberOfScreenShots) { + screenshotNumber = 0; + } + String screenshot = product.getScreenshotUrls().get(screenshotNumber); + String screenshotName = screenshot.split(".com/")[1]; + InputStream screenshotInputStream = getInputStream(screenshotName, screenshot); + screenshotMap.put(screenshotName, screenshotInputStream); + } + } else { // Private apps doesn't seem to send screenshots. Handling it. + for (int a = 0; a < 3; a++) { + String screenshot = product.getIconUrl(); + String screenshotName = screenshot.split(".com/")[1]; + InputStream screenshotInputStream = getInputStream(screenshotName, screenshot); + screenshotMap.put(screenshotName, screenshotInputStream); + } + } + applicationArtifact.setScreenshots(screenshotMap); + return applicationArtifact; + } catch (ApplicationManagementException e) { + String msg = "Error occurred while generating Application artifact"; + log.error(msg); + throw new ApplicationManagementException(msg, e); + } + } + private static InputStream getInputStream(String filename, String url) throws ApplicationManagementException { URL website; try { From 11483c6f6bb3cf8d14be5c5dad1fa9c67e4d97bb Mon Sep 17 00:00:00 2001 From: sandarudr Date: Thu, 21 Nov 2019 18:49:39 +0530 Subject: [PATCH 3/5] Add COSU profile configuration to enable/disable the always-on display. --- .../public/js/operation-mod.js | 3 +++ .../public/templates/android-policy-edit.hbs | 15 +++++++++++++++ .../public/templates/android-policy-view.hbs | 15 +++++++++++++++ .../templates/android-policy-operations.hbs | 15 +++++++++++++++ 4 files changed, 48 insertions(+) diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.operation-mod/public/js/operation-mod.js b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.operation-mod/public/js/operation-mod.js index c0a1268b3..599d9f33e 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.operation-mod/public/js/operation-mod.js +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.operation-mod/public/js/operation-mod.js @@ -235,6 +235,8 @@ var androidOperationModule = function () { payload["kioskLogoImage"] = deviceGlobalConfigurations["kioskLogoImage"]; payload["kioskAppName"] = deviceGlobalConfigurations["kioskAppName"]; payload["isSingleModeApp"] = deviceGlobalConfigurations["isSingleModeApp"]; + payload["keepDisplayAwake"] = deviceGlobalConfigurations["keepDisplayAwake"]; + if (payload["isSingleModeApp"] === true) { payload["isSingleModeAppBuiltForKiosk"] = deviceGlobalConfigurations["isSingleModeAppBuiltForKiosk"]; @@ -589,6 +591,7 @@ var androidOperationModule = function () { operationData["isSingleModeAppBuiltForKiosk"]; } deviceGlobalConfigurations["isIdleGraphicsEnabled"] = operationData["isIdleGraphicsEnabled"]; + deviceGlobalConfigurations["keepDisplayAwake"] = operationData["keepDisplayAwake"]; if (operationData["idleTimeout"]) { deviceGlobalConfigurations["idleTimeout"] = operationData["idleTimeout"]; } diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-edit/public/templates/android-policy-edit.hbs b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-edit/public/templates/android-policy-edit.hbs index e82c1132a..804be22ba 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-edit/public/templates/android-policy-edit.hbs +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-edit/public/templates/android-policy-edit.hbs @@ -2241,6 +2241,21 @@ + +
+
+ Keep display awake + + +
+
+ +
+
+ Keep display awake + + +
+
+ +
+
+ Keep display awake + + +
+
Date: Fri, 22 Nov 2019 09:20:18 +0530 Subject: [PATCH 4/5] Add new enrollment type to QR code --- .../configuration.hbs | 1 + .../units/cdmf.unit.device.type.android.type-view/type-view.hbs | 2 ++ 2 files changed, 3 insertions(+) diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.platform.configuration/configuration.hbs b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.platform.configuration/configuration.hbs index 84e23a02b..b202e1a59 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.platform.configuration/configuration.hbs +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.platform.configuration/configuration.hbs @@ -198,6 +198,7 @@ +
diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.type-view/type-view.hbs b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.type-view/type-view.hbs index 105b7ea03..34e559db2 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.type-view/type-view.hbs +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.type-view/type-view.hbs @@ -114,6 +114,8 @@ + +
From e5abe5dc9181b8b95717ba0c659810a11009a5af Mon Sep 17 00:00:00 2001 From: lasanthaDLPDS Date: Mon, 25 Nov 2019 11:28:24 +0530 Subject: [PATCH 5/5] Remove unused AndroidDeviceManagementService class --- .../android/util/AndroidEnterpriseUtils.java | 2 - .../impl/AndroidDeviceManagementService.java | 151 ------------------ 2 files changed, 153 deletions(-) delete mode 100644 components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android/src/main/java/org/wso2/carbon/device/mgt/mobile/android/impl/AndroidDeviceManagementService.java diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidEnterpriseUtils.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidEnterpriseUtils.java index c2bd0f4d3..6bd4e0be8 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidEnterpriseUtils.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidEnterpriseUtils.java @@ -30,7 +30,6 @@ import com.google.api.services.androidenterprise.model.ProductPolicy; import com.google.api.services.androidenterprise.model.ProductsListResponse; import com.google.api.services.androidenterprise.model.VariableSet; -import com.google.common.collect.ImmutableList; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -39,7 +38,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.context.PrivilegedCarbonContext; 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.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.response.Application; diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android/src/main/java/org/wso2/carbon/device/mgt/mobile/android/impl/AndroidDeviceManagementService.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android/src/main/java/org/wso2/carbon/device/mgt/mobile/android/impl/AndroidDeviceManagementService.java deleted file mode 100644 index bccceedbb..000000000 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android/src/main/java/org/wso2/carbon/device/mgt/mobile/android/impl/AndroidDeviceManagementService.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - * Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. - * - * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.wso2.carbon.device.mgt.mobile.android.impl; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.device.mgt.common.DeviceManager; -import org.wso2.carbon.device.mgt.common.OperationMonitoringTaskConfig; -import org.wso2.carbon.device.mgt.common.ProvisioningConfig; -import org.wso2.carbon.device.mgt.common.InitialOperationConfig; -import org.wso2.carbon.device.mgt.common.DeviceStatusTaskPluginConfig; -import org.wso2.carbon.device.mgt.common.StartupOperationConfig; -import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManager; -import org.wso2.carbon.device.mgt.common.configuration.mgt.ConfigurationEntry; -import org.wso2.carbon.device.mgt.common.configuration.mgt.PlatformConfiguration; -import org.wso2.carbon.device.mgt.common.exceptions.DeviceManagementException; -import org.wso2.carbon.device.mgt.common.general.GeneralConfig; -import org.wso2.carbon.device.mgt.common.policy.mgt.PolicyMonitoringManager; -import org.wso2.carbon.device.mgt.common.pull.notification.PullNotificationSubscriber; -import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationConfig; -import org.wso2.carbon.device.mgt.common.spi.DeviceManagementService; -import org.wso2.carbon.device.mgt.common.type.mgt.DeviceTypePlatformDetails; -import org.wso2.carbon.device.mgt.mobile.android.impl.util.AndroidPluginConstants; -import org.wso2.carbon.device.mgt.mobile.android.internal.AndroidDeviceManagementDataHolder; - -import java.util.HashMap; -import java.util.List; - -/** - * This represents the Android implementation of DeviceManagerService. - */ -public class AndroidDeviceManagementService implements DeviceManagementService { - - private static final Log log = LogFactory.getLog(AndroidDeviceManagementService.class); - private DeviceManager deviceManager; - public static final String DEVICE_TYPE_ANDROID = "android"; - private static final String SUPER_TENANT_DOMAIN = "carbon.super"; - private static final String NOTIFIER_PROPERTY = "notifierType"; - private static final String FCM_API_KEY = "fcmAPIKey"; - private static final String FCM_SENDER_ID = "fcmSenderId"; - private PolicyMonitoringManager policyMonitoringManager; - - @Override - public String getType() { - return AndroidDeviceManagementService.DEVICE_TYPE_ANDROID; - } - - @Override - public OperationMonitoringTaskConfig getOperationMonitoringConfig() { - return null; - } - - @Override - public void init() throws DeviceManagementException { - - } - - @Override - public DeviceManager getDeviceManager() { - return deviceManager; - } - - @Override - public ApplicationManager getApplicationManager() { - return null; - } - - @Override - public ProvisioningConfig getProvisioningConfig() { - return new ProvisioningConfig(SUPER_TENANT_DOMAIN, true); - } - - @Override - public PushNotificationConfig getPushNotificationConfig() { - return null; - } - - @Override - public PolicyMonitoringManager getPolicyMonitoringManager() { - return policyMonitoringManager; - } - - @Override - public InitialOperationConfig getInitialOperationConfig() { - return null; - } - - @Override - public StartupOperationConfig getStartupOperationConfig() { - return null; - } - - @Override - public PullNotificationSubscriber getPullNotificationSubscriber() { - return null; - } - - @Override - public DeviceStatusTaskPluginConfig getDeviceStatusTaskPluginConfig() { - return null; - } - - @Override - public GeneralConfig getGeneralConfig() { - return null; - } - - @Override - public DeviceTypePlatformDetails getDeviceTypePlatformDetails() { return null; } - - private String getConfigProperty(List configs, String propertyName) { - for (ConfigurationEntry entry : configs) { - if (propertyName.equals(entry.getName())) { - return entry.getValue().toString(); - } - } - return null; - } -}