diff options
Diffstat (limited to 'common/src/com/android/tv/common/util/CommonUtils.java')
-rw-r--r-- | common/src/com/android/tv/common/util/CommonUtils.java | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/common/src/com/android/tv/common/util/CommonUtils.java b/common/src/com/android/tv/common/util/CommonUtils.java new file mode 100644 index 00000000..305431d3 --- /dev/null +++ b/common/src/com/android/tv/common/util/CommonUtils.java @@ -0,0 +1,154 @@ +/* + * 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.BuildConfig; +import com.android.tv.common.CommonConstants; +import com.android.tv.common.actions.InputSetupActionUtils; +import com.android.tv.common.experiments.Experiments; +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"); + } + + 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 Live TV. */ + public static boolean isPackagedWithLiveChannels(Context context) { + return (CommonConstants.BASE_PACKAGE.equals(context.getPackageName())); + } + + /** Returns true if the current user is a developer. */ + public static boolean isDeveloper() { + return BuildConfig.ENG || Experiments.ENABLE_DEVELOPER_FEATURES.get(); + } + + /** 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. */ + public static void deleteDirOrFile(File fileOrDirectory) { + if (fileOrDirectory.isDirectory()) { + for (File child : fileOrDirectory.listFiles()) { + deleteDirOrFile(child); + } + } + fileOrDirectory.delete(); + } + + public static boolean isRoboTest() { + return "robolectric".equals(Build.FINGERPRINT); + } +} |