chromium/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ClipboardImageFileProvider.java

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.components.browser_ui.share;

import static org.chromium.components.browser_ui.share.ClipboardConstants.CLIPBOARD_SHARED_URI;
import static org.chromium.components.browser_ui.share.ClipboardConstants.CLIPBOARD_SHARED_URI_TIMESTAMP;

import android.content.SharedPreferences;
import android.net.Uri;
import android.text.TextUtils;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import org.chromium.base.Callback;
import org.chromium.base.ContextUtils;
import org.chromium.base.StrictModeContext;
import org.chromium.ui.base.Clipboard;

/** Implementation class for {@link Clipboard.ImageFileProvider}. */
public class ClipboardImageFileProvider implements Clipboard.ImageFileProvider {
    @Override
    public void storeImageAndGenerateUri(
            byte[] imageData, String fileExtension, Callback<Uri> callback) {
        ShareImageFileUtils.generateTemporaryUriFromData(imageData, fileExtension, callback);
    }

    @Override
    public void storeLastCopiedImageMetadata(@NonNull ClipboardFileMetadata clipboardFileMetadata) {
        ContextUtils.getAppSharedPreferences()
                .edit()
                .putString(CLIPBOARD_SHARED_URI, clipboardFileMetadata.uri.toString())
                .putLong(CLIPBOARD_SHARED_URI_TIMESTAMP, clipboardFileMetadata.timestamp)
                .apply();
    }

    @Override
    public @Nullable ClipboardFileMetadata getLastCopiedImageMetadata() {
        SharedPreferences prefs = ContextUtils.getAppSharedPreferences();
        try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) {
            String uriString = prefs.getString(CLIPBOARD_SHARED_URI, null);
            if (TextUtils.isEmpty(uriString)) return null;

            Uri uri = Uri.parse(uriString);
            long timestamp = prefs.getLong(CLIPBOARD_SHARED_URI_TIMESTAMP, 0L);

            return new ClipboardFileMetadata(uri, timestamp);
        }
    }

    @Override
    public void clearLastCopiedImageMetadata() {
        ContextUtils.getAppSharedPreferences()
                .edit()
                .remove(CLIPBOARD_SHARED_URI)
                .remove(CLIPBOARD_SHARED_URI_TIMESTAMP)
                .apply();
    }
}