content: /*
   * Copyright (C) 2019 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.telephony.ims;
  
  import android.annotation.CheckResult;
  import android.annotation.NonNull;
  import android.os.Parcel;
  import android.os.Parcelable;
  
  /**
   * {@link RcsIncomingMessageCreationParams} is a collection of parameters that should be passed
   * into {@link RcsThread#addIncomingMessage(RcsIncomingMessageCreationParams)} to generate an
   * {@link RcsIncomingMessage} on that {@link RcsThread}
   *
   * @hide
   */
  public final class RcsIncomingMessageCreationParams extends RcsMessageCreationParams implements
          Parcelable {
      // The arrival timestamp for the RcsIncomingMessage to be created
      private final long mArrivalTimestamp;
      // The seen timestamp for the RcsIncomingMessage to be created
      private final long mSeenTimestamp;
      // The participant that sent this incoming message
      private final int mSenderParticipantId;
  
      /**
       * Builder to help create an {@link RcsIncomingMessageCreationParams}
       *
       * @see RcsThread#addIncomingMessage(RcsIncomingMessageCreationParams)
       */
      public static class Builder extends RcsMessageCreationParams.Builder {
          private RcsParticipant mSenderParticipant;
          private long mArrivalTimestamp;
          private long mSeenTimestamp;
  
          /**
           * Creates a {@link Builder} to create an instance of
           * {@link RcsIncomingMessageCreationParams}
           *
           * @param originationTimestamp The timestamp of {@link RcsMessage} creation. The origination
           *                             timestamp value in milliseconds passed after midnight,
           *                             January 1, 1970 UTC
           * @param arrivalTimestamp The timestamp of arrival, defined as milliseconds passed after
           *                         midnight, January 1, 1970 UTC
           * @param subscriptionId The subscription ID that was used to send or receive this
           *                       {@link RcsMessage}
           */
          public Builder(long originationTimestamp, long arrivalTimestamp, int subscriptionId) {
              super(originationTimestamp, subscriptionId);
              mArrivalTimestamp = arrivalTimestamp;
          }
  
          /**
           * Sets the {@link RcsParticipant} that send this {@link RcsIncomingMessage}
           *
           * @param senderParticipant The {@link RcsParticipant} that sent this
           * {@link RcsIncomingMessage}
           * @return The same instance of {@link Builder} to chain methods.
           */
          @CheckResult
          public Builder setSenderParticipant(RcsParticipant senderParticipant) {
              mSenderParticipant = senderParticipant;
              return this;
          }
  
          /**
           * Sets the time of the arrival of this {@link RcsIncomingMessage}
  
           * @return The same instance of {@link Builder} to chain methods.
           * @see RcsIncomingMessage#setArrivalTimestamp(long)
           */
          @CheckResult
          public Builder setArrivalTimestamp(long arrivalTimestamp) {
              mArrivalTimestamp = arrivalTimestamp;
              return this;
          }
  
          /**
           * Sets the time of the when this user saw the {@link RcsIncomingMessage}
           * @param seenTimestamp The seen timestamp , defined as milliseconds passed after midnight,
           *                      January 1, 1970 UTC
           * @return The same instance of {@link Builder} to chain methods.
           * @see RcsIncomingMessage#setSeenTimestamp(long)
           */
          @CheckResult
          public Builder setSeenTimestamp(long seenTimestamp) {
              mSeenTimestamp = seenTimestamp;
              return this;
          }
  
          /**
           * Creates parameters for creating a new incoming message.
           * @return A new instance of {@link RcsIncomingMessageCreationParams} to create a new
           * {@link RcsIncomingMessage}
           */
          public RcsIncomingMessageCreationParams build() {
              return new RcsIncomingMessageCreationParams(this);
          }
      }
  
      private RcsIncomingMessageCreationParams(Builder builder) {
          super(builder);
          mArrivalTimestamp = builder.mArrivalTimestamp;
          mSeenTimestamp = builder.mSeenTimestamp;
          mSenderParticipantId = builder.mSenderParticipant.getId();
      }
  
      private RcsIncomingMessageCreationParams(Parcel in) {
          super(in);
          mArrivalTimestamp = in.readLong();
          mSeenTimestamp = in.readLong();
          mSenderParticipantId = in.readInt();
      }
  
      /**
       * @return Returns the arrival timestamp for the {@link RcsIncomingMessage} to be created.
       * Timestamp is defined as milliseconds passed after midnight, January 1, 1970 UTC
       */
      public long getArrivalTimestamp() {
          return mArrivalTimestamp;
      }
  
      /**
       * @return Returns the seen timestamp for the {@link RcsIncomingMessage} to be created.
       * Timestamp is defined as milliseconds passed after midnight, January 1, 1970 UTC
       */
      public long getSeenTimestamp() {
          return mSeenTimestamp;
      }
  
      /**
       * Helper getter for {@link com.android.internal.telephony.ims.RcsMessageStoreController} to
       * create {@link RcsIncomingMessage}s
       *
       * Since the API doesn't expose any ID's to API users, this should be hidden.
       * @hide
       */
      public int getSenderParticipantId() {
          return mSenderParticipantId;
      }
  
      public static final @NonNull Creator<RcsIncomingMessageCreationParams> CREATOR =
              new Creator<RcsIncomingMessageCreationParams>() {
                  @Override
                  public RcsIncomingMessageCreationParams createFromParcel(Parcel in) {
                      return new RcsIncomingMessageCreationParams(in);
                  }
  
                  @Override
                  public RcsIncomingMessageCreationParams[] newArray(int size) {
                      return new RcsIncomingMessageCreationParams[size];
                  }
              };
  
      @Override
      public int describeContents() {
          return 0;
      }
  
      @Override
      public void writeToParcel(Parcel dest, int flags) {
          super.writeToParcel(dest);
          dest.writeLong(mArrivalTimestamp);
          dest.writeLong(mSeenTimestamp);
          dest.writeInt(mSenderParticipantId);
      }
  }
  