diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/tv/MainActivity.java | 45 | ||||
-rw-r--r-- | src/com/android/tv/SetupPassthroughActivity.java | 13 | ||||
-rw-r--r-- | src/com/android/tv/TimeShiftManager.java | 86 | ||||
-rw-r--r-- | src/com/android/tv/data/ProgramDataManager.java | 18 | ||||
-rw-r--r-- | src/com/android/tv/data/ProgramImpl.java | 4 | ||||
-rw-r--r-- | src/com/android/tv/dvr/data/RecordedProgram.java | 2 | ||||
-rw-r--r-- | src/com/android/tv/features/TvFeatures.java | 4 | ||||
-rw-r--r-- | src/com/android/tv/guide/ProgramManager.java | 7 | ||||
-rw-r--r-- | src/com/android/tv/menu/MenuRowView.java | 3 | ||||
-rw-r--r-- | src/com/android/tv/menu/MenuView.java | 7 | ||||
-rw-r--r-- | src/com/android/tv/parental/ContentRatingSystem.java | 2 | ||||
-rw-r--r-- | src/com/android/tv/recommendation/NotificationService.java | 3 | ||||
-rw-r--r-- | src/com/android/tv/util/GtvUtils.java | 56 | ||||
-rw-r--r-- | src/com/android/tv/util/TvInputManagerHelper.java | 18 |
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()); } /** |