/*
 * Copyright (C) 2022 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 android.perfetto.cts.reporter;

import android.os.ParcelFileDescriptor.AutoCloseInputStream;
import android.service.tracing.TraceReportService;
import android.util.Log;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;

public class PerfettoReportService extends TraceReportService {
    public static final String TAG = "PerfettoReportService";

    @Override
    public void onReportTrace(TraceParams args) {
        File f = new File(getExternalFilesDir(null), args.getUuid().toString());
        try {
            boolean created = f.createNewFile();
            if (!created) {
                throw new IllegalStateException("Failed to create file");
            }
            try (AutoCloseInputStream i = new AutoCloseInputStream(args.getFd())) {
                try (FileOutputStream o = new FileOutputStream((f))) {
                    o.write(i.readAllBytes());
                }
            }
        } catch (IOException ex) {
            throw new IllegalStateException("IO Exception", ex);
        }
    }
}
