Add capability to filter apps by system installed apps or user installed apps

Implemented a feature to filter applications based on their type,
allowing users to choose between system apps and user-installed
apps. This enhancement improves the device app management experience by
providing more control over app visibility.

Users can now easily filter and view applications based on their
installation type.
classify-apps
Ruwin Dissanayake 3 weeks ago
parent dda253e66d
commit ab87a8199a

@ -55,7 +55,7 @@ public class Application implements Serializable {
@ApiModelProperty(name = "isActive", value = "Is the application actively running", required = true) @ApiModelProperty(name = "isActive", value = "Is the application actively running", required = true)
private boolean isActive; private boolean isActive;
@ApiModelProperty(name = "isSystemApp", value = "Is the application a system app", required = true) @ApiModelProperty(name = "isSystemApp", value = "Is the application a system app", required = true)
private boolean isSystemApp; private int isSystemApp;
@ApiModelProperty(name = "hourlyUsage", value = "App hourly usage") @ApiModelProperty(name = "hourlyUsage", value = "App hourly usage")
private long hourlyUsage; private long hourlyUsage;
@ApiModelProperty(name = "dailyUsage", value = "App daily usage") @ApiModelProperty(name = "dailyUsage", value = "App daily usage")
@ -188,11 +188,11 @@ public class Application implements Serializable {
isActive = active; isActive = active;
} }
public boolean isSystemApp() { public int isSystemApp() {
return isSystemApp; return isSystemApp;
} }
public void setSystemApp(boolean system) { public void setSystemApp(int system) {
isSystemApp = system; isSystemApp = system;
} }

