1ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi/*
2ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Copyright (C) 2010 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;
18ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
19ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.app.AlertDialog;
20ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.app.Dialog;
21ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.content.Context;
22ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.content.DialogInterface;
23ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.MediaProperties;
24ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.util.Pair;
25ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.view.LayoutInflater;
26ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.view.View;
27ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.widget.ArrayAdapter;
28ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.widget.Spinner;
29ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
30ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi/**
31ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * The export options dialog
32ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */
33ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschipublic class ExportOptionsDialog {
34ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    // Listener
35ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public interface ExportOptionsListener {
36ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        /**
37ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         * User initiated the export operation
38ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         *
39ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         * @param movieHeight The movie height (from MediaProperties)
40ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         * @param movieBitrate The movie bitrate (from MediaProperties)
41ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         */
42ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        public void onExportOptions(int movieHeight, int movieBitrate);
43ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
44ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
45ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
46ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Create the export options dialog
47ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
48ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
49ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param positiveListener The positive listener
50ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param negativeListener The negative listener
51ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param cancelListener The cancel listener
52ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param aspectRatio The aspect ratio
53ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
54ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The dialog
55ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
56ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static Dialog create(Context context, final ExportOptionsListener positiveListener,
57ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            DialogInterface.OnClickListener negativeListener,
58ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            DialogInterface.OnCancelListener cancelListener, final int aspectRatio) {
59ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        AlertDialog.Builder builder = new AlertDialog.Builder(context);
60ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
61ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Set the title
62ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        builder.setIcon(android.R.drawable.ic_dialog_info);
63ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        builder.setTitle(context.getString(R.string.editor_export_movie));
64ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
65ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Set the layout
66ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final LayoutInflater vi = (LayoutInflater)context
67ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
68ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final View myView = vi.inflate(R.layout.export_options_dialog_view, null);
69ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        builder.setView(myView);
70ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
71ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Prepare the dialog content
72ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        prepareContent(myView, aspectRatio);
73ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
74ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Setup the positive listener
75ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        builder.setPositiveButton(context.getString(R.string.export_dialog_export),
76ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                new DialogInterface.OnClickListener() {
772cf647324622315db4b77cb7d637a5b0a516dce4Shih-chia Cheng                    @Override
78ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    public void onClick(DialogInterface dialog, int which) {
79ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final Spinner sizeSpinner = (Spinner)myView.findViewById(
80ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                R.id.export_option_size);
81ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final int movieHeight = indexToMovieHeight(
82ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                sizeSpinner.getSelectedItemPosition(), aspectRatio);
83ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final Spinner qualitySpinner = (Spinner)myView.findViewById(
84ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                R.id.export_option_quality);
85ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final int movieBitrate = indexToMovieBitrate(
86ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                qualitySpinner.getSelectedItemPosition());
87ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        positiveListener.onExportOptions(movieHeight, movieBitrate);
88ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
89ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                });
90ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
91ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Setup the negative listener
92ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        builder.setNegativeButton(context.getString(android.R.string.cancel), negativeListener);
93ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
94ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        builder.setCancelable(true);
95ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        builder.setOnCancelListener(cancelListener);
96ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
97acb912709027b1c47fa3fa371e3aa68efd61501cGil Dobjanschi        final AlertDialog dialog = builder.create();
982cf647324622315db4b77cb7d637a5b0a516dce4Shih-chia Cheng
99acb912709027b1c47fa3fa371e3aa68efd61501cGil Dobjanschi        return dialog;
100ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
101ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
102ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
103ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Prepare the dialog content
104ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
105ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param view The dialog content view
106ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param aspectRatio The project aspect ratio
107ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
108ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static void prepareContent(View view, int aspectRatio) {
109ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Context context = view.getContext();
110ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Setup the movie size spinner
111ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final ArrayAdapter<CharSequence> sizeAdapter = new ArrayAdapter<CharSequence>(
112ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                context, android.R.layout.simple_spinner_item);
113ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        sizeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
114ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Pair<Integer, Integer>[] supportedSizes =
115ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            MediaProperties.getSupportedResolutions(aspectRatio);
116ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        for (int i = 0; i < supportedSizes.length; i++) {
117ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            sizeAdapter.add(supportedSizes[i].first + "x" + supportedSizes[i].second);
118ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
119ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Spinner sizeSpinner = (Spinner)view.findViewById(R.id.export_option_size);
120ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        sizeSpinner.setAdapter(sizeAdapter);
121ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        sizeSpinner.setPromptId(R.string.export_dialog_movie_size);
122ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
123ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Setup the movie quality spinner
124ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final ArrayAdapter<CharSequence> qualityAdapter = new ArrayAdapter<CharSequence>(context,
125ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                android.R.layout.simple_spinner_item);
126ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        qualityAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
127ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        qualityAdapter.add(context.getString(R.string.export_dialog_movie_quality_low));
128ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        qualityAdapter.add(context.getString(R.string.export_dialog_movie_quality_medium));
129ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        qualityAdapter.add(context.getString(R.string.export_dialog_movie_quality_high));
130ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Spinner qualitySpinner = (Spinner)view.findViewById(R.id.export_option_quality);
131ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        qualitySpinner.setAdapter(qualityAdapter);
132ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Set the default quality to "Medium"
133ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        qualitySpinner.setSelection(1);
134ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        qualitySpinner.setPromptId(R.string.export_dialog_movie_quality);
135ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
136ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
137ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
138ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Convert the spinner selection to a movie height
139ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
140ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param sizeIndex The index of the selected spinner item
141ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param aspectRatio The aspect ratio
142ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
143ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The movie height
144ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
145ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static int indexToMovieHeight(int sizeIndex, int aspectRatio) {
146ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Pair<Integer, Integer>[] supportedSizes =
147ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            MediaProperties.getSupportedResolutions(aspectRatio);
148ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return supportedSizes[sizeIndex].second;
149ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
150ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
151ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
152ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Convert the spinner selection to a movie quality
153ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
154ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param qualityIndex The index of the selected spinner item
155ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
156ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The movie bitrate
157ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
158ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static int indexToMovieBitrate(int qualityIndex) {
159ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        switch (qualityIndex) {
160ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case 0: { // Low
161ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                return MediaProperties.BITRATE_512K;
162ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
163ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
164ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case 1: { // Medium
165ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                return MediaProperties.BITRATE_2M;
166ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
167ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
168ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case 2: { // High
169ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                return MediaProperties.BITRATE_8M;
170ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
171ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
172ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            default: {
173ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                return MediaProperties.BITRATE_2M;
174ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
175ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
176ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
177ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi}
178