blob: d1ddf1e0be6c299868e2f8c70c06e0b704213631 [file] [log] [blame]
/*
* Copyright (C) 2014 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.fmradio.dialogs;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.android.fmradio.FmRecorder;
import com.android.fmradio.FmService;
import com.android.fmradio.R;
import java.io.File;
/**
* The dialog fragment for save recording file
*/
public class FmSaveDialog extends DialogFragment {
private static final String TAG = "FmSaveDialog";
// save recording file button
private Button mButtonSave = null;
// discard recording file button
private Button mButtonDiscard = null;
// rename recording file edit text
private EditText mRecordingNameEditText = null;
// recording file default name
private String mDefaultRecordingName = null;
// recording file to save name
private String mRecordingNameToSave = null;
private OnRecordingDialogClickListener mListener = null;
// The default filename need't to check whether exist
private boolean mIsNeedCheckFilenameExist = false;
// record sd card path when start recording
private String mRecordingSdcard = null;
private String mRecordingFileName = null;
private String mTempRecordingName = null;
/**
* FM record dialog fragment, because fragment manager need empty
* constructor to instantiated this dialog fragment when configuration
* change
*/
public FmSaveDialog() {
}
/**
* FM record dialog fragment according name, should pass value recording
* file name
*
* @param defaultName The default file name in FileSystem
* @param recordingName The name in the dialog for show and save
*/
public FmSaveDialog(String sdcard, String defaultName, String recordingName) {
mRecordingSdcard = sdcard;
mTempRecordingName = defaultName + FmRecorder.RECORDING_FILE_EXTENSION;
mDefaultRecordingName = recordingName;
mRecordingNameToSave = recordingName;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnRecordingDialogClickListener) activity;
} catch (ClassCastException e) {
e.printStackTrace();
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
if (savedInstanceState != null) {
mRecordingNameToSave = savedInstanceState.getString("record_file_name");
mDefaultRecordingName = savedInstanceState.getString("record_default_name");
mRecordingSdcard = FmService.getRecordingSdcard();
}
setStyle(STYLE_NO_TITLE, 0);
View view = getActivity().getLayoutInflater().inflate(R.layout.save_dialog, null);
mButtonSave = (Button) view.findViewById(R.id.save_dialog_button_save);
mButtonSave.setOnClickListener(mButtonOnClickListener);
mButtonDiscard = (Button) view.findViewById(R.id.save_dialog_button_discard);
mButtonDiscard.setOnClickListener(mButtonOnClickListener);
// Set the recording edit text
mRecordingNameEditText = (EditText) view.findViewById(R.id.save_dialog_edittext);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()).setView(view);
return builder.create();
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
if (mListener != null) {
mListener.onRecordingDialogClick(mRecordingFileName);
mListener = null;
}
}
/**
* Set the dialog edit text and other attribute
*/
@Override
public void onResume() {
super.onResume();
// have define in fm_recorder_dialog.xml length at most
// 250(maxFileLength - suffixLength)
if (mDefaultRecordingName != null) {
if (null != mRecordingNameToSave) {
// this case just for,fragment recreate
mRecordingNameEditText.setText(mRecordingNameToSave);
if ("".equals(mRecordingNameToSave)) {
mButtonSave.setEnabled(false);
}
} else {
mRecordingNameEditText.setText(mDefaultRecordingName);
}
}
mRecordingNameEditText.requestFocus();
setTextChangedCallback();
Dialog dialog = getDialog();
dialog.setCanceledOnTouchOutside(false);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE
| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString("record_file_name", mRecordingNameToSave);
outState.putString("record_default_name", mDefaultRecordingName);
super.onSaveInstanceState(outState);
}
/**
* This method register callback and set filter to Edit, in order to make
* sure that user input is legal. The input can't be illegal filename and
* can't be too long.
*/
private void setTextChangedCallback() {
mRecordingNameEditText.addTextChangedListener(new TextWatcher() {
// not use, so don't need to implement it
@Override
public void afterTextChanged(Editable arg0) {
}
// not use, so don't need to implement it
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
/**
* check user input whether include invalid character
*/
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// Filename changed, so we should check the new filename is
// whether exist.
mIsNeedCheckFilenameExist = true;
String recordName = s.toString().trim();
// Characters not allowed by file system
if (recordName.length() <= 0
|| recordName.startsWith(".")
|| recordName.matches(".*[/\\\\:*?\"<>|\t].*")) {
mButtonSave.setEnabled(false);
} else {
mButtonSave.setEnabled(true);
}
mRecordingNameToSave = mRecordingNameEditText.getText().toString().trim();
}
});
}
private OnClickListener mButtonOnClickListener = new OnClickListener() {
/**
* Define the button operation
*/
@Override
public void onClick(View v) {
File recordingFolderPath = new File(mRecordingSdcard, "FM Recording");
switch (v.getId()) {
case R.id.save_dialog_button_save:
String msg = null;
// Check the recording name whether exist
mRecordingNameToSave = mRecordingNameEditText.getText().toString().trim();
File recordingFileToSave = new File(recordingFolderPath, mRecordingNameToSave
+ FmRecorder.RECORDING_FILE_EXTENSION);
if (mRecordingNameToSave.equals(mDefaultRecordingName)) {
mIsNeedCheckFilenameExist = false;
} else {
mIsNeedCheckFilenameExist = true;
}
if (recordingFileToSave.exists() && mIsNeedCheckFilenameExist) {
// show a toast notification if can't renaming a file/folder
// to the same name
msg = mRecordingNameEditText.getText().toString() + " "
+ getActivity().getResources().getString(R.string.already_exists);
Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();
} else {
mRecordingFileName = mRecordingNameToSave;
dismissAllowingStateLoss();
}
break;
case R.id.save_dialog_button_discard:
dismissAllowingStateLoss();
// here need delete discarded recording file
File needToDelete = new File(recordingFolderPath, mTempRecordingName);
if (needToDelete.exists()) {
needToDelete.delete();
}
break;
default:
break;
}
}
};
/**
* The listener for click Save or Discard
*/
public interface OnRecordingDialogClickListener {
/**
* Record dialog click callback
*
* @param recordingName The user input recording name
*/
void onRecordingDialogClick(String recordingName);
}
}