blob: 662f819c9eb29f311be5402dea72d8a5ad6e953a [file] [log] [blame]
/*
* 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<SimpleDateFormat> 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<String> 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.
*
* <p>{@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 <code>true</code> if and only if the file or directory is successfully deleted;
* <code>false</code> 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);
}
}