blob: 20acefaea77ea5fce266dd4a51d6d44a42bb6a8d [file] [log] [blame]
/*
* 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.
* <p>{@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.
* <p>{@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<TunedInfo> CREATOR =
new Parcelable.Creator<TunedInfo>() {
@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.
* <p>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.
* <p>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.
* <p>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);
}
}