aboutsummaryrefslogtreecommitdiff
path: root/src/com/android/tv/MainActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/tv/MainActivity.java')
-rw-r--r--src/com/android/tv/MainActivity.java82
1 files changed, 71 insertions, 11 deletions
diff --git a/src/com/android/tv/MainActivity.java b/src/com/android/tv/MainActivity.java
index 8dbafe47..cea293de 100644
--- a/src/com/android/tv/MainActivity.java
+++ b/src/com/android/tv/MainActivity.java
@@ -18,6 +18,7 @@ package com.android.tv;
import static com.android.tv.common.feature.SystemAppFeature.SYSTEM_APP_FEATURE;
+import android.annotation.TargetApi;
import android.app.Activity;
import android.app.PendingIntent;
import android.app.SearchManager;
@@ -32,6 +33,7 @@ import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.database.Cursor;
import android.hardware.display.DisplayManager;
+import android.media.tv.AitInfo;
import android.media.tv.TvContentRating;
import android.media.tv.TvContract;
import android.media.tv.TvContract.Channels;
@@ -40,6 +42,8 @@ import android.media.tv.TvInputManager;
import android.media.tv.TvInputManager.TvInputCallback;
import android.media.tv.TvTrackInfo;
import android.media.tv.TvView.OnUnhandledInputEventListener;
+import android.media.tv.interactive.TvInteractiveAppManager;
+import android.media.tv.interactive.TvInteractiveAppView;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
@@ -105,6 +109,8 @@ import com.android.tv.dialog.HalfSizedDialogFragment;
import com.android.tv.dialog.PinDialogFragment;
import com.android.tv.dialog.PinDialogFragment.OnPinCheckedListener;
import com.android.tv.dialog.SafeDismissDialogFragment;
+import com.android.tv.dialog.InteractiveAppDialogFragment;
+import com.android.tv.dialog.InteractiveAppDialogFragment.OnInteractiveAppCheckedListener;
import com.android.tv.dvr.DvrManager;
import com.android.tv.dvr.data.ScheduledRecording;
import com.android.tv.dvr.recorder.ConflictChecker;
@@ -115,6 +121,7 @@ import com.android.tv.dvr.ui.DvrStopRecordingFragment;
import com.android.tv.dvr.ui.DvrUiHelper;
import com.android.tv.features.TvFeatures;
import com.android.tv.guide.ProgramItemView;
+import com.android.tv.interactive.IAppManager;
import com.android.tv.menu.Menu;
import com.android.tv.onboarding.OnboardingActivity;
import com.android.tv.parental.ContentRatingsManager;
@@ -193,7 +200,8 @@ public class MainActivity extends Activity
OnPinCheckedListener,
ChannelChanger,
HasSingletons<MySingletons>,
- HasAndroidInjector {
+ HasAndroidInjector,
+ OnInteractiveAppCheckedListener {
private static final String TAG = "MainActivity";
private static final boolean DEBUG = false;
private AudioCapabilitiesReceiver mAudioCapabilitiesReceiver;
@@ -254,6 +262,9 @@ public class MainActivity extends Activity
SYSTEM_INTENT_FILTER.addAction(Intent.ACTION_SCREEN_OFF);
SYSTEM_INTENT_FILTER.addAction(Intent.ACTION_SCREEN_ON);
SYSTEM_INTENT_FILTER.addAction(Intent.ACTION_TIME_CHANGED);
+ if (Build.VERSION.SDK_INT > 33) { // TIRAMISU
+ SYSTEM_INTENT_FILTER.addAction(TvInteractiveAppManager.ACTION_APP_LINK_COMMAND);
+ }
}
private static final int REQUEST_CODE_START_SETUP_ACTIVITY = 1;
@@ -365,6 +376,8 @@ public class MainActivity extends Activity
private String mLastInputIdFromIntent;
+ private IAppManager mIAppManager;
+
private final Handler mHandler = new MainActivityHandler(this);
private final Set<OnActionClickListener> mOnActionClickListeners = new ArraySet<>();
@@ -406,6 +419,13 @@ public class MainActivity extends Activity
tune(true);
}
break;
+ case TvInteractiveAppManager.ACTION_APP_LINK_COMMAND:
+ if (DEBUG) {
+ Log.d(TAG, "Received action link command");
+ }
+ // TODO: handle the command
+ break;
+
default: // fall out
}
}
@@ -545,8 +565,10 @@ public class MainActivity extends Activity
return;
}
setContentView(R.layout.activity_tv);
+ TvInteractiveAppView tvInteractiveAppView = findViewById(R.id.tv_app_view);
mTvView = findViewById(R.id.main_tunable_tv_view);
- mTvView.initialize(mProgramDataManager, mTvInputManagerHelper, mLegacyFlags);
+ mTvView.initialize(
+ mProgramDataManager, mTvInputManagerHelper, mLegacyFlags, tvInteractiveAppView);
mTvView.setOnUnhandledInputEventListener(
new OnUnhandledInputEventListener() {
@Override
@@ -717,8 +739,8 @@ public class MainActivity extends Activity
mAudioCapabilitiesReceiver = new AudioCapabilitiesReceiver(this, null);
mAudioCapabilitiesReceiver.register();
Intent nowPlayingIntent = new Intent(this, MainActivity.class);
- PendingIntent pendingIntent =
- PendingIntent.getActivity(this, REQUEST_CODE_NOW_PLAYING, nowPlayingIntent, 0);
+ PendingIntent pendingIntent = PendingIntent.getActivity(this, REQUEST_CODE_NOW_PLAYING,
+ nowPlayingIntent, PendingIntent.FLAG_IMMUTABLE);
mMediaSessionWrapper = new MediaSessionWrapper(this, pendingIntent);
mTvViewUiManager.restoreDisplayMode(false);
@@ -732,9 +754,21 @@ public class MainActivity extends Activity
mDvrConflictChecker = new ConflictChecker(this);
}
initForTest();
+ if (TvFeatures.HAS_TIAF.isEnabled(this)) {
+ mIAppManager = new IAppManager(this, mTvView, mHandler);
+ }
Debug.getTimer(Debug.TAG_START_UP_TIMER).log("MainActivity.onCreate end");
}
+ @TargetApi(Build.VERSION_CODES.TIRAMISU)
+ @Override
+ public void onInteractiveAppChecked(boolean checked) {
+ TvSettings.setTvIAppOn(getApplicationContext(), checked);
+ if (checked) {
+ mIAppManager.processHeldAitInfo();
+ }
+ }
+
private void startOnboardingActivity() {
startActivity(OnboardingActivity.buildIntent(this, getIntent()));
finish();
@@ -833,7 +867,7 @@ public class MainActivity extends Activity
mMainDurationTimer.start();
applyParentalControlSettings();
- registerReceiver(mBroadcastReceiver, SYSTEM_INTENT_FILTER);
+ registerReceiver(mBroadcastReceiver, SYSTEM_INTENT_FILTER, Context.RECEIVER_EXPORTED);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
Intent notificationIntent = new Intent(this, NotificationService.class);
@@ -1081,7 +1115,7 @@ public class MainActivity extends Activity
}
mTvView.start();
- mAudioManagerHelper.setVolumeByAudioFocusStatus();
+ mAudioManagerHelper.requestAudioFocus();
tune(true);
}
@@ -1126,6 +1160,9 @@ public class MainActivity extends Activity
private void stopAll(boolean keepVisibleBehind) {
mOverlayManager.hideOverlays(TvOverlayManager.FLAG_HIDE_OVERLAYS_WITHOUT_ANIMATION);
stopTv("stopAll()", keepVisibleBehind);
+ if (mIAppManager != null) {
+ mIAppManager.stop();
+ }
}
public TvInputManagerHelper getTvInputManagerHelper() {
@@ -1138,7 +1175,7 @@ public class MainActivity extends Activity
* @param calledByPopup If true, startSetupActivity is invoked from the setup fragment.
*/
public void startSetupActivity(TvInputInfo input, boolean calledByPopup) {
- Intent intent = CommonUtils.createSetupIntent(input);
+ Intent intent = mSetupUtils.createSetupIntent(this, input);
if (intent == null) {
Toast.makeText(this, R.string.msg_no_setup_activity, Toast.LENGTH_SHORT).show();
return;
@@ -1425,6 +1462,9 @@ public class MainActivity extends Activity
if (DeveloperPreferences.LOG_KEYEVENT.get(this)) {
Log.d(TAG, "dispatchKeyEvent(" + event + ")");
}
+ if (mIAppManager != null && mIAppManager.dispatchKeyEvent(event)) {
+ return true;
+ }
// If an activity is closed on a back key down event, back key down events with none zero
// repeat count or a back key up event can be happened without the first back key down
// event which should be ignored in this activity.
@@ -1631,7 +1671,7 @@ public class MainActivity extends Activity
}
}
- private void stopTv() {
+ public void stopTv() {
stopTv(null, false);
}
@@ -1932,12 +1972,21 @@ public class MainActivity extends Activity
@VisibleForTesting
protected void applyMultiAudio(String trackId) {
+ applyMultiAudio(false, trackId);
+ }
+
+ @VisibleForTesting
+ protected void applyMultiAudio(boolean allowAutoSelection, String trackId) {
+ if (!allowAutoSelection && trackId == null) {
+ selectTrack(TvTrackInfo.TYPE_AUDIO, null, UNDEFINED_TRACK_INDEX);
+ mTvOptionsManager.onMultiAudioChanged(null);
+ return;
+ }
List<TvTrackInfo> tracks = getTracks(TvTrackInfo.TYPE_AUDIO);
if (tracks == null) {
mTvOptionsManager.onMultiAudioChanged(null);
return;
}
-
TvTrackInfo bestTrack = null;
if (trackId != null) {
for (TvTrackInfo track : tracks) {
@@ -2459,7 +2508,7 @@ public class MainActivity extends Activity
return handled;
}
- private boolean isKeyEventBlocked() {
+ public boolean isKeyEventBlocked() {
// If the current channel is a passthrough channel, we don't handle the key events in TV
// activity. Instead, the key event will be handled by the passthrough TV input.
return mChannelTuner.isCurrentChannelPassthrough();
@@ -2907,7 +2956,7 @@ public class MainActivity extends Activity
}
applyDisplayRefreshRate(info.getVideoFrameRate());
mTvViewUiManager.updateTvAspectRatio();
- applyMultiAudio(
+ applyMultiAudio(allowAutoSelectionOfTrack,
allowAutoSelectionOfTrack ? null : getSelectedTrack(TvTrackInfo.TYPE_AUDIO));
applyClosedCaption();
mOverlayManager.getMenu().onStreamInfoChanged();
@@ -2989,6 +3038,14 @@ public class MainActivity extends Activity
TvOverlayManager.UPDATE_CHANNEL_BANNER_REASON_UPDATE_SIGNAL_STRENGTH);
}
}
+
+ @TargetApi(Build.VERSION_CODES.TIRAMISU)
+ @Override
+ public void onAitInfoUpdated(String inputId, AitInfo aitInfo) {
+ if (mIAppManager != null) {
+ mIAppManager.onAitInfoUpdated(aitInfo);
+ }
+ }
}
private class MySingletonsImpl implements MySingletons {
@@ -3047,5 +3104,8 @@ public class MainActivity extends Activity
@ContributesAndroidInjector
abstract DvrScheduleFragment contributesDvrScheduleFragment();
+
+ @ContributesAndroidInjector
+ abstract InteractiveAppDialogFragment contributesInteractiveAppDialogFragment();
}
}