package io.myweb.launcher; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import io.myweb.http.Response; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.List; import io.myweb.api.GET; import io.myweb.api.Produces; public class Launcher { private final static String SERVER_PACKAGE = "io.myweb.server.alpha"; @GET("/icon/:appName") @Produces("image/png") public Response getIcon(Context context, String appName) throws PackageManager.NameNotFoundException { BitmapDrawable icon = (BitmapDrawable) context.getPackageManager().getApplicationIcon(appName); return Response.ok().withBody(getIconInputStream(icon)); } @GET("/apps") public Response getApps(Context context) throws JSONException { JSONObject response = new JSONObject(); response.put("apps", getJsonApps(context, context.getPackageManager())); return Response.ok().withBody(response); } private ByteArrayInputStream getIconInputStream(BitmapDrawable icon) { ByteArrayOutputStream out = new ByteArrayOutputStream(); icon.getBitmap().compress(Bitmap.CompressFormat.PNG, 100, out); return new ByteArrayInputStream(out.toByteArray()); } private JSONArray getJsonApps(Context context, PackageManager packageManager) throws JSONException { List<ApplicationInfo> apps = packageManager.getInstalledApplications(PackageManager.GET_SERVICES); JSONArray jsonApps = new JSONArray(); for (ApplicationInfo app : apps) { if (hasRequestPermission(packageManager, app) && notLauncherOrServerApp(context, app)) { jsonApps.put(buildJsonApp(packageManager, app)); } } return jsonApps; } private JSONObject buildJsonApp(PackageManager packageManager, ApplicationInfo app) throws JSONException { JSONObject jsonApp = new JSONObject(); jsonApp.put("name", app.loadLabel(packageManager)); jsonApp.put("package", app.packageName); return jsonApp; } private boolean notLauncherOrServerApp(Context context, ApplicationInfo app) { return !(context.getPackageName().equals(app.packageName) || SERVER_PACKAGE.equals(app.packageName)); } private boolean hasRequestPermission(PackageManager packageManager, ApplicationInfo app) { return PackageManager.PERMISSION_GRANTED == packageManager.checkPermission(Manifest.permission.REQUEST, app.packageName); } }