/* * Copyright (C) 2018 The Android Open Source Project * * Licensed 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 com.android.car.carlauncher; import android.annotation.Nullable; import android.car.CarNotConnectedException; import android.car.content.pm.CarPackageManager; import android.content.Context; import android.content.Intent; import android.content.pm.LauncherActivityInfo; import android.content.pm.LauncherApps; import android.content.pm.PackageManager; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.drawable.Drawable; import android.os.Process; import android.util.Log; import java.util.ArrayList; import java.util.Comparator; import java.util.List; /** * Util class that contains helper method used by app launcher classes. */ class AppLauncherUtils { private static final String TAG = "AppLauncherUtils"; private AppLauncherUtils() { } /** * Comparator for {@link AppMetaData} that sorts the list * by the "displayName" property in ascending order. */ static final Comparator ALPHABETICAL_COMPARATOR = Comparator .comparing(AppMetaData::getDisplayName, String::compareToIgnoreCase); /** * Helper method that launches the app given the app's AppMetaData. * * @param app the requesting app's AppMetaData */ static void launchApp(Context context, AppMetaData app) { Intent intent = context.getPackageManager().getLaunchIntentForPackage(app.getPackageName()); context.startActivity(intent); } /** * Converts a {@link Drawable} to grey scale. * * @param drawable the original drawable * @return the grey scale drawable */ static Drawable toGrayscale(Drawable drawable) { ColorMatrix matrix = new ColorMatrix(); matrix.setSaturation(0); ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); // deep copy the original drawable Drawable newDrawable = drawable.getConstantState().newDrawable().mutate(); newDrawable.setColorFilter(filter); return newDrawable; } /** * Gets all apps that support launching from launcher in unsorted order. * * @param launcherApps The {@link LauncherApps} system service * @param carPackageManager The {@link CarPackageManager} system service * @param packageManager The {@link PackageManager} system service * @return a list of all apps' metadata */ @Nullable static List getAllLaunchableApps( LauncherApps launcherApps, CarPackageManager carPackageManager, PackageManager packageManager) { if (launcherApps == null || carPackageManager == null || packageManager == null) { return null; } List apps = new ArrayList<>(); Intent intent = new Intent(Intent.ACTION_MAIN, null); intent.addCategory(Intent.CATEGORY_LAUNCHER); List availableActivities = launcherApps.getActivityList(null, Process.myUserHandle()); for (LauncherActivityInfo info : availableActivities) { String packageName = info.getComponentName().getPackageName(); boolean isDistractionOptimized = isActivityDistractionOptimized(carPackageManager, packageName, info.getName()); AppMetaData app = new AppMetaData( info.getLabel(), packageName, info.getApplicationInfo().loadIcon(packageManager), isDistractionOptimized); apps.add(app); } return apps; } /** * Gets if an activity is distraction optimized. * * @param carPackageManager The {@link CarPackageManager} system service * @param packageName The package name of the app * @param activityName The requested activity name * @return true if the supplied activity is distraction optimized */ static boolean isActivityDistractionOptimized( CarPackageManager carPackageManager, String packageName, String activityName) { boolean isDistractionOptimized = false; // try getting distraction optimization info try { if (carPackageManager != null) { isDistractionOptimized = carPackageManager.isActivityDistractionOptimized(packageName, activityName); } } catch (CarNotConnectedException e) { Log.e(TAG, "Car not connected when getting DO info", e); } return isDistractionOptimized; } }