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.net.Uri;
  import android.os.Parcel;
  import android.os.Parcelable;
  
  /**
   * Pass an instance of this class to
   * {@link RcsMessage#insertFileTransfer(RcsFileTransferCreationParams)} create an
   * {@link RcsFileTransferPart} and save it into storage.
   *
   * @hide
   */
  public final class RcsFileTransferCreationParams implements Parcelable {
      private String mRcsFileTransferSessionId;
      private Uri mContentUri;
      private String mContentMimeType;
      private long mFileSize;
      private long mTransferOffset;
      private int mWidth;
      private int mHeight;
      private long mMediaDuration;
      private Uri mPreviewUri;
      private String mPreviewMimeType;
      private @RcsFileTransferPart.RcsFileTransferStatus int mFileTransferStatus;
  
      /**
       * @return Returns the globally unique RCS file transfer session ID for the
       * {@link RcsFileTransferPart} to be created
       */
      public String getRcsFileTransferSessionId() {
          return mRcsFileTransferSessionId;
      }
  
      /**
       * @return Returns the URI for the content of the {@link RcsFileTransferPart} to be created
       */
      public Uri getContentUri() {
          return mContentUri;
      }
  
      /**
       * @return Returns the MIME type for the content of the {@link RcsFileTransferPart} to be
       * created
       */
      public String getContentMimeType() {
          return mContentMimeType;
      }
  
      /**
       * @return Returns the file size in bytes for the {@link RcsFileTransferPart} to be created
       */
      public long getFileSize() {
          return mFileSize;
      }
  
      /**
       * @return Returns the transfer offset for the {@link RcsFileTransferPart} to be created. The
       * file transfer offset is defined as how many bytes have been successfully transferred to the
       * receiver of this file transfer.
       */
      public long getTransferOffset() {
          return mTransferOffset;
      }
  
      /**
       * @return Returns the width of the {@link RcsFileTransferPart} to be created. The value is in
       * pixels.
       */
      public int getWidth() {
          return mWidth;
      }
  
      /**
       * @return Returns the height of the {@link RcsFileTransferPart} to be created. The value is in
       * pixels.
       */
      public int getHeight() {
          return mHeight;
      }
  
      /**
       * @return Returns the duration of the {@link RcsFileTransferPart} to be created.
       */
      public long getMediaDuration() {
          return mMediaDuration;
      }
  
      /**
       * @return Returns the URI of the preview of the content of the {@link RcsFileTransferPart} to
       * be created. This should only be used for multi-media files.
       */
      public Uri getPreviewUri() {
          return mPreviewUri;
      }
  
      /**
       * @return Returns the MIME type of the preview of the content of the
       * {@link RcsFileTransferPart} to be created. This should only be used for multi-media files.
       */
      public String getPreviewMimeType() {
          return mPreviewMimeType;
      }
  
      /**
       * @return Returns the status of the {@link RcsFileTransferPart} to be created.
       */
      public @RcsFileTransferPart.RcsFileTransferStatus int getFileTransferStatus() {
          return mFileTransferStatus;
      }
  
      /**
       * @hide
       */
      RcsFileTransferCreationParams(Builder builder) {
          mRcsFileTransferSessionId = builder.mRcsFileTransferSessionId;
          mContentUri = builder.mContentUri;
          mContentMimeType = builder.mContentMimeType;
          mFileSize = builder.mFileSize;
          mTransferOffset = builder.mTransferOffset;
          mWidth = builder.mWidth;
          mHeight = builder.mHeight;
          mMediaDuration = builder.mLength;
          mPreviewUri = builder.mPreviewUri;
          mPreviewMimeType = builder.mPreviewMimeType;
          mFileTransferStatus = builder.mFileTransferStatus;
      }
  
      /**
       * A builder to create instances of {@link RcsFileTransferCreationParams}
       */
      public class Builder {
          private String mRcsFileTransferSessionId;
          private Uri mContentUri;
          private String mContentMimeType;
          private long mFileSize;
          private long mTransferOffset;
          private int mWidth;
          private int mHeight;
          private long mLength;
          private Uri mPreviewUri;
          private String mPreviewMimeType;
          private @RcsFileTransferPart.RcsFileTransferStatus int mFileTransferStatus;
  
          /**
           * Sets the globally unique RCS file transfer session ID for the {@link RcsFileTransferPart}
           * to be created
           *
           * @param sessionId The RCS file transfer session ID
           * @return The same instance of {@link Builder} to chain methods
           */
          @CheckResult
          public Builder setFileTransferSessionId(String sessionId) {
              mRcsFileTransferSessionId = sessionId;
              return this;
          }
  
          /**
           * Sets the URI for the content of the {@link RcsFileTransferPart} to be created
           *
           * @param contentUri The URI for the file
           * @return The same instance of {@link Builder} to chain methods
           */
          @CheckResult
          public Builder setContentUri(Uri contentUri) {
              mContentUri = contentUri;
              return this;
          }
  
          /**
           * Sets the MIME type for the content of the {@link RcsFileTransferPart} to be created
           *
           * @param contentType The MIME type of the file
           * @return The same instance of {@link Builder} to chain methods
           */
          @CheckResult
          public Builder setContentMimeType(String contentType) {
              mContentMimeType = contentType;
              return this;
          }
  
          /**
           * Sets the file size for the {@link RcsFileTransferPart} to be created
           *
           * @param size The size of the file in bytes
           * @return The same instance of {@link Builder} to chain methods
           */
          @CheckResult
          public Builder setFileSize(long size) {
              mFileSize = size;
              return this;
          }
  
          /**
           * Sets the transfer offset for the {@link RcsFileTransferPart} to be created. The file
           * transfer offset is defined as how many bytes have been successfully transferred to the
           * receiver of this file transfer.
           *
           * @param offset The transfer offset in bytes
           * @return The same instance of {@link Builder} to chain methods
           */
          @CheckResult
          public Builder setTransferOffset(long offset) {
              mTransferOffset = offset;
              return this;
          }
  
          /**
           * Sets the width of the {@link RcsFileTransferPart} to be created. This should only be used
           * for multi-media files.
           *
           * @param width The width of the multi-media file in pixels.
           * @return The same instance of {@link Builder} to chain methods
           */
          @CheckResult
          public Builder setWidth(int width) {
              mWidth = width;
              return this;
          }
  
          /**
           * Sets the height of the {@link RcsFileTransferPart} to be created. This should only be
           * used for multi-media files.
           *
           * @param height The height of the multi-media file in pixels.
           * @return The same instance of {@link Builder} to chain methods
           */
          @CheckResult
          public Builder setHeight(int height) {
              mHeight = height;
              return this;
          }
  
          /**
           * Sets the length of the {@link RcsFileTransferPart} to be created. This should only be
           * used for multi-media files such as audio or video.
           *
           * @param length The length of the multi-media file in milliseconds
           * @return The same instance of {@link Builder} to chain methods
           */
          @CheckResult
          public Builder setMediaDuration(long length) {
              mLength = length;
              return this;
          }
  
          /**
           * Sets the URI of the preview of the content of the {@link RcsFileTransferPart} to be
           * created. This should only be used for multi-media files.
           *
           * @param previewUri The URI of the preview of the file transfer
           * @return The same instance of {@link Builder} to chain methods
           */
          @CheckResult
          public Builder setPreviewUri(Uri previewUri) {
              mPreviewUri = previewUri;
              return this;
          }
  
          /**
           * Sets the MIME type of the preview of the content of the {@link RcsFileTransferPart} to
           * be created. This should only be used for multi-media files.
           *
           * @param previewType The MIME type of the preview of the file transfer
           * @return The same instance of {@link Builder} to chain methods
           */
          @CheckResult
          public Builder setPreviewMimeType(String previewType) {
              mPreviewMimeType = previewType;
              return this;
          }
  
          /**
           * Sets the status of the {@link RcsFileTransferPart} to be created.
           *
           * @param status The status of the file transfer
           * @return The same instance of {@link Builder} to chain methods
           */
          @CheckResult
          public Builder setFileTransferStatus(
                  @RcsFileTransferPart.RcsFileTransferStatus int status) {
              mFileTransferStatus = status;
              return this;
          }
  
          /**
           * Creates an instance of {@link RcsFileTransferCreationParams} with the given
           * parameters.
           *
           * @return The same instance of {@link Builder} to chain methods
           * @see RcsMessage#insertFileTransfer(RcsFileTransferCreationParams)
           */
          public RcsFileTransferCreationParams build() {
              return new RcsFileTransferCreationParams(this);
          }
      }
  
      private RcsFileTransferCreationParams(Parcel in) {
          mRcsFileTransferSessionId = in.readString();
          mContentUri = in.readParcelable(Uri.class.getClassLoader());
          mContentMimeType = in.readString();
          mFileSize = in.readLong();
          mTransferOffset = in.readLong();
          mWidth = in.readInt();
          mHeight = in.readInt();
          mMediaDuration = in.readLong();
          mPreviewUri = in.readParcelable(Uri.class.getClassLoader());
          mPreviewMimeType = in.readString();
          mFileTransferStatus = in.readInt();
      }
  
      public static final @android.annotation.NonNull Creator<RcsFileTransferCreationParams> CREATOR =
              new Creator<RcsFileTransferCreationParams>() {
                  @Override
                  public RcsFileTransferCreationParams createFromParcel(Parcel in) {
                      return new RcsFileTransferCreationParams(in);
                  }
  
                  @Override
                  public RcsFileTransferCreationParams[] newArray(int size) {
                      return new RcsFileTransferCreationParams[size];
                  }
              };
  
      @Override
      public int describeContents() {
          return 0;
      }
  
      @Override
      public void writeToParcel(Parcel dest, int flags) {
          dest.writeString(mRcsFileTransferSessionId);
          dest.writeParcelable(mContentUri, flags);
          dest.writeString(mContentMimeType);
          dest.writeLong(mFileSize);
          dest.writeLong(mTransferOffset);
          dest.writeInt(mWidth);
          dest.writeInt(mHeight);
          dest.writeLong(mMediaDuration);
          dest.writeParcelable(mPreviewUri, flags);
          dest.writeString(mPreviewMimeType);
          dest.writeInt(mFileTransferStatus);
      }
  }
  