/* * Copyright 2015 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.tv.common.util; import android.content.Context; import android.content.Intent; import android.media.tv.TvInputInfo; import android.os.Build; import android.util.ArraySet; import android.util.Log; import com.android.tv.common.CommonConstants; import com.android.tv.common.actions.InputSetupActionUtils; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.Set; /** Util class for common use in TV app and inputs. */ @SuppressWarnings("AndroidApiChecker") // TODO(b/32513850) remove when error prone is updated public final class CommonUtils { private static final String TAG = "CommonUtils"; private static final ThreadLocal ISO_8601 = new ThreadLocal() { private final SimpleDateFormat value = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US); @Override protected SimpleDateFormat initialValue() { return value; } }; // Hardcoded list for known bundled inputs not written by OEM/SOCs. // Bundled (system) inputs not in the list will get the high priority // so they and their channels come first in the UI. private static final Set BUNDLED_PACKAGE_SET = new ArraySet<>(); static { BUNDLED_PACKAGE_SET.add("com.android.tv"); // AOSP_Comment_Out BUNDLED_PACKAGE_SET.add(CommonConstants.BASE_PACKAGE); } private static Boolean sRunningInTest; private CommonUtils() {} /** * Returns an intent to start the setup activity for the TV input using {@link * InputSetupActionUtils#INTENT_ACTION_INPUT_SETUP}. */ public static Intent createSetupIntent(Intent originalSetupIntent, String inputId) { if (originalSetupIntent == null) { return null; } Intent setupIntent = new Intent(originalSetupIntent); if (!InputSetupActionUtils.hasInputSetupAction(originalSetupIntent)) { Intent intentContainer = new Intent(InputSetupActionUtils.INTENT_ACTION_INPUT_SETUP); intentContainer.putExtra(InputSetupActionUtils.EXTRA_SETUP_INTENT, originalSetupIntent); intentContainer.putExtra(InputSetupActionUtils.EXTRA_INPUT_ID, inputId); setupIntent = intentContainer; } return setupIntent; } /** * Returns an intent to start the setup activity for this TV input using {@link * InputSetupActionUtils#INTENT_ACTION_INPUT_SETUP}. */ public static Intent createSetupIntent(TvInputInfo input) { return createSetupIntent(input.createSetupIntent(), input.getId()); } /** * Checks if this application is running in tests. * *

{@link android.app.ActivityManager#isRunningInTestHarness} doesn't return {@code true} for * the usual devices even the application is running in tests. We need to figure it out by * checking whether the class in tv-tests-common module can be loaded or not. */ public static synchronized boolean isRunningInTest() { if (sRunningInTest == null) { try { Class.forName("com.android.tv.testing.utils.Utils"); Log.i( TAG, "Assumed to be running in a test because" + " com.android.tv.testing.utils.Utils is found"); sRunningInTest = true; } catch (ClassNotFoundException e) { sRunningInTest = false; } } return sRunningInTest; } /** Checks whether a given package is in our bundled package set. */ public static boolean isInBundledPackageSet(String packageName) { return BUNDLED_PACKAGE_SET.contains(packageName); } /** Checks whether a given input is a bundled input. */ public static boolean isBundledInput(String inputId) { for (String prefix : BUNDLED_PACKAGE_SET) { if (inputId.startsWith(prefix + "/")) { return true; } } return false; } /** Returns true if the application is packaged with TV app. */ public static boolean isPackagedWithLiveChannels(Context context) { return (CommonConstants.BASE_PACKAGE.equals(context.getPackageName())); } /** Converts time in milliseconds to a ISO 8061 string. */ public static String toIsoDateTimeString(long timeMillis) { return ISO_8601.get().format(new Date(timeMillis)); } /** * Deletes a file or a directory. * * @return true if and only if the file or directory is successfully deleted; * false otherwise */ public static boolean deleteDirOrFile(File fileOrDirectory) { if (fileOrDirectory.isDirectory()) { File[] files = fileOrDirectory.listFiles(); if (files != null) { for (File child : files) { deleteDirOrFile(child); } } } // If earlier deletes failed this will also return fileOrDirectory.delete(); } public static boolean isRoboTest() { return "robolectric".equals(Build.FINGERPRINT); } }