aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/com/android/tv/MainActivity.java45
-rw-r--r--src/com/android/tv/SetupPassthroughActivity.java13
-rw-r--r--src/com/android/tv/TimeShiftManager.java86
-rw-r--r--src/com/android/tv/data/ProgramDataManager.java18
-rw-r--r--src/com/android/tv/data/ProgramImpl.java4
-rw-r--r--src/com/android/tv/dvr/data/RecordedProgram.java2
-rw-r--r--src/com/android/tv/features/TvFeatures.java4
-rw-r--r--src/com/android/tv/guide/ProgramManager.java7
-rw-r--r--src/com/android/tv/menu/MenuRowView.java3
-rw-r--r--src/com/android/tv/menu/MenuView.java7
-rw-r--r--src/com/android/tv/parental/ContentRatingSystem.java2
-rw-r--r--src/com/android/tv/recommendation/NotificationService.java3
-rw-r--r--src/com/android/tv/util/GtvUtils.java56
-rw-r--r--src/com/android/tv/util/TvInputManagerHelper.java18
14 files changed, 169 insertions, 99 deletions
diff --git a/src/com/android/tv/MainActivity.java b/src/com/android/tv/MainActivity.java
index 5cfdd194..8dbafe47 100644
--- a/src/com/android/tv/MainActivity.java
+++ b/src/com/android/tv/MainActivity.java
@@ -149,6 +149,7 @@ import com.android.tv.ui.sidepanel.parentalcontrols.RatingsFragment;
import com.android.tv.util.AsyncDbTask;
import com.android.tv.util.AsyncDbTask.DbExecutor;
import com.android.tv.util.CaptionSettings;
+import com.android.tv.util.GtvUtils;
import com.android.tv.util.OnboardingUtils;
import com.android.tv.util.SetupUtils;
import com.android.tv.util.TvInputManagerHelper;
@@ -230,20 +231,20 @@ public class MainActivity extends Activity
private static final String SCREEN_BEHIND_NAME = "Behind";
private static final float REFRESH_RATE_EPSILON = 0.01f;
- private static final HashSet<Integer> BLACKLIST_KEYCODE_TO_TIS;
+ private static final HashSet<Integer> BLOCKLIST_KEYCODE_TO_TIS;
// These keys won't be passed to TIS in addition to gamepad buttons.
static {
- BLACKLIST_KEYCODE_TO_TIS = new HashSet<>();
- BLACKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_TV_INPUT);
- BLACKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_MENU);
- BLACKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_CHANNEL_UP);
- BLACKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_CHANNEL_DOWN);
- BLACKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_VOLUME_UP);
- BLACKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_VOLUME_DOWN);
- BLACKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_VOLUME_MUTE);
- BLACKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_MUTE);
- BLACKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_SEARCH);
- BLACKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_WINDOW);
+ BLOCKLIST_KEYCODE_TO_TIS = new HashSet<>();
+ BLOCKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_TV_INPUT);
+ BLOCKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_MENU);
+ BLOCKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_CHANNEL_UP);
+ BLOCKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_CHANNEL_DOWN);
+ BLOCKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_VOLUME_UP);
+ BLOCKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_VOLUME_DOWN);
+ BLOCKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_VOLUME_MUTE);
+ BLOCKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_MUTE);
+ BLOCKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_SEARCH);
+ BLOCKLIST_KEYCODE_TO_TIS.add(KeyEvent.KEYCODE_WINDOW);
}
private static final IntentFilter SYSTEM_INTENT_FILTER = new IntentFilter();
@@ -330,7 +331,7 @@ public class MainActivity extends Activity
private boolean mActivityResumed;
private boolean mActivityStarted;
private boolean mShouldTuneToTunerChannel;
- private boolean mUseKeycodeBlacklist;
+ private boolean mUseKeycodeBlocklist;
private boolean mShowLockedChannelsTemporarily;
private boolean mBackKeyPressed;
private boolean mNeedShowBackKeyGuide;
@@ -456,7 +457,11 @@ public class MainActivity extends Activity
}
@Override
- public void onChannelChanged(Channel previousChannel, Channel currentChannel) {}
+ public void onChannelChanged(Channel previousChannel, Channel currentChannel) {
+ if (currentChannel != null) {
+ GtvUtils.broadcastInputId(MainActivity.this, currentChannel.getInputId());
+ }
+ }
};
private final Runnable mRestoreMainViewRunnable = this::restoreMainTvView;
@@ -1441,16 +1446,16 @@ public class MainActivity extends Activity
|| mOverlayManager.getSideFragmentManager().isActive()) {
return super.dispatchKeyEvent(event);
}
- if (BLACKLIST_KEYCODE_TO_TIS.contains(event.getKeyCode())
+ if (BLOCKLIST_KEYCODE_TO_TIS.contains(event.getKeyCode())
|| KeyEvent.isGamepadButton(event.getKeyCode())) {
- // If the event is in blacklisted or gamepad key, do not pass it to session.
- // Gamepad keys are blacklisted to support TV UIs and here's the detail.
+ // If the event is in blocklisted or gamepad key, do not pass it to session.
+ // Gamepad keys are blocklisted to support TV UIs and here's the detail.
// If there's a TIS granted RECEIVE_INPUT_EVENT, TIF sends key events to TIS
// and return immediately saying that the event is handled.
// In this case, fallback key will be injected but with FLAG_CANCELED
// while gamepads support DPAD_CENTER and BACK by fallback.
// Since we don't expect that TIS want to handle gamepad buttons now,
- // blacklist gamepad buttons and wait for next fallback keys.
+ // blocklist gamepad buttons and wait for next fallback keys.
// TODO: Need to consider other fallback keys (e.g. ESCAPE)
return super.dispatchKeyEvent(event);
}
@@ -2215,7 +2220,7 @@ public class MainActivity extends Activity
if (event.isCanceled()) {
// Ignore canceled key.
// Note that if there's a TIS granted RECEIVE_INPUT_EVENT,
- // fallback keys not blacklisted will have FLAG_CANCELED.
+ // fallback keys not blocklisted will have FLAG_CANCELED.
// See dispatchKeyEvent() for detail.
return true;
}
@@ -2330,7 +2335,7 @@ public class MainActivity extends Activity
return true;
case KeyEvent.KEYCODE_CTRL_LEFT:
case KeyEvent.KEYCODE_CTRL_RIGHT:
- mUseKeycodeBlacklist = !mUseKeycodeBlacklist;
+ mUseKeycodeBlocklist = !mUseKeycodeBlocklist;
return true;
case KeyEvent.KEYCODE_O:
mOverlayManager.getSideFragmentManager().show(new DisplayModeFragment());
diff --git a/src/com/android/tv/SetupPassthroughActivity.java b/src/com/android/tv/SetupPassthroughActivity.java
index 25049f1d..e7f89108 100644
--- a/src/com/android/tv/SetupPassthroughActivity.java
+++ b/src/com/android/tv/SetupPassthroughActivity.java
@@ -118,13 +118,12 @@ public class SetupPassthroughActivity extends Activity {
setupIntent.putExtras(extras);
try {
ComponentName callingActivity = getCallingActivity();
- if (callingActivity != null
- && !callingActivity.getPackageName().equals(CommonConstants.BASE_PACKAGE)) {
- Log.w(
- TAG,
- "Calling activity "
- + callingActivity.getPackageName()
- + " is not trusted. Not forwarding intent.");
+ if (callingActivity == null
+ || !callingActivity.getPackageName().equals(CommonConstants.BASE_PACKAGE)) {
+ String name =
+ callingActivity == null ? "null" : callingActivity.getPackageName();
+ Log.w(TAG,
+ "Calling activity " + name + " is not trusted. Not forwarding intent.");
finish();
return;
}
diff --git a/src/com/android/tv/TimeShiftManager.java b/src/com/android/tv/TimeShiftManager.java
index f08b5e85..3167a631 100644
--- a/src/com/android/tv/TimeShiftManager.java
+++ b/src/com/android/tv/TimeShiftManager.java
@@ -110,7 +110,7 @@ public class TimeShiftManager {
private static final int MSG_GET_CURRENT_POSITION = 1000;
private static final int MSG_PREFETCH_PROGRAM = 1001;
private static final long REQUEST_CURRENT_POSITION_INTERVAL = TimeUnit.SECONDS.toMillis(1);
- private static final long MAX_DUMMY_PROGRAM_DURATION = TimeUnit.MINUTES.toMillis(30);
+ private static final long MAX_PLACEHOLDER_PROGRAM_DURATION = TimeUnit.MINUTES.toMillis(30);
@VisibleForTesting static final long INVALID_TIME = -1;
static final long CURRENT_TIME = -2;
private static final long PREFETCH_TIME_OFFSET_FROM_PROGRAM_END = TimeUnit.MINUTES.toMillis(1);
@@ -489,7 +489,7 @@ public class TimeShiftManager {
Program program = mProgramManager.getProgramAt(timeMs);
if (program == null) {
// Guard just in case when the program prefetch handler doesn't work on time.
- mProgramManager.addDummyProgramsAt(timeMs);
+ mProgramManager.addPlaceholderProgramsAt(timeMs);
program = mProgramManager.getProgramAt(timeMs);
}
return program;
@@ -544,8 +544,8 @@ public class TimeShiftManager {
/**
* Returns the current program which airs right now.
*
- * <p>If the program is a dummy program, which means there's no program information, returns
- * {@code null}.
+ * <p>If the program is a placeholder program, which means there's no program information,
+ * returns {@code null}.
*/
@Nullable
public Program getCurrentProgram() {
@@ -909,11 +909,11 @@ public class TimeShiftManager {
prefetchStartTimeMs = program.getEndTimeUtcMillis();
} else {
prefetchStartTimeMs =
- Utils.floorTime(currentPositionMs, MAX_DUMMY_PROGRAM_DURATION);
+ Utils.floorTime(currentPositionMs, MAX_PLACEHOLDER_PROGRAM_DURATION);
}
- // Create dummy program
+ // Create placeholder program
mPrograms.addAll(
- createDummyPrograms(
+ createPlaceholderPrograms(
prefetchStartTimeMs,
currentPositionMs + PREFETCH_DURATION_FOR_NEXT));
schedulePrefetchPrograms();
@@ -929,12 +929,12 @@ public class TimeShiftManager {
endTimeMs = System.currentTimeMillis();
}
- long fetchStartTimeMs = Utils.floorTime(startTimeMs, MAX_DUMMY_PROGRAM_DURATION);
+ long fetchStartTimeMs = Utils.floorTime(startTimeMs, MAX_PLACEHOLDER_PROGRAM_DURATION);
long fetchEndTimeMs =
Utils.ceilTime(
- endTimeMs + PREFETCH_DURATION_FOR_NEXT, MAX_DUMMY_PROGRAM_DURATION);
+ endTimeMs + PREFETCH_DURATION_FOR_NEXT, MAX_PLACEHOLDER_PROGRAM_DURATION);
removeOutdatedPrograms(fetchStartTimeMs);
- boolean needToLoad = addDummyPrograms(fetchStartTimeMs, fetchEndTimeMs);
+ boolean needToLoad = addPlaceholderPrograms(fetchStartTimeMs, fetchEndTimeMs);
if (needToLoad) {
Range<Long> period = Range.create(fetchStartTimeMs, fetchEndTimeMs);
mProgramLoadQueue.add(period);
@@ -983,60 +983,60 @@ public class TimeShiftManager {
}
}
- void addDummyProgramsAt(long timeMs) {
- addDummyPrograms(timeMs, timeMs + PREFETCH_DURATION_FOR_NEXT);
+ void addPlaceholderProgramsAt(long timeMs) {
+ addPlaceholderPrograms(timeMs, timeMs + PREFETCH_DURATION_FOR_NEXT);
}
- private boolean addDummyPrograms(Range<Long> period) {
- return addDummyPrograms(period.getLower(), period.getUpper());
+ private boolean addPlaceholderPrograms(Range<Long> period) {
+ return addPlaceholderPrograms(period.getLower(), period.getUpper());
}
- private boolean addDummyPrograms(long startTimeMs, long endTimeMs) {
+ private boolean addPlaceholderPrograms(long startTimeMs, long endTimeMs) {
boolean added = false;
if (mPrograms.isEmpty()) {
- // Insert dummy program.
- mPrograms.addAll(createDummyPrograms(startTimeMs, endTimeMs));
+ // Insert placeholder program.
+ mPrograms.addAll(createPlaceholderPrograms(startTimeMs, endTimeMs));
return true;
}
- // Insert dummy program to the head of the list if needed.
+ // Insert placeholder program to the head of the list if needed.
Program firstProgram = mPrograms.get(0);
if (startTimeMs < firstProgram.getStartTimeUtcMillis()) {
if (!firstProgram.isValid()) {
- // Already the firstProgram is dummy.
+ // Already the firstProgram is a placeholder.
mPrograms.remove(0);
mPrograms.addAll(
0,
- createDummyPrograms(startTimeMs, firstProgram.getEndTimeUtcMillis()));
+ createPlaceholderPrograms(startTimeMs, firstProgram.getEndTimeUtcMillis()));
} else {
mPrograms.addAll(
0,
- createDummyPrograms(startTimeMs, firstProgram.getStartTimeUtcMillis()));
+ createPlaceholderPrograms(startTimeMs, firstProgram.getStartTimeUtcMillis()));
}
added = true;
}
- // Insert dummy program to the tail of the list if needed.
+ // Insert placeholder program to the tail of the list if needed.
Program lastProgram = mPrograms.get(mPrograms.size() - 1);
if (endTimeMs > lastProgram.getEndTimeUtcMillis()) {
if (!lastProgram.isValid()) {
- // Already the lastProgram is dummy.
+ // Already the lastProgram is a placeholder.
mPrograms.remove(mPrograms.size() - 1);
mPrograms.addAll(
- createDummyPrograms(lastProgram.getStartTimeUtcMillis(), endTimeMs));
+ createPlaceholderPrograms(lastProgram.getStartTimeUtcMillis(), endTimeMs));
} else {
mPrograms.addAll(
- createDummyPrograms(lastProgram.getEndTimeUtcMillis(), endTimeMs));
+ createPlaceholderPrograms(lastProgram.getEndTimeUtcMillis(), endTimeMs));
}
added = true;
}
- // Insert dummy programs if the holes exist in the list.
+ // Insert placeholder programs if the holes exist in the list.
for (int i = 1; i < mPrograms.size(); ++i) {
long endOfPrevious = mPrograms.get(i - 1).getEndTimeUtcMillis();
long startOfCurrent = mPrograms.get(i).getStartTimeUtcMillis();
if (startOfCurrent > endOfPrevious) {
- List<Program> dummyPrograms =
- createDummyPrograms(endOfPrevious, startOfCurrent);
- mPrograms.addAll(i, dummyPrograms);
- i += dummyPrograms.size();
+ List<Program> placeholderPrograms =
+ createPlaceholderPrograms(endOfPrevious, startOfCurrent);
+ mPrograms.addAll(i, placeholderPrograms);
+ i += placeholderPrograms.size();
added = true;
}
}
@@ -1049,7 +1049,7 @@ public class TimeShiftManager {
}
}
- private void removeDummyPrograms() {
+ private void removePlaceholderPrograms() {
for (Iterator<Program> it = mPrograms.listIterator(); it.hasNext(); ) {
if (!it.next().isValid()) {
it.remove();
@@ -1084,18 +1084,18 @@ public class TimeShiftManager {
}
}
- // Returns a list of dummy programs.
- // The maximum duration of a dummy program is {@link MAX_DUMMY_PROGRAM_DURATION}.
+ // Returns a list of placeholder programs.
+ // The maximum duration of a placeholder program is {@link MAX_PLACEHOLDER_PROGRAM_DURATION}.
// So if the duration ({@code endTimeMs}-{@code startTimeMs}) is greater than the duration,
- // we need to create multiple dummy programs.
+ // we need to create multiple placeholder programs.
// The reason of the limitation of the duration is because we want the trick play viewer
- // to show the time-line duration of {@link MAX_DUMMY_PROGRAM_DURATION} at most
- // for a dummy program.
- private List<Program> createDummyPrograms(long startTimeMs, long endTimeMs) {
+ // to show the time-line duration of {@link MAX_PLACEHOLDER_PROGRAM_DURATION} at most
+ // for a placeholder program.
+ private List<Program> createPlaceholderPrograms(long startTimeMs, long endTimeMs) {
SoftPreconditions.checkArgument(
endTimeMs - startTimeMs <= TWO_WEEKS_MS,
TAG,
- "createDummyProgram: long duration of dummy programs are requested ( %s , %s)",
+ "createPlaceholderProgram: long duration of placeholder programs are requested ( %s , %s)",
Utils.toTimeString(startTimeMs),
Utils.toTimeString(endTimeMs));
if (startTimeMs >= endTimeMs) {
@@ -1103,7 +1103,7 @@ public class TimeShiftManager {
}
List<Program> programs = new ArrayList<>();
long start = startTimeMs;
- long end = Utils.ceilTime(startTimeMs, MAX_DUMMY_PROGRAM_DURATION);
+ long end = Utils.ceilTime(startTimeMs, MAX_PLACEHOLDER_PROGRAM_DURATION);
while (end < endTimeMs) {
programs.add(
new ProgramImpl.Builder()
@@ -1111,7 +1111,7 @@ public class TimeShiftManager {
.setEndTimeUtcMillis(end)
.build());
start = end;
- end += MAX_DUMMY_PROGRAM_DURATION;
+ end += MAX_PLACEHOLDER_PROGRAM_DURATION;
}
programs.add(
new ProgramImpl.Builder()
@@ -1256,7 +1256,7 @@ public class TimeShiftManager {
}
if (programs == null || programs.isEmpty()) {
mEmptyFetchCount++;
- if (addDummyPrograms(mPeriod)) {
+ if (addPlaceholderPrograms(mPeriod)) {
TimeShiftManager.this.onProgramInfoChanged();
}
schedulePrefetchPrograms();
@@ -1265,7 +1265,7 @@ public class TimeShiftManager {
}
mEmptyFetchCount = 0;
if (!mPrograms.isEmpty()) {
- removeDummyPrograms();
+ removePlaceholderPrograms();
removeOverlappedPrograms(programs);
Program loadedProgram = programs.get(0);
for (int i = 0; i < mPrograms.size() && !programs.isEmpty(); ++i) {
@@ -1282,7 +1282,7 @@ public class TimeShiftManager {
}
}
mPrograms.addAll(programs);
- addDummyPrograms(mPeriod);
+ addPlaceholderPrograms(mPeriod);
TimeShiftManager.this.onProgramInfoChanged();
schedulePrefetchPrograms();
startNextLoadingIfNeeded();
diff --git a/src/com/android/tv/data/ProgramDataManager.java b/src/com/android/tv/data/ProgramDataManager.java
index a866c78e..dcfa69e2 100644
--- a/src/com/android/tv/data/ProgramDataManager.java
+++ b/src/com/android/tv/data/ProgramDataManager.java
@@ -402,7 +402,7 @@ public class ProgramDataManager implements MemoryManageable {
*
* <p>Prefetch should be enabled to call it.
*
- * @return {@link List} with Programs. It may includes dummy program if the entry needs DB
+ * @return {@link List} with Programs. It may includes stub program if the entry needs DB
* operations to get.
*/
public List<Program> getPrograms(long channelId, long startTime) {
@@ -425,7 +425,7 @@ public class ProgramDataManager implements MemoryManageable {
private int getProgramIndexAt(List<Program> programs, long time) {
Program key = mZeroLengthProgramCache.get(time);
if (key == null) {
- key = createDummyProgram(time, time);
+ key = createStubProgram(time, time);
mZeroLengthProgramCache.put(time, key);
}
int index = Collections.binarySearch(programs, key);
@@ -527,11 +527,11 @@ public class ProgramDataManager implements MemoryManageable {
continue;
}
- // Update dummy program around current program if any.
+ // Update stub program around current program if any.
if (cachedProgram.getStartTimeUtcMillis() < currentProgram.getStartTimeUtcMillis()) {
- // The dummy program starts earlier than the current program. Adjust its end time.
+ // The stub program starts earlier than the current program. Adjust its end time.
i.set(
- createDummyProgram(
+ createStubProgram(
cachedProgram.getStartTimeUtcMillis(),
currentProgram.getStartTimeUtcMillis()));
i.add(currentProgram);
@@ -539,9 +539,9 @@ public class ProgramDataManager implements MemoryManageable {
i.set(currentProgram);
}
if (currentProgram.getEndTimeUtcMillis() < cachedProgram.getEndTimeUtcMillis()) {
- // The dummy program ends later than the current program. Adjust its start time.
+ // The stub program ends later than the current program. Adjust its start time.
i.add(
- createDummyProgram(
+ createStubProgram(
currentProgram.getEndTimeUtcMillis(),
cachedProgram.getEndTimeUtcMillis()));
}
@@ -1010,8 +1010,8 @@ public class ProgramDataManager implements MemoryManageable {
}
}
- // Create dummy program which indicates data isn't loaded yet so DB query is required.
- private Program createDummyProgram(long startTimeMs, long endTimeMs) {
+ // Create stub program which indicates data isn't loaded yet so DB query is required.
+ private Program createStubProgram(long startTimeMs, long endTimeMs) {
return new ProgramImpl.Builder()
.setChannelId(Channel.INVALID_ID)
.setStartTimeUtcMillis(startTimeMs)
diff --git a/src/com/android/tv/data/ProgramImpl.java b/src/com/android/tv/data/ProgramImpl.java
index 5097e2d4..84e42fbe 100644
--- a/src/com/android/tv/data/ProgramImpl.java
+++ b/src/com/android/tv/data/ProgramImpl.java
@@ -419,7 +419,7 @@ public final class ProgramImpl extends BaseProgramImpl implements Parcelable, Pr
@Override
public int hashCode() {
- // Hash with all the properties because program ID can be invalid for the dummy programs.
+ // Hash with all the properties because program ID can be invalid for the stub programs.
return Objects.hash(
mChannelId,
mStartTimeUtcMillis,
@@ -446,7 +446,7 @@ public final class ProgramImpl extends BaseProgramImpl implements Parcelable, Pr
if (!(other instanceof ProgramImpl)) {
return false;
}
- // Compare all the properties because program ID can be invalid for the dummy programs.
+ // Compare all the properties because program ID can be invalid for the stub programs.
ProgramImpl program = (ProgramImpl) other;
return Objects.equals(mPackageName, program.mPackageName)
&& mChannelId == program.mChannelId
diff --git a/src/com/android/tv/dvr/data/RecordedProgram.java b/src/com/android/tv/dvr/data/RecordedProgram.java
index 61430551..230ec62d 100644
--- a/src/com/android/tv/dvr/data/RecordedProgram.java
+++ b/src/com/android/tv/dvr/data/RecordedProgram.java
@@ -113,7 +113,7 @@ public abstract class RecordedProgram extends BaseProgramImpl {
.setPosterArtUri(StringUtils.nullToEmpty(cursor.getString(index++)))
.setThumbnailUri(StringUtils.nullToEmpty(cursor.getString(index++)))
.setSearchable(cursor.getInt(index++) == 1)
- .setDataUri(cursor.getString(index++))
+ .setDataUri(StringUtils.nullToEmpty(cursor.getString(index++)))
.setDataBytes(cursor.getLong(index++))
.setDurationMillis(cursor.getLong(index++))
.setExpireTimeUtcMillis(cursor.getLong(index++))
diff --git a/src/com/android/tv/features/TvFeatures.java b/src/com/android/tv/features/TvFeatures.java
index a18d9c89..5282c28c 100644
--- a/src/com/android/tv/features/TvFeatures.java
+++ b/src/com/android/tv/features/TvFeatures.java
@@ -98,8 +98,8 @@ public final class TvFeatures extends CommonFeatures {
/** Enable a conflict dialog between currently watched channel and upcoming recording. */
public static final Feature SHOW_UPCOMING_CONFLICT_DIALOG = OFF;
- /** Use input blacklist to disable partner's tuner input. */
- public static final Feature USE_PARTNER_INPUT_BLACKLIST = ON;
+ /** Use input blocklist to disable partner's tuner input. */
+ public static final Feature USE_PARTNER_INPUT_BLOCKLIST = ON;
private TvFeatures() {}
}
diff --git a/src/com/android/tv/guide/ProgramManager.java b/src/com/android/tv/guide/ProgramManager.java
index 516a4d9c..9dfc05c0 100644
--- a/src/com/android/tv/guide/ProgramManager.java
+++ b/src/com/android/tv/guide/ProgramManager.java
@@ -417,8 +417,9 @@ public class ProgramManager {
/**
* Returns an entry as {@link ProgramImpl} for a given {@code channelId} and {@code index} of
- * entries within the currently managed time range. Returned {@link ProgramImpl} can be a dummy
- * one (e.g., whose channelId is INVALID_ID), when it corresponds to a gap between programs.
+ * entries within the currently managed time range. Returned {@link ProgramImpl} can be a
+ * placeholder (e.g., whose channelId is INVALID_ID), when it corresponds to a gap between
+ * programs.
*/
TableEntry getTableEntry(long channelId, int index) {
mProgramDataManager.prefetchChannel(channelId, index);
@@ -613,7 +614,7 @@ public class ProgramManager {
List<Program> programs = mProgramDataManager.getPrograms(channelId, mStartUtcMillis);
for (Program program : programs) {
if (program.getChannelId() == INVALID_ID) {
- // Dummy program.
+ // Placeholder program.
continue;
}
long programStartTime = Math.max(program.getStartTimeUtcMillis(), mStartUtcMillis);
diff --git a/src/com/android/tv/menu/MenuRowView.java b/src/com/android/tv/menu/MenuRowView.java
index e09a4ef0..27554c22 100644
--- a/src/com/android/tv/menu/MenuRowView.java
+++ b/src/com/android/tv/menu/MenuRowView.java
@@ -95,7 +95,8 @@ public abstract class MenuRowView extends LinearLayout {
@Override
public void sendAccessibilityEvent(View host, int eventType) {
super.sendAccessibilityEvent(host, eventType);
- if (eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED &&
+ if ((eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED ||
+ eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) &&
!mRow.isReselected()) {
requestChildFocus();
}
diff --git a/src/com/android/tv/menu/MenuView.java b/src/com/android/tv/menu/MenuView.java
index add4a774..e1a3379c 100644
--- a/src/com/android/tv/menu/MenuView.java
+++ b/src/com/android/tv/menu/MenuView.java
@@ -25,6 +25,8 @@ import android.view.View;
import android.view.ViewParent;
import android.view.ViewTreeObserver.OnGlobalFocusChangeListener;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
import android.widget.FrameLayout;
import com.android.tv.menu.Menu.MenuShowReason;
import java.util.ArrayList;
@@ -192,7 +194,12 @@ public class MenuView extends FrameLayout implements IMenuView {
protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {
int selectedPosition = mLayoutManager.getSelectedPosition();
// When the menu shows up, the selected row should have focus.
+ AccessibilityManager mAccessibilityManager =
+ getContext().getSystemService(AccessibilityManager.class);
if (selectedPosition >= 0 && selectedPosition < mMenuRowViews.size()) {
+ if(mAccessibilityManager.isEnabled())
+ mMenuRowViews.get(selectedPosition)
+ .sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
return mMenuRowViews.get(selectedPosition).requestFocus();
}
return super.onRequestFocusInDescendants(direction, previouslyFocusedRect);
diff --git a/src/com/android/tv/parental/ContentRatingSystem.java b/src/com/android/tv/parental/ContentRatingSystem.java
index d85dd50e..b40c1133 100644
--- a/src/com/android/tv/parental/ContentRatingSystem.java
+++ b/src/com/android/tv/parental/ContentRatingSystem.java
@@ -288,7 +288,7 @@ public class ContentRatingSystem {
ratings.add(builder.build(subRatings));
}
- // Sanity check.
+ // Soundness check.
for (SubRating subRating : subRatings) {
boolean used = false;
for (Rating rating : ratings) {
diff --git a/src/com/android/tv/recommendation/NotificationService.java b/src/com/android/tv/recommendation/NotificationService.java
index 1652bd77..870b3c10 100644
--- a/src/com/android/tv/recommendation/NotificationService.java
+++ b/src/com/android/tv/recommendation/NotificationService.java
@@ -437,7 +437,8 @@ public class NotificationService extends Service
Intent intent = new Intent(Intent.ACTION_VIEW, channel.getUri());
intent.putExtra(TUNE_PARAMS_RECOMMENDATION_TYPE, mRecommendationType);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- final PendingIntent notificationIntent = PendingIntent.getActivity(this, 0, intent, 0);
+ final PendingIntent notificationIntent = PendingIntent.getActivity(this, 0, intent,
+ PendingIntent.FLAG_IMMUTABLE);
// This callback will run on the main thread.
Bitmap largeIconBitmap =
diff --git a/src/com/android/tv/util/GtvUtils.java b/src/com/android/tv/util/GtvUtils.java
new file mode 100644
index 00000000..eb50e062
--- /dev/null
+++ b/src/com/android/tv/util/GtvUtils.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2021 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.util;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.util.Log;
+
+/** A utility class for Google TV */
+public class GtvUtils {
+ private static final String TAG = "GtvUtils";
+ private static final String AMATI_FEATURE = "com.google.android.feature.AMATI_EXPERIENCE";
+ private static final String PERMISSION_WRITE_EPG_DATA =
+ "com.android.providers.tv.permission.WRITE_EPG_DATA";
+ private static final String ACTION_INPUT_SELECTED = "android.apps.tv.launcherx.INPUT_SELECTED";
+ private static final String EXTRA_INPUT_ID = "extra_input_id";
+ private static final String LAUNCHERX_PACKAGE_NAME = "com.google.android.apps.tv.launcherx";
+ private static Boolean mEnabled = null;
+
+ private static boolean isEnabled(Context context) {
+ if (mEnabled == null) {
+ PackageManager pm = context.getPackageManager();
+ mEnabled = pm.hasSystemFeature(AMATI_FEATURE);
+ }
+ return mEnabled;
+ }
+
+ /** Broadcasts the intent with inputId to the Launcher */
+ public static void broadcastInputId(Context context, String inputId) {
+ if (isEnabled(context)) {
+ if (inputId == null) {
+ Log.e(TAG, "Will not broadcast inputId because it is null");
+ } else {
+ Intent intent = new Intent(ACTION_INPUT_SELECTED);
+ intent.putExtra(EXTRA_INPUT_ID, inputId);
+ intent.setPackage(LAUNCHERX_PACKAGE_NAME);
+ context.sendBroadcast(intent, PERMISSION_WRITE_EPG_DATA);
+ }
+ }
+ }
+}
diff --git a/src/com/android/tv/util/TvInputManagerHelper.java b/src/com/android/tv/util/TvInputManagerHelper.java
index 23c9b494..72d527a9 100644
--- a/src/com/android/tv/util/TvInputManagerHelper.java
+++ b/src/com/android/tv/util/TvInputManagerHelper.java
@@ -128,14 +128,14 @@ public class TvInputManagerHelper {
private static final String PERMISSION_ACCESS_ALL_EPG_DATA =
"com.android.providers.tv.permission.ACCESS_ALL_EPG_DATA";
- private static final String[] mPhysicalTunerBlackList = {
+ private static final String[] mPhysicalTunerBlockList = {
"com.google.android.videos", // Play Movies
};
private static final String META_LABEL_SORT_KEY = "input_sort_key";
private static final String TV_INPUT_ALLOW_3RD_PARTY_INPUTS = "tv_input_allow_3rd_party_inputs";
- private static final String[] SYSTEM_INPUT_ID_BLACKLIST = {
+ private static final String[] SYSTEM_INPUT_ID_BLOCKLIST = {
"com.google.android.videos/" // Play Movies
};
@@ -160,7 +160,7 @@ public class TvInputManagerHelper {
DEFAULT_TV_INPUT_PRIORITY.add(TvInputInfo.TYPE_OTHER);
}
- private static final String[] PARTNER_TUNER_INPUT_PREFIX_BLACKLIST = {
+ private static final String[] PARTNER_TUNER_INPUT_PREFIX_BLOCKLIST = {
/* Begin_AOSP_Comment_Out
// Disabled partner's tuner input prefix list.
"com.mediatek.tvinput/.dtv"
@@ -597,7 +597,7 @@ public class TvInputManagerHelper {
private boolean isInputPhysicalTuner(TvInputInfo input) {
String packageName = input.getServiceInfo().packageName;
- if (Arrays.asList(mPhysicalTunerBlackList).contains(packageName)) {
+ if (Arrays.asList(mPhysicalTunerBlockList).contains(packageName)) {
return false;
}
@@ -628,9 +628,9 @@ public class TvInputManagerHelper {
return true;
}
- private boolean isInBlackList(String inputId) {
- if (TvFeatures.USE_PARTNER_INPUT_BLACKLIST.isEnabled(mContext)) {
- for (String disabledTunerInputPrefix : PARTNER_TUNER_INPUT_PREFIX_BLACKLIST) {
+ private boolean isBlocked(String inputId) {
+ if (TvFeatures.USE_PARTNER_INPUT_BLOCKLIST.isEnabled(mContext)) {
+ for (String disabledTunerInputPrefix : PARTNER_TUNER_INPUT_PREFIX_BLOCKLIST) {
if (inputId.contains(disabledTunerInputPrefix)) {
return true;
}
@@ -694,13 +694,13 @@ public class TvInputManagerHelper {
if (!isSystemInput(info)) {
return true;
}
- for (String id : SYSTEM_INPUT_ID_BLACKLIST) {
+ for (String id : SYSTEM_INPUT_ID_BLOCKLIST) {
if (info.getId().startsWith(id)) {
return true;
}
}
}
- return isInBlackList(info.getId());
+ return isBlocked(info.getId());
}
/**