| /* |
| * Copyright (c) 2016, 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.stream.media; |
| |
| import android.content.ComponentName; |
| import android.content.Context; |
| import android.content.pm.ApplicationInfo; |
| import android.content.pm.PackageManager; |
| import android.content.pm.ServiceInfo; |
| import android.content.res.Resources; |
| import android.content.res.TypedArray; |
| import android.util.Log; |
| |
| /** |
| * An immutable class which hold the the information about the currently connected media app, if |
| * it supports {@link android.service.media.MediaBrowserService}. |
| */ |
| public class MediaAppInfo { |
| private static final String TAG = "MediaAppInfo"; |
| private static final String KEY_SMALL_ICON = |
| "com.google.android.gms.car.notification.SmallIcon"; |
| |
| /** Third-party defined application theme to use **/ |
| private static final String THEME_META_DATA_NAME |
| = "com.google.android.gms.car.application.theme"; |
| |
| private final ComponentName mComponentName; |
| private final Resources mPackageResources; |
| private final String mAppName; |
| private final String mPackageName; |
| private final int mSmallIcon; |
| |
| private int mPrimaryColor; |
| private int mPrimaryColorDark; |
| private int mAccentColor; |
| |
| public MediaAppInfo(Context context, String packageName) { |
| Resources resources = null; |
| try { |
| resources = context.getPackageManager().getResourcesForApplication(packageName); |
| } catch (PackageManager.NameNotFoundException e) { |
| Log.e(TAG, "Unable to get resources for " + packageName); |
| } |
| mPackageResources = resources; |
| |
| mComponentName = MediaUtils.getMediaBrowserService(packageName, context); |
| String appName = null; |
| int smallIconResId = 0; |
| try { |
| PackageManager packageManager = context.getPackageManager(); |
| ServiceInfo serviceInfo = null; |
| ApplicationInfo appInfo = packageManager.getApplicationInfo(packageName, |
| PackageManager.GET_META_DATA); |
| |
| int labelResId; |
| |
| if (mComponentName != null) { |
| serviceInfo = |
| packageManager.getServiceInfo(mComponentName, PackageManager.GET_META_DATA); |
| smallIconResId = serviceInfo.metaData == null ? 0 : serviceInfo.metaData.getInt |
| (KEY_SMALL_ICON, 0); |
| labelResId = serviceInfo.labelRes; |
| } else { |
| Log.w(TAG, "Service label is null for " + packageName + |
| ". Falling back to app name."); |
| labelResId = appInfo.labelRes; |
| } |
| |
| int appTheme = 0; |
| if (serviceInfo != null && serviceInfo.metaData != null) { |
| appTheme = serviceInfo.metaData.getInt(THEME_META_DATA_NAME); |
| } |
| if (appTheme == 0 && appInfo.metaData != null) { |
| appTheme = appInfo.metaData.getInt(THEME_META_DATA_NAME); |
| } |
| if (appTheme == 0) { |
| appTheme = appInfo.theme; |
| } |
| |
| fetchAppColors(packageName, appTheme, context); |
| appName = (labelResId == 0 || mPackageResources == null) ? null |
| : mPackageResources.getString(labelResId); |
| } catch (PackageManager.NameNotFoundException e) { |
| Log.e(TAG, "Got a component that doesn't exist (" + packageName + ")"); |
| } |
| mSmallIcon = smallIconResId; |
| mAppName = appName; |
| |
| mPackageName = packageName; |
| } |
| |
| public ComponentName getComponentName() { |
| return mComponentName; |
| } |
| |
| public String getAppName() { |
| return mAppName; |
| } |
| |
| public int getSmallIcon() { |
| return mSmallIcon; |
| } |
| |
| public String getPackageName() { |
| return mPackageName; |
| } |
| |
| public Resources getPackageResources() { |
| return mPackageResources; |
| } |
| |
| public int getMediaClientPrimaryColor() { |
| return mPrimaryColor; |
| } |
| |
| public int getMediaClientPrimaryColorDark() { |
| return mPrimaryColorDark; |
| } |
| |
| public int getMediaClientAccentColor() { |
| return mAccentColor; |
| } |
| |
| private void fetchAppColors(String packageName, int appTheme, Context context) { |
| TypedArray ta = null; |
| try { |
| Context packageContext = context.createPackageContext(packageName, 0); |
| packageContext.setTheme(appTheme); |
| Resources.Theme theme = packageContext.getTheme(); |
| ta = theme.obtainStyledAttributes(new int[]{ |
| android.R.attr.colorPrimary, |
| android.R.attr.colorAccent, |
| android.R.attr.colorPrimaryDark |
| }); |
| int defaultColor = |
| context.getColor(android.R.color.holo_green_light); |
| mPrimaryColor = ta.getColor(0, defaultColor); |
| mAccentColor = ta.getColor(1, defaultColor); |
| mPrimaryColorDark = ta.getColor(2, defaultColor); |
| } catch (PackageManager.NameNotFoundException e) { |
| Log.e(TAG, "Unable to update media client package attributes.", e); |
| } finally { |
| if (ta != null) { |
| ta.recycle(); |
| } |
| } |
| } |
| } |