aboutsummaryrefslogtreecommitdiff
path: root/partner_support/src/com/google/android/tv/partner/support/BaseCustomization.java
diff options
context:
space:
mode:
Diffstat (limited to 'partner_support/src/com/google/android/tv/partner/support/BaseCustomization.java')
-rw-r--r--partner_support/src/com/google/android/tv/partner/support/BaseCustomization.java93
1 files changed, 93 insertions, 0 deletions
diff --git a/partner_support/src/com/google/android/tv/partner/support/BaseCustomization.java b/partner_support/src/com/google/android/tv/partner/support/BaseCustomization.java
new file mode 100644
index 00000000..e40d90d7
--- /dev/null
+++ b/partner_support/src/com/google/android/tv/partner/support/BaseCustomization.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2017 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.google.android.tv.partner.support;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.os.Build;
+import android.util.Log;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Abstract class for TV Customization support.
+ *
+ * <p>Implement customization resources as needed in a child class.
+ */
+@TargetApi(Build.VERSION_CODES.N)
+@SuppressWarnings("AndroidApiChecker") // TODO(b/32513850) remove when error prone is updated
+public class BaseCustomization {
+ private static final boolean DEBUG = false;
+ private static final String TAG = "BaseCustomization";
+
+ // TODO move common aosp library
+
+ // TODO cache resource if performance suffers.
+
+ private static final String RES_TYPE_BOOLEAN = "bool";
+
+ private final String packageName;
+
+ protected BaseCustomization(Context context, String[] permissions) {
+ packageName = getFirstPackageNameWithPermissions(context, permissions);
+ }
+
+ public final String getPackageName() {
+ return packageName;
+ }
+
+ private static String getFirstPackageNameWithPermissions(
+ Context context, String[] permissions) {
+
+ List<PackageInfo> packageInfos =
+ context.getPackageManager().getPackagesHoldingPermissions(permissions, 0);
+ if (DEBUG) {
+ Log.d(TAG, "These packages have " + Arrays.toString(permissions) + ": " + packageInfos);
+ }
+ return packageInfos == null || packageInfos.size() == 0
+ ? ""
+ : packageInfos.get(0).packageName;
+ }
+
+ private static Resources getResourceForPackage(Context context, String packageName)
+ throws PackageManager.NameNotFoundException {
+ return context.getPackageManager().getResourcesForApplication(packageName);
+ }
+
+ public final Optional<Boolean> getBooleanResource(Context context, String resourceName) {
+ if (resourceName.isEmpty()) {
+ return Optional.empty();
+ }
+ try {
+ Resources res = getResourceForPackage(context, packageName);
+ int resId =
+ res == null
+ ? 0
+ : res.getIdentifier(resourceName, RES_TYPE_BOOLEAN, packageName);
+ if (DEBUG) {
+ Log.d(TAG, "Boolean resource " + resourceName + " has " + resId);
+ }
+ return resId == 0 ? Optional.empty() : Optional.of(res.getBoolean(resId));
+ } catch (PackageManager.NameNotFoundException e) {
+ return Optional.empty();
+ }
+ }
+}