blob: 615822a580833068e834a45a2bf87bf61ffe144f [file] [log] [blame]
/*
* Copyright (C) 2013 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.android.tools.idea.ddms.screenrecord;
import com.android.ddmlib.ScreenRecorderOptions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.ValidationInfo;
import org.jetbrains.android.util.AndroidBundle;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
public class ScreenRecorderOptionsDialog extends DialogWrapper {
@NonNls private static final String SCREENRECORDER_DIMENSIONS_KEY = "ScreenshotRecorder.Options.Dimensions";
private static final int DEFAULT_BITRATE_MBPS = 4;
private static int ourBitRateMbps = DEFAULT_BITRATE_MBPS;
private static int ourWidth;
private static int ourHeight;
private JPanel myPanel;
private JTextField myBitRateTextField;
private JTextField myWidthTextField;
private JTextField myHeightTextField;
public ScreenRecorderOptionsDialog(@NotNull Project project) {
super(project, true);
if (ourWidth > 0) {
myWidthTextField.setText(Integer.toString(ourWidth));
}
if (ourHeight > 0) {
myHeightTextField.setText(Integer.toString(ourHeight));
}
if (ourBitRateMbps > 0) {
myBitRateTextField.setText(Integer.toString(ourBitRateMbps));
}
setTitle("Screen Recorder Options");
init();
}
@Nullable
@Override
protected JComponent createCenterPanel() {
return myPanel;
}
@Nullable
@Override
protected String getDimensionServiceKey() {
return SCREENRECORDER_DIMENSIONS_KEY;
}
@Override
protected void createDefaultActions() {
super.createDefaultActions();
getOKAction().putValue(Action.NAME, AndroidBundle.message("android.ddms.screenrecord.options.ok.button.text"));
}
@Nullable
@Override
protected ValidationInfo doValidate() {
ValidationInfo info = validateIntegerMultipleOf(myBitRateTextField, 1, "Bit Rate must be an integer.");
if (info != null) {
return info;
}
// MediaEncoder prefers sizes that are multiples of 16 (https://code.google.com/p/android/issues/detail?id=37769).
info = validateIntegerMultipleOf(myWidthTextField, 16, "Width must be an integer.");
if (info != null) {
return info;
}
info = validateIntegerMultipleOf(myHeightTextField, 16, "Height must be an integer.");
if (info != null) {
return info;
}
return super.doValidate();
}
@Nullable
private static ValidationInfo validateIntegerMultipleOf(JTextField textField, int multiple, String errorMessage) {
String s = getText(textField);
if (s.isEmpty()) {
return null;
}
int x;
try {
x = Integer.parseInt(s);
}
catch (NumberFormatException e) {
return new ValidationInfo(errorMessage, textField);
}
return (x % multiple > 0) ? new ValidationInfo("Must be a multiple of " + multiple, textField) : null;
}
@SuppressWarnings("AssignmentToStaticFieldFromInstanceMethod")
@Override
protected void doOKAction() {
ourBitRateMbps = getIntegerValue(myBitRateTextField);
ourHeight = getIntegerValue(myHeightTextField);
ourWidth = getIntegerValue(myWidthTextField);
super.doOKAction();
}
private static int getIntegerValue(JTextField textField) {
String s = getText(textField);
return s.isEmpty() ? 0 : Integer.parseInt(s);
}
private static String getText(JTextField textField) {
Document doc = textField.getDocument();
try {
return doc.getText(0, doc.getLength()).trim();
}
catch (BadLocationException e) { // can't happen
return "";
}
}
public ScreenRecorderOptions getOptions() {
return new ScreenRecorderOptions.Builder().setBitRate(ourBitRateMbps).setSize(ourWidth, ourHeight).build();
}
}