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

Commit 3dfa4fcb authored by Jaesung Chung's avatar Jaesung Chung Committed by LuK1337
Browse files

Gallery2: Support the newly added media file types in MTP mode

And also allows to import RAW images introduced from N.

Bug: 27125321
Change-Id: I8eda0503b7b07938a05655c9ae321bedfd2123b9
parent 9f7d2091
Loading
Loading
Loading
Loading
+46 −4
Original line number Diff line number Diff line
@@ -3,10 +3,15 @@ package com.android.gallery3d.ingest.data;
import android.annotation.TargetApi;
import android.mtp.MtpConstants;
import android.mtp.MtpDevice;
import android.mtp.MtpObjectInfo;
import android.os.Build;
import android.webkit.MimeTypeMap;

import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

/**
@@ -84,12 +89,18 @@ public class MtpDeviceIndex {
    supportedImageFormats.add(MtpConstants.FORMAT_PNG);
    supportedImageFormats.add(MtpConstants.FORMAT_GIF);
    supportedImageFormats.add(MtpConstants.FORMAT_BMP);
    supportedImageFormats.add(MtpConstants.FORMAT_TIFF);
    supportedImageFormats.add(MtpConstants.FORMAT_TIFF_EP);
    if (Build.VERSION.SDK_INT >= 24) {
      supportedImageFormats.add(MtpConstants.FORMAT_DNG);
    }
    SUPPORTED_IMAGE_FORMATS = Collections.unmodifiableSet(supportedImageFormats);

    Set<Integer> supportedVideoFormats = new HashSet<Integer>();
    supportedVideoFormats.add(MtpConstants.FORMAT_3GP_CONTAINER);
    supportedVideoFormats.add(MtpConstants.FORMAT_AVI);
    supportedVideoFormats.add(MtpConstants.FORMAT_MP4_CONTAINER);
    supportedVideoFormats.add(MtpConstants.FORMAT_MP2);
    supportedVideoFormats.add(MtpConstants.FORMAT_MPEG);
    // TODO(georgescu): add FORMAT_MOV once Android Media Scanner supports .mov files
    SUPPORTED_VIDEO_FORMATS = Collections.unmodifiableSet(supportedVideoFormats);
@@ -104,6 +115,8 @@ public class MtpDeviceIndex {
  private static final MtpDeviceIndex sInstance = new MtpDeviceIndex(
      MtpDeviceIndexRunnable.getFactory());

  private static final Map<String, Boolean> sCachedSupportedExtenstions = new HashMap<>();

  public static MtpDeviceIndex getInstance() {
    return sInstance;
  }
@@ -121,12 +134,41 @@ public class MtpDeviceIndex {
  }

  /**
   * @param format Media format from {@link MtpConstants}
   * @param mtpObjectInfo MTP object info
   * @return Whether the format is supported by this index.
   */
  public boolean isFormatSupported(int format) {
    return SUPPORTED_IMAGE_FORMATS.contains(format)
        || SUPPORTED_VIDEO_FORMATS.contains(format);
  public boolean isFormatSupported(MtpObjectInfo mtpObjectInfo) {
    // Checks whether the format is supported or not.
    final int format = mtpObjectInfo.getFormat();
    if (SUPPORTED_IMAGE_FORMATS.contains(format)
        || SUPPORTED_VIDEO_FORMATS.contains(format)) {
      return true;
    }

    // Checks whether the extension is supported or not.
    final String name = mtpObjectInfo.getName();
    if (name == null) {
      return false;
    }
    final int lastDot = name.lastIndexOf('.');
    if (lastDot >= 0) {
      final String extension = name.substring(lastDot + 1);

      Boolean result = sCachedSupportedExtenstions.get(extension);
      if (result != null) {
        return result;
      }
      final String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
          extension.toLowerCase(Locale.US));
      if (mime != null) {
        // This will also accept the newly added mimetypes for images and videos.
        result = mime.startsWith("image/") || mime.startsWith("video/");
        sCachedSupportedExtenstions.put(extension, result);
        return result;
      }
    }

    return false;
  }

  /**
+2 −3
Original line number Diff line number Diff line
@@ -171,10 +171,9 @@ public class MtpDeviceIndexRunnable implements Runnable {
          if (mtpObjectInfo == null) {
            throw new IndexingException();
          }
          int format = mtpObjectInfo.getFormat();
          if (format == MtpConstants.FORMAT_ASSOCIATION) {
          if (mtpObjectInfo.getFormat() == MtpConstants.FORMAT_ASSOCIATION) {
            pendingDirectories.add(objectHandle);
          } else if (mIndex.isFormatSupported(format)) {
          } else if (mIndex.isFormatSupported(mtpObjectInfo)) {
            numObjects++;
            addObject(new IngestObjectInfo(mtpObjectInfo), bucketsTemp, numObjects);
          }