1ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi/*
2ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Copyright (C) 2009 The Android Open Source Project
3ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi *
4ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Licensed under the Apache License, Version 2.0 (the "License");
5ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * you may not use this file except in compliance with the License.
6ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * You may obtain a copy of the License at
7ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi *
8ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi *      http://www.apache.org/licenses/LICENSE-2.0
9ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi *
10ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Unless required by applicable law or agreed to in writing, software
11ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * distributed under the License is distributed on an "AS IS" BASIS,
12ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * See the License for the specific language governing permissions and
14ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * limitations under the License.
15ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */
16ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1781393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschipackage com.android.videoeditor.util;
18ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
19ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport java.io.File;
20ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport java.io.FileNotFoundException;
21ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport java.io.FileOutputStream;
22ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport java.io.IOException;
23ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport java.io.InputStream;
24ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2581393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.R;
2681393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschi
27ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.content.Context;
28ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.graphics.Bitmap;
29ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.graphics.BitmapFactory;
30ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.graphics.Bitmap.CompressFormat;
31ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.MediaProperties;
32ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.os.Environment;
33ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.util.Log;
34ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
35ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi/**
36ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * File utilities
37ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */
38ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschipublic class FileUtils {
39ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    // Logging
40ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String TAG = "FileUtils";
41ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
42ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
43ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * It is not possible to instantiate this class
44ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
45ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private FileUtils() {
46ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
47ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
48ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4915eda327c9efcb98ddaad61e728c93da41fa3c21Shih-chia Cheng     * Gets the root path for all projects
50ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
5115eda327c9efcb98ddaad61e728c93da41fa3c21Shih-chia Cheng     * @param context The context
5283af1c18a2eaab1b53fd29d5c9118e1f078b6e3dGil Dobjanschi     *
53a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng     * @return The file representing the projects root directory, {@code null} if the external
54a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng     * storage is not currnetly mounted
55ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
5683af1c18a2eaab1b53fd29d5c9118e1f078b6e3dGil Dobjanschi    public static File getProjectsRootDir(Context context)
5783af1c18a2eaab1b53fd29d5c9118e1f078b6e3dGil Dobjanschi            throws FileNotFoundException, IOException {
58ccf40984dfe63839a81ecb06a748a68adf836f0eGil Dobjanschi        final File dir = context.getExternalFilesDir(null);
59a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng        if (dir != null && !dir.exists()) {
60ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (!dir.mkdirs()) {
61ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                throw new FileNotFoundException("Cannot create folder: " + dir.getAbsolutePath());
62ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            } else {
63ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                // Create the file which hides the media files
64ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (!new File(dir, ".nomedia").createNewFile()) {
65ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    throw new FileNotFoundException("Cannot create file .nomedia");
66ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
67ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
68ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
69ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
70ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return dir;
71ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
72ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
73ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
74ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Get the filename for the specified raw resource id. Create the file if
75ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * the file does not exist.
76ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
77ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
78ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param maskRawResourceId The mask raw resource id
79ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
80ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The mask filename
81ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
82ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static String getMaskFilename(Context context, int maskRawResourceId)
83ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            throws FileNotFoundException, IOException {
84ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final String filename;
85ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        switch (maskRawResourceId) {
86ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case R.raw.mask_contour: {
87ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                filename = "mask_countour.jpg";
88ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
89ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
90ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
91ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case R.raw.mask_diagonal: {
92ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                filename = "mask_diagonal.jpg";
93ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
94ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
95ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
96ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            default: {
97ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                throw new IllegalArgumentException("Invalid mask raw resource id");
98ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
99ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
100ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
101ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final File mf = new File(context.getFilesDir(), filename);
102ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (!mf.exists()) {
103ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            Bitmap bitmap = null;
104ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            FileOutputStream fos = null;
105ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            InputStream is = null;
106ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            try {
107ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                is = context.getResources().openRawResource(maskRawResourceId);
108ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                bitmap = BitmapFactory.decodeStream(is);
109ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (bitmap == null) {
110ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    throw new IllegalStateException("Cannot decode raw resource mask");
111ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
112ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
113ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                fos = context.openFileOutput(filename, Context.MODE_WORLD_READABLE);
114ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (!bitmap.compress(CompressFormat.JPEG, 100, fos)) {
115ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    throw new IllegalStateException("Cannot compress bitmap");
116ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
117ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            } finally {
118ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (is != null) {
119ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    is.close();
120ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
121ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
122ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (bitmap != null) {
123ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    bitmap.recycle();
124ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
125ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
126ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (fos != null) {
127ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    fos.flush();
128ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    fos.close();
129ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
130ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
131ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
132ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
133ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return mf.getAbsolutePath();
134ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
135ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
136ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
137ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Get the raw id for the mask file
138ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
139ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param path The full file name
140ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
141ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The raw id
142ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
143ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static int getMaskRawId(String path) {
144ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final String filename = new File(path).getName();
145ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
146ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (filename.equals("mask_countour.jpg")) {
147ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return R.raw.mask_contour;
148ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        } else if (filename.equals("mask_diagonal.jpg")) {
149ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return R.raw.mask_diagonal;
150ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        } else {
151ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            throw new IllegalArgumentException("Unknown file: " + path);
152ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
153ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
154ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
155ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
156ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Get the filename for the specified raw resource id. Create the file if
157ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * the file does not exist
158ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
159ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
160ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param rawResourceId The raw resource id
161ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
162ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The audio track filename
163ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
164ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static String getAudioTrackFilename(Context context, int rawResourceId)
165ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            throws FileNotFoundException, IOException {
166ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final String filename;
167ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        switch (rawResourceId) {
168ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case R.raw.theme_travel_audio_track: {
169ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                filename = "theme_travel.m4a";
170ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
171ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
172ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
173ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case R.raw.theme_surfing_audio_track: {
174ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                filename = "theme_surfing.m4a";
175ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
176ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
177ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
178ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case R.raw.theme_film_audio_track: {
179ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                filename = "theme_film.m4a";
180ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
181ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
182ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
183ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case R.raw.theme_rockandroll_audio_track: {
184ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                filename = "theme_rockandroll.m4a";
185ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
186ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
187ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
188ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            default: {
189ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                throw new IllegalArgumentException("Invalid audio track raw resource id");
190ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
191ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
192ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
193ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final File mf = new File(context.getFilesDir(), filename);
194ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (!mf.exists()) {
195ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            FileOutputStream fos = null;
196ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            InputStream is = null;
197ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            try {
198ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                is = context.getResources().openRawResource(rawResourceId);
199ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                fos = context.openFileOutput(filename, Context.MODE_WORLD_READABLE);
200ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final byte[] buffer = new byte[1024];
201ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                int bytesRead;
202ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                while ((bytesRead = is.read(buffer)) > 0) {
203ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    fos.write(buffer, 0, bytesRead);
204ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
205ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            } finally {
206ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (is != null) {
207ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    is.close();
208ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
209ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
210ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (fos != null) {
211ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    fos.flush();
212ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    fos.close();
213ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
214ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
215ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
216ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
217ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return mf.getAbsolutePath();
218ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
219ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
220ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
221ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Create a new project directory
222ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
223ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The absolute path to the project
224ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
22583af1c18a2eaab1b53fd29d5c9118e1f078b6e3dGil Dobjanschi    public static String createNewProjectPath(Context context)
22683af1c18a2eaab1b53fd29d5c9118e1f078b6e3dGil Dobjanschi            throws FileNotFoundException, IOException {
22783af1c18a2eaab1b53fd29d5c9118e1f078b6e3dGil Dobjanschi        final File file = new File(getProjectsRootDir(context), StringUtils.randomString(10));
228ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (Log.isLoggable(TAG, Log.DEBUG)) {
229ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            Log.d(TAG, "New project: " + file.getAbsolutePath());
230ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
231ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
232ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return file.getAbsolutePath();
233ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
234ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
235ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
236ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Get a unique video filename.
237ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
238ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param fileType The file type
239ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
240ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The filename
241ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
242ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static String createMovieName(int fileType) {
243ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final String filename;
244ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        switch (fileType) {
245ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case MediaProperties.FILE_MP4: {
246ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                filename = "movie_" + StringUtils.randomStringOfNumbers(6) + ".mp4";
247ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
248ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
249ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
250ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case MediaProperties.FILE_3GP: {
251ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                filename = "movie_" + StringUtils.randomStringOfNumbers(6) + ".3gp";
252ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
253ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
254ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
255ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            default: {
256ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                throw new IllegalArgumentException("Unsupported file type: " + fileType);
257ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
258ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
259ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
260ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final File moviesDirectory = Environment.getExternalStoragePublicDirectory(
261ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                Environment.DIRECTORY_MOVIES);
262ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Make this directory if it does not exist
263ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (!moviesDirectory.exists()) {
264ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            moviesDirectory.mkdirs();
265ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
266ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
267ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final File f = new File(moviesDirectory, filename);
268ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return f.getAbsolutePath();
269ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
270ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
271ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
272ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Delete all the files in the specified folder and the folder itself.
273ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
274ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param dir The project path
275ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
276ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static boolean deleteDir(File dir) {
277ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (dir.isDirectory()) {
278ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final String[] children = dir.list();
279ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            for (int i = 0; i < children.length; i++) {
280ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final File f = new File(dir, children[i]);
281ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (!deleteDir(f)) {
282ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    Log.e(TAG, "File cannot be deleted: " + f.getAbsolutePath());
283ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    return false;
284ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
285ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
286ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
287ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
288ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // The directory is now empty so delete it
289ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return dir.delete();
290ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
291ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
292ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
293ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Get the name of the file
294ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
295ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param filename The full path filename
296ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The name of the file
297ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
298ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static String getSimpleName(String filename) {
299ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final int index = filename.lastIndexOf('/');
300ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (index == -1) {
301ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return filename;
302ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        } else {
303ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return filename.substring(index + 1);
304ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
305ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
306ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi}
307