/* * Copyright 2020 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 android.media.tv; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; import android.util.Log; import android.view.Surface; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Objects; /** * Contains information about a {@link TvInputService.Session} that is currently tuned to a channel * or pass-through input. * @hide */ @SystemApi public final class TunedInfo implements Parcelable { static final String TAG = "TunedInfo"; /** * App tag for {@link #getAppTag()}: the corresponding application of the channel is the same as * the caller. *

{@link #getAppType()} returns {@link #APP_TYPE_SELF} if and only if the app tag is * {@link #APP_TAG_SELF}. */ public static final int APP_TAG_SELF = 0; /** * App tag for {@link #getAppType()}: the corresponding application of the channel is the same * as the caller. *

{@link #getAppType()} returns {@link #APP_TYPE_SELF} if and only if the app tag is * {@link #APP_TAG_SELF}. */ public static final int APP_TYPE_SELF = 1; /** * App tag for {@link #getAppType()}: the corresponding app of the channel is a system * application. */ public static final int APP_TYPE_SYSTEM = 2; /** * App tag for {@link #getAppType()}: the corresponding app of the channel is not a system * application. */ public static final int APP_TYPE_NON_SYSTEM = 3; /** @hide */ @IntDef(prefix = "APP_TYPE_", value = {APP_TYPE_SELF, APP_TYPE_SYSTEM, APP_TYPE_NON_SYSTEM}) @Retention(RetentionPolicy.SOURCE) public @interface AppType {} public static final @NonNull Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override public TunedInfo createFromParcel(Parcel source) { try { return new TunedInfo(source); } catch (Exception e) { Log.e(TAG, "Exception creating TunedInfo from parcel", e); return null; } } @Override public TunedInfo[] newArray(int size) { return new TunedInfo[size]; } }; private final String mInputId; @Nullable private final Uri mChannelUri; private final boolean mIsRecordingSession; private final boolean mIsVisible; private final boolean mIsMainSession; @AppType private final int mAppType; private final int mAppTag; /** @hide */ public TunedInfo( String inputId, @Nullable Uri channelUri, boolean isRecordingSession, boolean isVisible, boolean isMainSession, @AppType int appType, int appTag) { mInputId = inputId; mChannelUri = channelUri; mIsRecordingSession = isRecordingSession; mIsVisible = isVisible; mIsMainSession = isMainSession; mAppType = appType; mAppTag = appTag; } private TunedInfo(Parcel source) { mInputId = source.readString(); String uriString = source.readString(); mChannelUri = uriString == null ? null : Uri.parse(uriString); mIsRecordingSession = (source.readInt() == 1); mIsVisible = (source.readInt() == 1); mIsMainSession = (source.readInt() == 1); mAppType = source.readInt(); mAppTag = source.readInt(); } /** * Returns the TV input ID of the channel. */ @NonNull public String getInputId() { return mInputId; } /** * Returns the channel URI of the channel. *

Returns {@code null} if it's a passthrough input or the permission is not granted. */ @Nullable public Uri getChannelUri() { return mChannelUri; } /** * Returns {@code true} if the channel session is a recording session. * @see TvInputService.RecordingSession */ public boolean isRecordingSession() { return mIsRecordingSession; } /** * Returns {@code true} if the corresponding session is visible. *

The system checks whether the {@link Surface} of the session is {@code null} or not. When * it becomes invisible, the surface is destroyed and set to null. * @see TvInputService.Session#onSetSurface(Surface) * @see android.view.SurfaceView#notifySurfaceDestroyed */ public boolean isVisible() { return mIsVisible; } /** * Returns {@code true} if the corresponding session is set as main session. * @see TvView#setMain * @see TvInputService.Session#onSetMain */ public boolean isMainSession() { return mIsMainSession; } /** * Returns the app tag. *

App tag is used to differentiate one app from another. * {@link #APP_TAG_SELF} is for current app. */ public int getAppTag() { return mAppTag; } /** * Returns the app type. */ @AppType public int getAppType() { return mAppType; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeString(mInputId); String uriString = mChannelUri == null ? null : mChannelUri.toString(); dest.writeString(uriString); dest.writeInt(mIsRecordingSession ? 1 : 0); dest.writeInt(mIsVisible ? 1 : 0); dest.writeInt(mIsMainSession ? 1 : 0); dest.writeInt(mAppType); dest.writeInt(mAppTag); } @Override public String toString() { return "inputID=" + mInputId + ";channelUri=" + mChannelUri + ";isRecording=" + mIsRecordingSession + ";isVisible=" + mIsVisible + ";isMainSession=" + mIsMainSession + ";appType=" + mAppType + ";appTag=" + mAppTag; } @Override public boolean equals(Object o) { if (!(o instanceof TunedInfo)) { return false; } TunedInfo other = (TunedInfo) o; return TextUtils.equals(mInputId, other.getInputId()) && Objects.equals(mChannelUri, other.mChannelUri) && mIsRecordingSession == other.mIsRecordingSession && mIsVisible == other.mIsVisible && mIsMainSession == other.mIsMainSession && mAppType == other.mAppType && mAppTag == other.mAppTag; } @Override public int hashCode() { return Objects.hash( mInputId, mChannelUri, mIsRecordingSession, mIsVisible, mIsMainSession, mAppType, mAppTag); } }