/* * 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(); } }