Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 87763e6a authored by Tomasz Mikolajewski's avatar Tomasz Mikolajewski
Browse files

Wire uploading to MtpDocumentsProvider.

This patch does not yet allow to upload files, but uploading (creating)
directories already works.

Bug: 22545670
Change-Id: If4d5a53aa26f791475bb1a783e0ac9540d6760c1
parent fc58dff0
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -18136,7 +18136,7 @@ package android.mtp {
    method public final int getThumbPixWidth();
    method public final int getThumbPixWidth();
  }
  }
  public class MtpObjectInfo.Builder {
  public static class MtpObjectInfo.Builder {
    ctor public MtpObjectInfo.Builder();
    ctor public MtpObjectInfo.Builder();
    ctor public MtpObjectInfo.Builder(android.mtp.MtpObjectInfo);
    ctor public MtpObjectInfo.Builder(android.mtp.MtpObjectInfo);
    method public android.mtp.MtpObjectInfo build();
    method public android.mtp.MtpObjectInfo build();
+1 −1
Original line number Original line Diff line number Diff line
@@ -19649,7 +19649,7 @@ package android.mtp {
    method public final int getThumbPixWidth();
    method public final int getThumbPixWidth();
  }
  }
  public class MtpObjectInfo.Builder {
  public static class MtpObjectInfo.Builder {
    ctor public MtpObjectInfo.Builder();
    ctor public MtpObjectInfo.Builder();
    ctor public MtpObjectInfo.Builder(android.mtp.MtpObjectInfo);
    ctor public MtpObjectInfo.Builder(android.mtp.MtpObjectInfo);
    method public android.mtp.MtpObjectInfo build();
    method public android.mtp.MtpObjectInfo build();
+1 −1
Original line number Original line Diff line number Diff line
@@ -256,7 +256,7 @@ public final class MtpObjectInfo {
    /**
    /**
     * Builds a new object info instance.
     * Builds a new object info instance.
     */
     */
    public class Builder {
    public static class Builder {
        private MtpObjectInfo mObjectInfo;
        private MtpObjectInfo mObjectInfo;


        public Builder() {
        public Builder() {
+14 −8
Original line number Original line Diff line number Diff line
@@ -430,12 +430,14 @@ static jobject
android_mtp_MtpDevice_send_object_info(JNIEnv *env, jobject thiz, jobject info)
android_mtp_MtpDevice_send_object_info(JNIEnv *env, jobject thiz, jobject info)
{
{
    MtpDevice* device = get_device_from_object(env, thiz);
    MtpDevice* device = get_device_from_object(env, thiz);
    if (!device)
    if (!device) {
        return JNI_FALSE;
        return JNI_FALSE;
    }


    // Updating existing objects is not supported.
    // Updating existing objects is not supported.
    if (env->GetIntField(info, field_objectInfo_handle) != -1)
    if (env->GetIntField(info, field_objectInfo_handle) != -1) {
        return JNI_FALSE;
        return JNI_FALSE;
    }


    MtpObjectInfo* object_info = new MtpObjectInfo(-1);
    MtpObjectInfo* object_info = new MtpObjectInfo(-1);
    object_info->mStorageID = env->GetIntField(info, field_objectInfo_storageId);
    object_info->mStorageID = env->GetIntField(info, field_objectInfo_storageId);
@@ -456,17 +458,21 @@ android_mtp_MtpDevice_send_object_info(JNIEnv *env, jobject thiz, jobject info)
    object_info->mSequenceNumber = env->GetIntField(info, field_objectInfo_sequenceNumber);
    object_info->mSequenceNumber = env->GetIntField(info, field_objectInfo_sequenceNumber);


    jstring name_jstring = (jstring) env->GetObjectField(info, field_objectInfo_name);
    jstring name_jstring = (jstring) env->GetObjectField(info, field_objectInfo_name);
    if (name_jstring != NULL) {
        const char* name_string = env->GetStringUTFChars(name_jstring, NULL);
        const char* name_string = env->GetStringUTFChars(name_jstring, NULL);
        object_info->mName = strdup(name_string);
        object_info->mName = strdup(name_string);
        env->ReleaseStringUTFChars(name_jstring, name_string);
        env->ReleaseStringUTFChars(name_jstring, name_string);
    }


    object_info->mDateCreated = env->GetLongField(info, field_objectInfo_dateCreated) / 1000LL;
    object_info->mDateCreated = env->GetLongField(info, field_objectInfo_dateCreated) / 1000LL;
    object_info->mDateModified = env->GetLongField(info, field_objectInfo_dateModified) / 1000LL;
    object_info->mDateModified = env->GetLongField(info, field_objectInfo_dateModified) / 1000LL;


    jstring keywords_jstring = (jstring) env->GetObjectField(info, field_objectInfo_keywords);
    jstring keywords_jstring = (jstring) env->GetObjectField(info, field_objectInfo_keywords);
    if (keywords_jstring != NULL) {
        const char* keywords_string = env->GetStringUTFChars(keywords_jstring, NULL);
        const char* keywords_string = env->GetStringUTFChars(keywords_jstring, NULL);
        object_info->mKeywords = strdup(keywords_string);
        object_info->mKeywords = strdup(keywords_string);
        env->ReleaseStringUTFChars(keywords_jstring, keywords_string);
        env->ReleaseStringUTFChars(keywords_jstring, keywords_string);
    }


    int object_handle = device->sendObjectInfo(object_info);
    int object_handle = device->sendObjectInfo(object_info);
    if (object_handle == -1) {
    if (object_handle == -1) {
+27 −8
Original line number Original line Diff line number Diff line
@@ -32,6 +32,7 @@ class MtpDocument {
    private final Date mDateModified;
    private final Date mDateModified;
    private final int mSize;
    private final int mSize;
    private final int mThumbSize;
    private final int mThumbSize;
    private final boolean mReadOnly;


    /**
    /**
     * Constructor for root document.
     * Constructor for root document.
@@ -40,9 +41,10 @@ class MtpDocument {
        this(DUMMY_HANDLE_FOR_ROOT,
        this(DUMMY_HANDLE_FOR_ROOT,
             0x3001,  // Directory.
             0x3001,  // Directory.
             root.mDescription,
             root.mDescription,
             null,  // Unknown,
             null,    // Unknown name.
             (int) Math.min(root.mMaxCapacity - root.mFreeSpace, Integer.MAX_VALUE),
             (int) Math.min(root.mMaxCapacity - root.mFreeSpace, Integer.MAX_VALUE),
             0);
             0,       // Total size.
             true);   // Writable.
    }
    }


    MtpDocument(MtpObjectInfo objectInfo) {
    MtpDocument(MtpObjectInfo objectInfo) {
@@ -51,7 +53,8 @@ class MtpDocument {
             objectInfo.getName(),
             objectInfo.getName(),
             objectInfo.getDateModified() != 0 ? new Date(objectInfo.getDateModified()) : null,
             objectInfo.getDateModified() != 0 ? new Date(objectInfo.getDateModified()) : null,
             objectInfo.getCompressedSize(),
             objectInfo.getCompressedSize(),
             objectInfo.getThumbCompressedSize());
             objectInfo.getThumbCompressedSize(),
             objectInfo.getProtectionStatus() != 0);
    }
    }


    MtpDocument(int objectHandle,
    MtpDocument(int objectHandle,
@@ -59,13 +62,15 @@ class MtpDocument {
                String name,
                String name,
                Date dateModified,
                Date dateModified,
                int size,
                int size,
                int thumbSize) {
                int thumbSize,
                boolean readOnly) {
        this.mObjectHandle = objectHandle;
        this.mObjectHandle = objectHandle;
        this.mFormat = format;
        this.mFormat = format;
        this.mName = name;
        this.mName = name;
        this.mDateModified = dateModified;
        this.mDateModified = dateModified;
        this.mSize = size;
        this.mSize = size;
        this.mThumbSize = thumbSize;
        this.mThumbSize = thumbSize;
        this.mReadOnly = readOnly;
    }
    }


    void addToCursor(Identifier rootIdentifier, MatrixCursor.RowBuilder builder) {
    void addToCursor(Identifier rootIdentifier, MatrixCursor.RowBuilder builder) {
@@ -82,7 +87,7 @@ class MtpDocument {


        builder.add(Document.COLUMN_DOCUMENT_ID, identifier.toDocumentId());
        builder.add(Document.COLUMN_DOCUMENT_ID, identifier.toDocumentId());
        builder.add(Document.COLUMN_DISPLAY_NAME, mName);
        builder.add(Document.COLUMN_DISPLAY_NAME, mName);
        builder.add(Document.COLUMN_MIME_TYPE, getMimeType());
        builder.add(Document.COLUMN_MIME_TYPE, formatTypeToMimeType(mFormat));
        builder.add(
        builder.add(
                Document.COLUMN_LAST_MODIFIED,
                Document.COLUMN_LAST_MODIFIED,
                mDateModified != null ? mDateModified.getTime() : null);
                mDateModified != null ? mDateModified.getTime() : null);
@@ -90,9 +95,9 @@ class MtpDocument {
        builder.add(Document.COLUMN_SIZE, mSize);
        builder.add(Document.COLUMN_SIZE, mSize);
    }
    }


    private String getMimeType() {
    static String formatTypeToMimeType(int format) {
        // TODO: Add complete list of mime types.
        // TODO: Add complete list of mime types.
        switch (mFormat) {
        switch (format) {
            case 0x3001:
            case 0x3001:
                return DocumentsContract.Document.MIME_TYPE_DIR;
                return DocumentsContract.Document.MIME_TYPE_DIR;
            case 0x3009:
            case 0x3009:
@@ -100,7 +105,21 @@ class MtpDocument {
            case 0x3801:
            case 0x3801:
                return "image/jpeg";
                return "image/jpeg";
            default:
            default:
                return "";
                return "application/octet-stream";
        }
    }

    static int mimeTypeToFormatType(String mimeType) {
        // TODO: Add complete list of mime types.
        switch (mimeType.toLowerCase()) {
            case Document.MIME_TYPE_DIR:
                return 0x3001;
            case "audio/mp3":
                return 0x3009;
            case "image/jpeg":
                return 0x3801;
            default:
                return 0x3000;  // Undefined object.
        }
        }
    }
    }
}
}
Loading