blob: 228db9351693d834478ddf2b22aba9484fd957b6 [file] [log] [blame]
/*
* 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<Uri> getAllUris() {
File[] files = mAttachmentsDir.listFiles();
if (files == null || files.length == 0) {
return ImmutableList.of();
}
ImmutableList.Builder<Uri> 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);
}
}