1ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko/*
2ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Copyright (C) 2015 The Android Open Source Project
3ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko *
4ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
5ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * you may not use this file except in compliance with the License.
6ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * You may obtain a copy of the License at
7ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko *
8ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
9ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko *
10ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Unless required by applicable law or agreed to in writing, software
11ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
12ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * See the License for the specific language governing permissions and
14ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * limitations under the License
15ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */
16ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
17ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkopackage com.android.tv.common.recording;
18ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
19ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport android.os.Parcel;
20ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport android.os.Parcelable;
21ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport java.util.Objects;
22ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
2395961816a768da387f0b5523cf4363ace2044089Nick Chalko/** Static representation of the recording capability of a TvInputService. */
2495961816a768da387f0b5523cf4363ace2044089Nick Chalkopublic final class RecordingCapability implements Parcelable {
2595961816a768da387f0b5523cf4363ace2044089Nick Chalko    /** The inputId this capability represents. */
26ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public final String inputId;
27ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
28ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    /**
29ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * The max number of concurrent sessions that require a tuner.
30ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     *
31ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * <p>Both recording and playing live TV requires a Tuner.
32ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     */
33ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public final int maxConcurrentTunedSessions;
34ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
35ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    /**
36ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * The max number concurrent session that play a stream.
37ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     *
3895961816a768da387f0b5523cf4363ace2044089Nick Chalko     * <p>This is often limited by the number of decoders available. The count includes both playing
3995961816a768da387f0b5523cf4363ace2044089Nick Chalko     * live TV and playing a recorded stream.
40ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     */
41ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public final int maxConcurrentPlayingSessions;
42ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
43ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    /**
44ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * Max number of concurrent sessions all types.
45ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     *
46ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     * <p>This may be limited by bandwidth or CPU or other factors.
47ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko     */
48ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public final int maxConcurrentSessionsOfAllTypes;
49ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
5095961816a768da387f0b5523cf4363ace2044089Nick Chalko    /** True if a tuned session can support recording and playback from the same resource. */
51ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public final boolean playbackWhileRecording;
52ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
5395961816a768da387f0b5523cf4363ace2044089Nick Chalko    private RecordingCapability(
5495961816a768da387f0b5523cf4363ace2044089Nick Chalko            String inputId,
5595961816a768da387f0b5523cf4363ace2044089Nick Chalko            int maxConcurrentTunedSessions,
5695961816a768da387f0b5523cf4363ace2044089Nick Chalko            int maxConcurrentPlayingSessions,
5795961816a768da387f0b5523cf4363ace2044089Nick Chalko            int maxConcurrentSessionsOfAllTypes,
58ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            boolean playbackWhileRecording) {
59ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        this.inputId = inputId;
60ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        this.maxConcurrentTunedSessions = maxConcurrentTunedSessions;
61ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        this.maxConcurrentPlayingSessions = maxConcurrentPlayingSessions;
62ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        this.maxConcurrentSessionsOfAllTypes = maxConcurrentSessionsOfAllTypes;
63ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        this.playbackWhileRecording = playbackWhileRecording;
64ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
65ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
66ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected RecordingCapability(Parcel in) {
67ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        inputId = in.readString();
68ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        maxConcurrentTunedSessions = in.readInt();
69ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        maxConcurrentPlayingSessions = in.readInt();
70ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        maxConcurrentSessionsOfAllTypes = in.readInt();
71ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        playbackWhileRecording = in.readByte() != 0;
72ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
73ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
74ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    @Override
75ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public void writeToParcel(Parcel parcel, int flags) {
76ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        parcel.writeString(inputId);
77ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        parcel.writeInt(maxConcurrentTunedSessions);
78ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        parcel.writeInt(maxConcurrentPlayingSessions);
79ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        parcel.writeInt(maxConcurrentSessionsOfAllTypes);
80ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        parcel.writeByte((byte) (playbackWhileRecording ? 1 : 0));
81ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
82ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
83ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    @Override
84ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public boolean equals(Object o) {
85ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        if (this == o) {
86ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            return true;
87ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }
88ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        if (!(o instanceof RecordingCapability)) {
89ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            return false;
90ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }
91ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        RecordingCapability that = (RecordingCapability) o;
9295961816a768da387f0b5523cf4363ace2044089Nick Chalko        return Objects.equals(maxConcurrentTunedSessions, that.maxConcurrentTunedSessions)
9395961816a768da387f0b5523cf4363ace2044089Nick Chalko                && Objects.equals(maxConcurrentPlayingSessions, that.maxConcurrentPlayingSessions)
9495961816a768da387f0b5523cf4363ace2044089Nick Chalko                && Objects.equals(
9595961816a768da387f0b5523cf4363ace2044089Nick Chalko                        maxConcurrentSessionsOfAllTypes, that.maxConcurrentSessionsOfAllTypes)
9695961816a768da387f0b5523cf4363ace2044089Nick Chalko                && Objects.equals(playbackWhileRecording, that.playbackWhileRecording)
9795961816a768da387f0b5523cf4363ace2044089Nick Chalko                && Objects.equals(inputId, that.inputId);
98ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
99ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
100ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    @Override
101ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public int hashCode() {
102ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        return Objects.hash(inputId);
103ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
104ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
105ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    @Override
106ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public String toString() {
10795961816a768da387f0b5523cf4363ace2044089Nick Chalko        return "RecordingCapability{"
10895961816a768da387f0b5523cf4363ace2044089Nick Chalko                + "inputId='"
10995961816a768da387f0b5523cf4363ace2044089Nick Chalko                + inputId
11095961816a768da387f0b5523cf4363ace2044089Nick Chalko                + '\''
11195961816a768da387f0b5523cf4363ace2044089Nick Chalko                + ", maxConcurrentTunedSessions="
11295961816a768da387f0b5523cf4363ace2044089Nick Chalko                + maxConcurrentTunedSessions
11395961816a768da387f0b5523cf4363ace2044089Nick Chalko                + ", maxConcurrentPlayingSessions="
11495961816a768da387f0b5523cf4363ace2044089Nick Chalko                + maxConcurrentPlayingSessions
11595961816a768da387f0b5523cf4363ace2044089Nick Chalko                + ", maxConcurrentSessionsOfAllTypes="
11695961816a768da387f0b5523cf4363ace2044089Nick Chalko                + maxConcurrentSessionsOfAllTypes
11795961816a768da387f0b5523cf4363ace2044089Nick Chalko                + ", playbackWhileRecording="
11895961816a768da387f0b5523cf4363ace2044089Nick Chalko                + playbackWhileRecording
11995961816a768da387f0b5523cf4363ace2044089Nick Chalko                + '}';
120ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
121ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
122ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    @Override
123ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public int describeContents() {
124ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        return 0;
125ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
126ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
12795961816a768da387f0b5523cf4363ace2044089Nick Chalko    public static final Creator<RecordingCapability> CREATOR =
12895961816a768da387f0b5523cf4363ace2044089Nick Chalko            new Creator<RecordingCapability>() {
12995961816a768da387f0b5523cf4363ace2044089Nick Chalko                @Override
13095961816a768da387f0b5523cf4363ace2044089Nick Chalko                public RecordingCapability createFromParcel(Parcel in) {
13195961816a768da387f0b5523cf4363ace2044089Nick Chalko                    return new RecordingCapability(in);
13295961816a768da387f0b5523cf4363ace2044089Nick Chalko                }
133ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
13495961816a768da387f0b5523cf4363ace2044089Nick Chalko                @Override
13595961816a768da387f0b5523cf4363ace2044089Nick Chalko                public RecordingCapability[] newArray(int size) {
13695961816a768da387f0b5523cf4363ace2044089Nick Chalko                    return new RecordingCapability[size];
13795961816a768da387f0b5523cf4363ace2044089Nick Chalko                }
13895961816a768da387f0b5523cf4363ace2044089Nick Chalko            };
139ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
140ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public static Builder builder() {
141ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        return new Builder();
142ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
143ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
144ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public static final class Builder {
145ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        private String mInputId;
146ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        private int mMaxConcurrentTunedSessions;
147ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        private int mMaxConcurrentPlayingSessions;
148ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        private int mMaxConcurrentSessionsOfAllTypes;
149ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        private boolean mPlaybackWhileRecording;
150ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
151ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        public Builder setInputId(String inputId) {
152ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            mInputId = inputId;
153ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            return this;
154ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }
155ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
156ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        public Builder setMaxConcurrentTunedSessions(int maxConcurrentTunedSessions) {
157ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            mMaxConcurrentTunedSessions = maxConcurrentTunedSessions;
158ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            return this;
159ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }
160ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
161ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        public Builder setMaxConcurrentPlayingSessions(int maxConcurrentPlayingSessions) {
162ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            mMaxConcurrentPlayingSessions = maxConcurrentPlayingSessions;
163ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            return this;
164ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }
165ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
166ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        public Builder setMaxConcurrentSessionsOfAllTypes(int maxConcurrentSessionsOfAllTypes) {
167ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            mMaxConcurrentSessionsOfAllTypes = maxConcurrentSessionsOfAllTypes;
168ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            return this;
169ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }
170ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
171ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        public Builder setPlaybackWhileRecording(boolean playbackWhileRecording) {
172ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            mPlaybackWhileRecording = playbackWhileRecording;
173ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            return this;
174ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }
175ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko
176ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        public RecordingCapability build() {
17795961816a768da387f0b5523cf4363ace2044089Nick Chalko            return new RecordingCapability(
17895961816a768da387f0b5523cf4363ace2044089Nick Chalko                    mInputId,
17995961816a768da387f0b5523cf4363ace2044089Nick Chalko                    mMaxConcurrentTunedSessions,
18095961816a768da387f0b5523cf4363ace2044089Nick Chalko                    mMaxConcurrentPlayingSessions,
18195961816a768da387f0b5523cf4363ace2044089Nick Chalko                    mMaxConcurrentSessionsOfAllTypes,
182ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                    mPlaybackWhileRecording);
183ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }
184ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    }
185ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko}
186