@ -103,7 +103,7 @@ public interface ApplicationDAO {
* @param tenantId tenant ID * @param tenantId tenant ID
* @throws DeviceManagementDAOException If any database error occurred * @throws DeviceManagementDAOException If any database error occurred
*/ */
List<Application> getInstalledApplicationListOnDevice(int deviceId, int enrolmentId, int offset, int limit, int tenantId) List<Application> getInstalledApplicationListOnDevice(int deviceId, int enrolmentId, int offset, int limit, int tenantId, int isSystemApp)
throws DeviceManagementDAOException; throws DeviceManagementDAOException;
/** /**

@ -73,7 +73,7 @@ public class ApplicationDAOImpl implements ApplicationDAO {
stmt.setBoolean(11, application.isActive()); stmt.setBoolean(11, application.isActive());
stmt.setInt(12, deviceId); stmt.setInt(12, deviceId);
stmt.setInt(13, enrolmentId); stmt.setInt(13, enrolmentId);
stmt.setBoolean(14, application.isSystemApp()); stmt.setInt(14, application.isSystemApp());
stmt.addBatch(); stmt.addBatch();
} }
stmt.executeBatch(); stmt.executeBatch();
@ -105,7 +105,7 @@ public class ApplicationDAOImpl implements ApplicationDAO {
stmt.setString(7, application.getImageUrl()); stmt.setString(7, application.getImageUrl());
stmt.setInt(8, application.getMemoryUsage()); stmt.setInt(8, application.getMemoryUsage());
stmt.setBoolean(9, application.isActive()); stmt.setBoolean(9, application.isActive());
stmt.setBoolean(10, application.isSystemApp()); stmt.setInt(10, application.isSystemApp());
stmt.setInt(11, application.getId()); stmt.setInt(11, application.getId());
stmt.addBatch(); stmt.addBatch();
} }
@ -213,7 +213,7 @@ public class ApplicationDAOImpl implements ApplicationDAO {
try { try {
conn = this.getConnection(); conn = this.getConnection();
stmt = conn.prepareStatement("SELECT ID, NAME, APP_IDENTIFIER, PLATFORM, CATEGORY, VERSION, TYPE, " + stmt = conn.prepareStatement("SELECT ID, NAME, APP_IDENTIFIER, PLATFORM, CATEGORY, VERSION, TYPE, " +
"LOCATION_URL, IMAGE_URL, APP_PROPERTIES, MEMORY_USAGE, IS_ACTIVE, TENANT_ID " + "LOCATION_URL, IMAGE_URL, APP_PROPERTIES, MEMORY_USAGE, IS_ACTIVE, IS_SYSTEM_APP, TENANT_ID " +
"FROM DM_APPLICATION WHERE DEVICE_ID = ? AND ENROLMENT_ID = ? AND APP_IDENTIFIER = ? AND " + "FROM DM_APPLICATION WHERE DEVICE_ID = ? AND ENROLMENT_ID = ? AND APP_IDENTIFIER = ? AND " +
"VERSION = ? AND TENANT_ID = ?"); "VERSION = ? AND TENANT_ID = ?");
stmt.setInt(1, deviceId); stmt.setInt(1, deviceId);
@ -224,7 +224,7 @@ public class ApplicationDAOImpl implements ApplicationDAO {
rs = stmt.executeQuery(); rs = stmt.executeQuery();
if (rs.next()) { if (rs.next()) {
application = this.loadApplication(rs); application = this.loadApplicationDetails(rs);
} }
return application; return application;
} catch (SQLException e) { } catch (SQLException e) {
@ -239,6 +239,45 @@ public class ApplicationDAOImpl implements ApplicationDAO {
return DeviceManagementDAOFactory.getConnection(); return DeviceManagementDAOFactory.getConnection();
} }
private Application loadApplicationDetails(ResultSet rs) throws DeviceManagementDAOException {
ByteArrayInputStream bais;
ObjectInputStream ois;
Properties properties;
Application application = new Application();
try {
application.setId(rs.getInt("ID"));
application.setName(rs.getString("NAME"));
application.setType(rs.getString("TYPE"));
if (rs.getBytes("APP_PROPERTIES") != null) {
byte[] appProperties = rs.getBytes("APP_PROPERTIES");
bais = new ByteArrayInputStream(appProperties);
ois = new ObjectInputStream(bais);
properties = (Properties) ois.readObject();
application.setAppProperties(properties);
}
application.setCategory(rs.getString("CATEGORY"));
application.setImageUrl(rs.getString("IMAGE_URL"));
application.setLocationUrl(rs.getString("LOCATION_URL"));
application.setPlatform(rs.getString("PLATFORM"));
application.setVersion(rs.getString("VERSION"));
application.setMemoryUsage(rs.getInt("MEMORY_USAGE"));
application.setActive(rs.getBoolean("IS_ACTIVE"));
application.setSystemApp(rs.getInt("IS_SYSTEM_APP"));
application.setApplicationIdentifier(rs.getString("APP_IDENTIFIER"));
} catch (IOException e) {
throw new DeviceManagementDAOException("IO error occurred fetch at app properties", e);
} catch (ClassNotFoundException e) {
throw new DeviceManagementDAOException("Class not found error occurred fetch at app properties", e);
} catch (SQLException e) {
throw new DeviceManagementDAOException("SQL error occurred fetch at application", e);
}
return application;
}
@Override @Override
public List<Application> getInstalledApplications(int deviceId, int enrolmentId, int tenantId) public List<Application> getInstalledApplications(int deviceId, int enrolmentId, int tenantId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
@ -250,7 +289,7 @@ public class ApplicationDAOImpl implements ApplicationDAO {
try { try {
conn = this.getConnection(); conn = this.getConnection();
stmt = conn.prepareStatement("SELECT ID, NAME, APP_IDENTIFIER, PLATFORM, CATEGORY, VERSION, TYPE, " + stmt = conn.prepareStatement("SELECT ID, NAME, APP_IDENTIFIER, PLATFORM, CATEGORY, VERSION, TYPE, " +
"LOCATION_URL, IMAGE_URL, APP_PROPERTIES, MEMORY_USAGE, IS_ACTIVE, TENANT_ID FROM DM_APPLICATION " + "LOCATION_URL, IMAGE_URL, APP_PROPERTIES, MEMORY_USAGE, IS_ACTIVE, IS_SYSTEM_APP, TENANT_ID FROM DM_APPLICATION " +
"WHERE DEVICE_ID = ? AND ENROLMENT_ID = ? AND TENANT_ID = ?"); "WHERE DEVICE_ID = ? AND ENROLMENT_ID = ? AND TENANT_ID = ?");
stmt.setInt(1, deviceId); stmt.setInt(1, deviceId);
@ -259,7 +298,7 @@ public class ApplicationDAOImpl implements ApplicationDAO {
rs = stmt.executeQuery(); rs = stmt.executeQuery();
while (rs.next()) { while (rs.next()) {
application = loadApplication(rs); application = loadApplicationDetails(rs);
applications.add(application); applications.add(application);
} }
} catch (SQLException e) { } catch (SQLException e) {
@ -424,45 +463,7 @@ public class ApplicationDAOImpl implements ApplicationDAO {
return application; return application;
} }
private Application loadApplicationDetails(ResultSet rs) throws DeviceManagementDAOException {
ByteArrayInputStream bais;
ObjectInputStream ois;
Properties properties;
Application application = new Application();
try {
application.setId(rs.getInt("ID"));
application.setName(rs.getString("NAME"));
application.setType(rs.getString("TYPE"));
if (rs.getBytes("APP_PROPERTIES") != null) {
byte[] appProperties = rs.getBytes("APP_PROPERTIES");
bais = new ByteArrayInputStream(appProperties);
ois = new ObjectInputStream(bais);
properties = (Properties) ois.readObject();
application.setAppProperties(properties);
}
application.setCategory(rs.getString("CATEGORY"));
application.setImageUrl(rs.getString("IMAGE_URL"));
application.setLocationUrl(rs.getString("LOCATION_URL"));
application.setPlatform(rs.getString("PLATFORM"));
application.setVersion(rs.getString("VERSION"));
application.setMemoryUsage(rs.getInt("MEMORY_USAGE"));
application.setActive(rs.getBoolean("IS_ACTIVE"));
application.setSystemApp(rs.getBoolean("IS_SYSTEM_APP"));
application.setApplicationIdentifier(rs.getString("APP_IDENTIFIER"));
} catch (IOException e) {
throw new DeviceManagementDAOException("IO error occurred fetch at app properties", e);
} catch (ClassNotFoundException e) {
throw new DeviceManagementDAOException("Class not found error occurred fetch at app properties", e);
} catch (SQLException e) {
throw new DeviceManagementDAOException("SQL error occurred fetch at application", e);
}
return application;
}
@Override @Override
public void saveApplicationIcon(String iconPath, String packageName, String version, int tenantId) public void saveApplicationIcon(String iconPath, String packageName, String version, int tenantId)
@ -589,7 +590,7 @@ public class ApplicationDAOImpl implements ApplicationDAO {
} }
@Override @Override
public List<Application> getInstalledApplicationListOnDevice(int deviceId, int enrolmentId, int offset, int limit, int tenantId) public List<Application> getInstalledApplicationListOnDevice(int deviceId, int enrolmentId, int offset, int limit, int tenantId, int isSystemApp)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
Connection conn; Connection conn;
List<Application> applicationList = new ArrayList<>(); List<Application> applicationList = new ArrayList<>();
@ -613,16 +614,23 @@ public class ApplicationDAOImpl implements ApplicationDAO {
"WHERE DEVICE_ID = ? AND " + "WHERE DEVICE_ID = ? AND " +
"ENROLMENT_ID = ? AND " + "ENROLMENT_ID = ? AND " +
"TENANT_ID = ? " + "TENANT_ID = ? " +
(isSystemApp != 0 ? "AND IS_SYSTEM_APP = ? " : "") +
"LIMIT ? " + "LIMIT ? " +
"OFFSET ?"; "OFFSET ? ";
try { try {
conn = this.getConnection(); conn = this.getConnection();
try (PreparedStatement stmt = conn.prepareStatement(sql)) { try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, deviceId); stmt.setInt(1, deviceId);
stmt.setInt(2, enrolmentId); stmt.setInt(2, enrolmentId);
stmt.setInt(3, tenantId); stmt.setInt(3, tenantId);
stmt.setInt(4, limit); int paramIndex = 4;
stmt.setInt(5, offset); if (isSystemApp != 0) {
stmt.setInt(paramIndex, isSystemApp);
paramIndex++;
}
stmt.setInt(paramIndex, limit);
paramIndex++;
stmt.setInt(paramIndex, offset);
try (ResultSet rs = stmt.executeQuery()) { try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) { while (rs.next()) {
application = loadApplicationDetails(rs); application = loadApplicationDetails(rs);
@ -633,13 +641,14 @@ public class ApplicationDAOImpl implements ApplicationDAO {
} catch (SQLException e) { } catch (SQLException e) {
String msg = "SQL Error occurred while retrieving the list of Applications " + String msg = "SQL Error occurred while retrieving the list of Applications " +
"installed in device id '" + deviceId; "installed on device id '" + deviceId + "'";
log.error(msg, e); log.error(msg, e);
throw new DeviceManagementDAOException(msg, e); throw new DeviceManagementDAOException(msg, e);
} }
return applicationList; return applicationList;
} }
public List<Application> getInstalledApplicationListOnDevice(int deviceId, int enrolmentId, int tenantId) public List<Application> getInstalledApplicationListOnDevice(int deviceId, int enrolmentId, int tenantId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
Connection conn; Connection conn;

@ -1055,7 +1055,7 @@ public interface DeviceManagementProviderService {
* @return list of applications {@link Application} * @return list of applications {@link Application}
* @throws DeviceManagementException if any service level or DAO level error occurs * @throws DeviceManagementException if any service level or DAO level error occurs
*/ */
List<Application> getInstalledApplicationsOnDevice(Device device, int offset, int limit) List<Application> getInstalledApplicationsOnDevice(Device device, int offset, int limit, int isSystemApp)
throws DeviceManagementException; throws DeviceManagementException;
/** /**
* This method is for getting the installed application list of a device * This method is for getting the installed application list of a device

@ -5157,13 +5157,13 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
} }
@Override @Override
public List<Application> getInstalledApplicationsOnDevice(Device device, int offset, int limit) throws DeviceManagementException { public List<Application> getInstalledApplicationsOnDevice(Device device, int offset, int limit, int isSystemApp) throws DeviceManagementException {
List<Application> applications; List<Application> applications;
try { try {
DeviceManagementDAOFactory.openConnection(); DeviceManagementDAOFactory.openConnection();
int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
applications = applicationDAO.getInstalledApplicationListOnDevice(device.getId(), applications = applicationDAO.getInstalledApplicationListOnDevice(device.getId(),
device.getEnrolmentInfo().getId(), offset, limit, tenantId); device.getEnrolmentInfo().getId(), offset, limit, tenantId, isSystemApp);
if (applications == null) { if (applications == null) {
String msg = "Couldn't found applications for device identifier '" + device.getId() + "'"; String msg = "Couldn't found applications for device identifier '" + device.getId() + "'";
log.error(msg); log.error(msg);

@ -439,6 +439,7 @@ CREATE TABLE IF NOT EXISTS DM_APPLICATION (
APP_PROPERTIES BLOB NULL, APP_PROPERTIES BLOB NULL,
MEMORY_USAGE INTEGER NULL, MEMORY_USAGE INTEGER NULL,
IS_ACTIVE BOOLEAN NOT NULL DEFAULT FALSE, IS_ACTIVE BOOLEAN NOT NULL DEFAULT FALSE,
IS_SYSTEM_APP TINYINT NOT NULL DEFAULT 0,
DEVICE_ID INTEGER NOT NULL, DEVICE_ID INTEGER NOT NULL,
ENROLMENT_ID INTEGER NOT NULL, ENROLMENT_ID INTEGER NOT NULL,
TENANT_ID INTEGER NOT NULL, TENANT_ID INTEGER NOT NULL,

@ -405,6 +405,7 @@ CREATE TABLE IF NOT EXISTS DM_APPLICATION (
APP_PROPERTIES BLOB NULL, APP_PROPERTIES BLOB NULL,
MEMORY_USAGE INTEGER NULL, MEMORY_USAGE INTEGER NULL,
IS_ACTIVE BOOLEAN NOT NULL DEFAULT FALSE, IS_ACTIVE BOOLEAN NOT NULL DEFAULT FALSE,
IS_SYSTEM_APP TINYINT NOT NULL DEFAULT 0,
DEVICE_ID INTEGER NOT NULL, DEVICE_ID INTEGER NOT NULL,
ENROLMENT_ID INTEGER NOT NULL, ENROLMENT_ID INTEGER NOT NULL,
TENANT_ID INTEGER NOT NULL, TENANT_ID INTEGER NOT NULL,

@ -462,6 +462,7 @@ CREATE TABLE DM_APPLICATION (
APP_PROPERTIES VARBINARY(MAX) NULL, APP_PROPERTIES VARBINARY(MAX) NULL,
MEMORY_USAGE INTEGER NULL, MEMORY_USAGE INTEGER NULL,
IS_ACTIVE BIT NOT NULL DEFAULT 0, IS_ACTIVE BIT NOT NULL DEFAULT 0,
IS_SYSTEM_APP TINYINT NOT NULL DEFAULT 0,
DEVICE_ID INTEGER NOT NULL, DEVICE_ID INTEGER NOT NULL,
ENROLMENT_ID INTEGER NOT NULL, ENROLMENT_ID INTEGER NOT NULL,
TENANT_ID INTEGER NOT NULL, TENANT_ID INTEGER NOT NULL,

@ -462,6 +462,7 @@ CREATE TABLE IF NOT EXISTS DM_APPLICATION (
APP_PROPERTIES BLOB NULL, APP_PROPERTIES BLOB NULL,
MEMORY_USAGE INTEGER(10) NULL, MEMORY_USAGE INTEGER(10) NULL,
IS_ACTIVE BOOLEAN NOT NULL DEFAULT FALSE, IS_ACTIVE BOOLEAN NOT NULL DEFAULT FALSE,
IS_SYSTEM_APP TINYINT(1) NOT NULL DEFAULT 0,
DEVICE_ID INTEGER NOT NULL, DEVICE_ID INTEGER NOT NULL,
ENROLMENT_ID INTEGER NOT NULL, ENROLMENT_ID INTEGER NOT NULL,
TENANT_ID INTEGER NOT NULL, TENANT_ID INTEGER NOT NULL,

@ -728,6 +728,7 @@ CREATE TABLE DM_APPLICATION (
APP_PROPERTIES BLOB NULL, APP_PROPERTIES BLOB NULL,
MEMORY_USAGE NUMBER(10) NULL, MEMORY_USAGE NUMBER(10) NULL,
IS_ACTIVE NUMBER(10) DEFAULT 0 NOT NULL, IS_ACTIVE NUMBER(10) DEFAULT 0 NOT NULL,
IS_SYSTEM_APP NUMBER(1) DEFAULT 0 NOT NULL,
DEVICE_ID NUMBER(10) NOT NULL, DEVICE_ID NUMBER(10) NOT NULL,
ENROLMENT_ID NUMBER(10) NOT NULL, ENROLMENT_ID NUMBER(10) NOT NULL,
TENANT_ID NUMBER(10) NOT NULL, TENANT_ID NUMBER(10) NOT NULL,

@ -486,6 +486,7 @@ CREATE TABLE IF NOT EXISTS DM_APPLICATION (
APP_PROPERTIES BYTEA NULL, APP_PROPERTIES BYTEA NULL,
MEMORY_USAGE INTEGER NULL, MEMORY_USAGE INTEGER NULL,
IS_ACTIVE BOOLEAN NOT NULL DEFAULT FALSE, IS_ACTIVE BOOLEAN NOT NULL DEFAULT FALSE,
IS_SYSTEM_APP SMALLINT NOT NULL DEFAULT 0,
DEVICE_ID INTEGER NOT NULL, DEVICE_ID INTEGER NOT NULL,
ENROLMENT_ID INTEGER NOT NULL, ENROLMENT_ID INTEGER NOT NULL,
TENANT_ID INTEGER NOT NULL, TENANT_ID INTEGER NOT NULL,

Loading…
Cancel
Save