18182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood/*
28182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * Copyright (C) 2010 The Android Open Source Project
38182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood *
48182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License");
58182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * you may not use this file except in compliance with the License.
68182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * You may obtain a copy of the License at
78182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood *
88182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
98182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood *
108182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * Unless required by applicable law or agreed to in writing, software
118182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
128182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * See the License for the specific language governing permissions and
148182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * limitations under the License.
158182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood */
168182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
178182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwoodpackage android.mtp;
188182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
190639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hironoimport android.annotation.NonNull;
200639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hironoimport android.os.Build;
210639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hirono
22e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hironoimport com.android.internal.util.Preconditions;
23e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono
240639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hironoimport dalvik.system.VMRuntime;
250639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hirono
268182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood/**
278182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * This class encapsulates information about an object on an MTP device.
288182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * This corresponds to the ObjectInfo Dataset described in
298182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * section 5.3.1 of the MTP specification.
308182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood */
318182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwoodpublic final class MtpObjectInfo {
328182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private int mHandle;
338182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private int mStorageId;
348182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private int mFormat;
358182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private int mProtectionStatus;
368182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private int mCompressedSize;
378182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private int mThumbFormat;
388182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private int mThumbCompressedSize;
398182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private int mThumbPixWidth;
408182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private int mThumbPixHeight;
418182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private int mImagePixWidth;
428182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private int mImagePixHeight;
438182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private int mImagePixDepth;
448182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private int mParent;
458182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private int mAssociationType;
468182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private int mAssociationDesc;
478182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private int mSequenceNumber;
480639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hirono    private String mName = "";
498182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private long mDateCreated;
508182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private long mDateModified;
510639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hirono    private String mKeywords = "";
528182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
53b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski    // only instantiated via JNI or via a builder
548182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private MtpObjectInfo() {
558182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
568182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
578182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    /**
588182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the object handle for the MTP object
598182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
608182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the object handle
618182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
628182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public final int getObjectHandle() {
638182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mHandle;
648182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
658182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
668182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    /**
678182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the storage ID for the MTP object's storage unit
688182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
698182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the storage ID
708182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
718182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public final int getStorageId() {
728182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mStorageId;
738182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
748182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
758182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    /**
768182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the format code for the MTP object
778182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
788182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the format code
798182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
808182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public final int getFormat() {
818182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mFormat;
828182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
838182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
848182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    /**
858182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the protection status for the MTP object
868182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Possible values are:
878182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
888182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * <ul>
898182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * <li> {@link android.mtp.MtpConstants#PROTECTION_STATUS_NONE}
908182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * <li> {@link android.mtp.MtpConstants#PROTECTION_STATUS_READ_ONLY}
918182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * <li> {@link android.mtp.MtpConstants#PROTECTION_STATUS_NON_TRANSFERABLE_DATA}
928182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * </ul>
938182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
948182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the protection status
958182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
968182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public final int getProtectionStatus() {
978182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mProtectionStatus;
988182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
998182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
1008182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    /**
1018182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the size of the MTP object
1028182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
1038182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the object size
1048182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
1058182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public final int getCompressedSize() {
106e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        Preconditions.checkState(mCompressedSize >= 0);
1078182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mCompressedSize;
1088182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
1098182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
1108182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    /**
111e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * Returns the size of the MTP object
112e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     *
113e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * @return the object size
114e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     */
115e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    public final long getCompressedSizeLong() {
116e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        return uint32ToLong(mCompressedSize);
117e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    }
118e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono
119e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    /**
1208182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the format code for the MTP object's thumbnail
1218182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Will be zero for objects with no thumbnail
1228182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
1238182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the thumbnail format code
1248182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
1258182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public final int getThumbFormat() {
1268182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mThumbFormat;
1278182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
1288182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
1298182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    /**
1308182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the size of the MTP object's thumbnail
1318182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Will be zero for objects with no thumbnail
1328182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
1338182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the thumbnail size
1348182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
1358182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public final int getThumbCompressedSize() {
136e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        Preconditions.checkState(mThumbCompressedSize >= 0);
1378182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mThumbCompressedSize;
1388182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
1398182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
1408182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    /**
141e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * Returns the size of the MTP object's thumbnail
142e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * Will be zero for objects with no thumbnail
143e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     *
144e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * @return the thumbnail size
145e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     */
146e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    public final long getThumbCompressedSizeLong() {
147e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        return uint32ToLong(mThumbCompressedSize);
148e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    }
149e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono
150e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    /**
1518182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the width of the MTP object's thumbnail in pixels
1528182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Will be zero for objects with no thumbnail
1538182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
1548182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the thumbnail width
1558182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
1568182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public final int getThumbPixWidth() {
157e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        Preconditions.checkState(mThumbPixWidth >= 0);
1588182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mThumbPixWidth;
1598182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
1608182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
1618182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    /**
162e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * Returns the width of the MTP object's thumbnail in pixels
163e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * Will be zero for objects with no thumbnail
164e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     *
165e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * @return the thumbnail width
166e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     */
167e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    public final long getThumbPixWidthLong() {
168e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        return uint32ToLong(mThumbPixWidth);
169e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    }
170e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono
171e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    /**
1728182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the height of the MTP object's thumbnail in pixels
1738182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Will be zero for objects with no thumbnail
1748182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
1758182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the thumbnail height
1768182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
1778182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public final int getThumbPixHeight() {
178e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        Preconditions.checkState(mThumbPixHeight >= 0);
1798182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mThumbPixHeight;
1808182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
1818182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
1828182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    /**
183e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * Returns the height of the MTP object's thumbnail in pixels
184e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * Will be zero for objects with no thumbnail
185e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     *
186e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * @return the thumbnail height
187e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     */
188e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    public final long getThumbPixHeightLong() {
189e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        return uint32ToLong(mThumbPixHeight);
190e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    }
191e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono
192e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    /**
1938182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the width of the MTP object in pixels
1948182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Will be zero for non-image objects
1958182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
1968182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the image width
1978182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
1988182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public final int getImagePixWidth() {
199e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        Preconditions.checkState(mImagePixWidth >= 0);
2008182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mImagePixWidth;
2018182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
2028182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
2038182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    /**
204e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * Returns the width of the MTP object in pixels
205e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * Will be zero for non-image objects
206e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     *
207e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * @return the image width
208e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     */
209e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    public final long getImagePixWidthLong() {
210e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        return uint32ToLong(mImagePixWidth);
211e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    }
212e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono
213e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    /**
2148182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the height of the MTP object in pixels
2158182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Will be zero for non-image objects
2168182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
2178182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the image height
2188182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
2198182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public final int getImagePixHeight() {
220e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        Preconditions.checkState(mImagePixHeight >= 0);
2218182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mImagePixHeight;
2228182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
2238182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
2248182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    /**
225e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * Returns the height of the MTP object in pixels
226e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * Will be zero for non-image objects
227e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     *
228e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * @return the image height
229e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     */
230e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    public final long getImagePixHeightLong() {
231e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        return uint32ToLong(mImagePixHeight);
232e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    }
233e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono
234e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    /**
2358182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the depth of the MTP object in bits per pixel
2368182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Will be zero for non-image objects
2378182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
2388182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the image depth
2398182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
2408182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public final int getImagePixDepth() {
241e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        Preconditions.checkState(mImagePixDepth >= 0);
2428182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mImagePixDepth;
2438182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
2448182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
2458182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    /**
246e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * Returns the depth of the MTP object in bits per pixel
247e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * Will be zero for non-image objects
248e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     *
249e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * @return the image depth
250e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     */
251e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    public final long getImagePixDepthLong() {
252e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        return uint32ToLong(mImagePixDepth);
253e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    }
254e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono
255e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    /**
2568182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the object handle for the object's parent
2578182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Will be zero for the root directory of a storage unit
2588182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
2598182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the object's parent
2608182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
2618182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public final int getParent() {
2628182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mParent;
2638182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
2648182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
2658182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    /**
2668182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the association type for the MTP object
2678182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Will be zero objects that are not of format
2688182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * {@link android.mtp.MtpConstants#FORMAT_ASSOCIATION}
2698182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * For directories the association type is typically
2708182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * {@link android.mtp.MtpConstants#ASSOCIATION_TYPE_GENERIC_FOLDER}
2718182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
2728182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the object's association type
2738182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
2748182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public final int getAssociationType() {
2758182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mAssociationType;
2768182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
2778182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
2788182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    /**
2798182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the association description for the MTP object
2808182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Will be zero objects that are not of format
2818182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * {@link android.mtp.MtpConstants#FORMAT_ASSOCIATION}
2828182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
2838182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the object's association description
2848182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
2858182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public final int getAssociationDesc() {
2868182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mAssociationDesc;
2878182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
2888182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
289e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    /**
2908182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the sequence number for the MTP object
2918182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * This field is typically not used for MTP devices,
2928182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * but is sometimes used to define a sequence of photos
2938182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * on PTP cameras.
2948182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
2958182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the object's sequence number
2968182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
2978182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public final int getSequenceNumber() {
298e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        Preconditions.checkState(mSequenceNumber >= 0);
2998182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mSequenceNumber;
3008182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
3018182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
302e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    /**
303e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * Returns the sequence number for the MTP object
304e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * This field is typically not used for MTP devices,
305e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * but is sometimes used to define a sequence of photos
306e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * on PTP cameras.
307e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     *
308e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     * @return the object's sequence number
309e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono     */
310e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    public final long getSequenceNumberLong() {
311e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        return uint32ToLong(mSequenceNumber);
312e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    }
313e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono
3148182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood   /**
3158182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the name of the MTP object
3168182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
3178182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the object's name
3188182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
3190639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hirono    public final @NonNull String getName() {
3208182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mName;
3218182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
3228182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
3238182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood   /**
3248182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the creation date of the MTP object
3258182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * The value is represented as milliseconds since January 1, 1970
3268182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
3278182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the object's creation date
3288182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
3298182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public final long getDateCreated() {
3308182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mDateCreated;
3318182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
3328182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
3338182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood   /**
3348182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns the modification date of the MTP object
3358182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * The value is represented as milliseconds since January 1, 1970
3368182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
3378182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the object's modification date
3388182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
3398182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public final long getDateModified() {
3408182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mDateModified;
3418182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
3428182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
3438182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood   /**
3448182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * Returns a comma separated list of keywords for the MTP object
3458182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     *
3468182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     * @return the object's keyword list
3478182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood     */
3480639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hirono    public final @NonNull String getKeywords() {
3498182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mKeywords;
3508182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
351b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
352b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski    /**
353b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski     * Builds a new object info instance.
354b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski     */
35587763e6a91a54e7995cfda9b7e80162f02ac4cbcTomasz Mikolajewski    public static class Builder {
356b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        private MtpObjectInfo mObjectInfo;
357b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
358b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        public Builder() {
359b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            mObjectInfo = new MtpObjectInfo();
360b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            mObjectInfo.mHandle = -1;
361b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
362b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
363b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        /**
364b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski         * Creates a builder on a copy of an existing object info.
365b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski         * All fields, except the object handle will be copied.
366b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski         *
367b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski         * @param objectInfo object info of an existing entry
368b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski         */
369b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        public Builder(MtpObjectInfo objectInfo) {
370b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            mObjectInfo = new MtpObjectInfo();
371b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            mObjectInfo.mHandle = -1;
372b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mAssociationDesc = objectInfo.mAssociationDesc;
373b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mAssociationType = objectInfo.mAssociationType;
374b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mCompressedSize = objectInfo.mCompressedSize;
375b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mDateCreated = objectInfo.mDateCreated;
376b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mDateModified = objectInfo.mDateModified;
377b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mFormat = objectInfo.mFormat;
378b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mImagePixDepth = objectInfo.mImagePixDepth;
379b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mImagePixHeight = objectInfo.mImagePixHeight;
380b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mImagePixWidth = objectInfo.mImagePixWidth;
381b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mKeywords = objectInfo.mKeywords;
382b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mName = objectInfo.mName;
383b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mParent = objectInfo.mParent;
384b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mProtectionStatus = objectInfo.mProtectionStatus;
385b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mSequenceNumber = objectInfo.mSequenceNumber;
386b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mStorageId = objectInfo.mStorageId;
387b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mThumbCompressedSize = objectInfo.mThumbCompressedSize;
388b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mThumbFormat = objectInfo.mThumbFormat;
389b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mThumbPixHeight = objectInfo.mThumbPixHeight;
390b80a3cfd05fc7492dd59b7f8d4337eb5e29088c2Tomasz Mikolajewski            mObjectInfo.mThumbPixWidth = objectInfo.mThumbPixWidth;
391b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
392b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
393bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski        public Builder setObjectHandle(int value) {
394bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski            mObjectInfo.mHandle = value;
395bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski            return this;
396bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski        }
397bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski
398b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        public Builder setAssociationDesc(int value) {
399b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            mObjectInfo.mAssociationDesc = value;
400b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
401b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
402b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
403b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        public Builder setAssociationType(int value) {
404b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            mObjectInfo.mAssociationType = value;
405b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
406b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
407b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
408e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        public Builder setCompressedSize(long value) {
409e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono            mObjectInfo.mCompressedSize = longToUint32(value, "value");
410b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
411b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
412b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
413b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        public Builder setDateCreated(long value) {
414b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            mObjectInfo.mDateCreated = value;
415b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
416b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
417b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
418b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        public Builder setDateModified(long value) {
419b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            mObjectInfo.mDateModified = value;
420b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
421b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
422b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
423b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        public Builder setFormat(int value) {
424b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            mObjectInfo.mFormat = value;
425b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
426b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
427b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
428e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        public Builder setImagePixDepth(long value) {
429e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono            mObjectInfo.mImagePixDepth = longToUint32(value, "value");
430b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
431b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
432b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
433e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        public Builder setImagePixHeight(long value) {
434e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono            mObjectInfo.mImagePixHeight = longToUint32(value, "value");
435b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
436b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
437b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
438e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        public Builder setImagePixWidth(long value) {
439e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono            mObjectInfo.mImagePixWidth = longToUint32(value, "value");
440b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
441b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
442b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
4430639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hirono        public Builder setKeywords(@NonNull String value) {
4440639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hirono            if (VMRuntime.getRuntime().getTargetSdkVersion() > Build.VERSION_CODES.N_MR1) {
4450639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hirono                Preconditions.checkNotNull(value);
4460639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hirono            } else if (value == null) {
4470639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hirono                // Before N_MR1 we accept null value and it was regarded as an empty string in
4480639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hirono                // MtpDevice#sendObjectInfo.
4490639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hirono                value = "";
4500639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hirono            }
451b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            mObjectInfo.mKeywords = value;
452b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
453b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
454b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
4550639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hirono        public Builder setName(@NonNull String value) {
4560639fe0aa9d87bae7745e60238d48c79f986b590Daichi Hirono            Preconditions.checkNotNull(value);
457b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            mObjectInfo.mName = value;
458b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
459b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
460b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
461b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        public Builder setParent(int value) {
462b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            mObjectInfo.mParent = value;
463b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
464b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
465b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
466b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        public Builder setProtectionStatus(int value) {
467b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            mObjectInfo.mProtectionStatus = value;
468b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
469b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
470b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
471e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        public Builder setSequenceNumber(long value) {
472e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono            mObjectInfo.mSequenceNumber = longToUint32(value, "value");
473b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
474b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
475b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
476b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        public Builder setStorageId(int value) {
477b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            mObjectInfo.mStorageId = value;
478b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
479b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
480b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
481e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        public Builder setThumbCompressedSize(long value) {
482e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono            mObjectInfo.mThumbCompressedSize = longToUint32(value, "value");
483b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
484b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
485b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
486b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        public Builder setThumbFormat(int value) {
487b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            mObjectInfo.mThumbFormat = value;
488b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
489b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
490b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
491e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        public Builder setThumbPixHeight(long value) {
492e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono            mObjectInfo.mThumbPixHeight = longToUint32(value, "value");
493b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
494b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
495b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
496e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        public Builder setThumbPixWidth(long value) {
497e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono            mObjectInfo.mThumbPixWidth = longToUint32(value, "value");
498b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return this;
499b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
500b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski
501b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        /**
502b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski         * Builds the object info instance. Once called, methods of the builder
503b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski         * must not be called anymore.
504b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski         *
505b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski         * @return the object info of the newly created file, or NULL in case
506b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski         *         of an error.
507b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski         */
508b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        public MtpObjectInfo build() {
509b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            MtpObjectInfo result = mObjectInfo;
510b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            mObjectInfo = null;
511b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski            return result;
512b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski        }
513b04990599a1a05cc922b0fe9dd98128440efb56aTomasz Mikolajewski    }
514e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono
515e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    private static long uint32ToLong(int value) {
516e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        return value < 0 ? 0x100000000L + value : value;
517e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    }
518e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono
519e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    private static int longToUint32(long value, String valueName) {
520e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        Preconditions.checkArgumentInRange(value, 0, 0xffffffffL, valueName);
521e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono        return (int) value;
522e0e6654a31ad01fe4712dec0358ad95f8d3c8c8dDaichi Hirono    }
5238182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood}
524