/* * Copyright 2021 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 com.example.android.receivecontent; import android.content.ContentResolver; import android.content.Context; import android.net.Uri; import android.util.Log; import android.webkit.MimeTypeMap; import androidx.annotation.NonNull; import androidx.core.content.FileProvider; import com.google.common.collect.ImmutableList; import com.google.common.io.ByteStreams; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.UUID; /** * Stores attachments as files in the app's private storage directory (see * {@link Context#getDataDir()}, {@link Context#getFilesDir()}, etc). */ final class AttachmentsRepo { // This matches the name declared in AndroidManifest.xml private static final String FILE_PROVIDER_AUTHORITY = "com.example.android.receivecontent.fileprovider"; private final Context mContext; private final File mAttachmentsDir; AttachmentsRepo(@NonNull Context context) { mContext = context; mAttachmentsDir = new File(mContext.getFilesDir(), "attachments"); } /** * Reads the content at the given URI and writes it to private storage. Then returns a content * URI referencing the newly written file. */ @NonNull public Uri write(@NonNull Uri uri) { ContentResolver contentResolver = mContext.getContentResolver(); String mimeType = contentResolver.getType(uri); String ext = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType); try (InputStream is = contentResolver.openInputStream(uri)) { if (is == null) { throw new IllegalArgumentException(String.valueOf(uri)); } mAttachmentsDir.mkdirs(); String fileName = "a-" + UUID.randomUUID().toString() + "." + ext; File newAttachment = new File(mAttachmentsDir, fileName); try (OutputStream os = new FileOutputStream(newAttachment);) { ByteStreams.copy(is, os); } Log.i(Logcat.TAG, "Wrote file [" + fileName + "]: " + newAttachment.length() + " bytes"); return getUriForFile(newAttachment); } catch (IOException e) { throw new IllegalStateException(e); } } public void deleteAll() { File[] files = mAttachmentsDir.listFiles(); if (files == null) { return; } for (File file : files) { file.delete(); } } @NonNull public ImmutableList getAllUris() { File[] files = mAttachmentsDir.listFiles(); if (files == null || files.length == 0) { return ImmutableList.of(); } ImmutableList.Builder uris = ImmutableList.builderWithExpectedSize(files.length); for (File file : files) { uris.add(getUriForFile(file)); } return uris.build(); } @NonNull private Uri getUriForFile(@NonNull File file) { return FileProvider.getUriForFile(mContext, FILE_PROVIDER_AUTHORITY, file); } }