blob: 36c08d5c94e71d38ea89a097429334e4f1765233 [file] [log] [blame]
/*
* Copyright (C) 2012 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.deskclock;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.ColorStateList;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.AppCompatEditText;
import android.text.Editable;
import android.text.InputType;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
import com.android.deskclock.data.DataModel;
import com.android.deskclock.data.Timer;
import com.android.deskclock.provider.Alarm;
import static android.graphics.Color.RED;
import static android.graphics.Color.WHITE;
import static android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE;
/**
* DialogFragment to edit label.
*/
public class LabelDialogFragment extends DialogFragment {
private static final String KEY_LABEL = "label";
private static final String KEY_ALARM = "alarm";
private static final String KEY_TIMER_ID = "timer_id";
private static final String KEY_TAG = "tag";
private AppCompatEditText mLabelBox;
private Alarm mAlarm;
private int mTimerId;
private String mTag;
public static LabelDialogFragment newInstance(Alarm alarm, String label, String tag) {
final Bundle args = new Bundle();
args.putString(KEY_LABEL, label);
args.putParcelable(KEY_ALARM, alarm);
args.putString(KEY_TAG, tag);
final LabelDialogFragment frag = new LabelDialogFragment();
frag.setArguments(args);
return frag;
}
public static LabelDialogFragment newInstance(Timer timer) {
final Bundle args = new Bundle();
args.putString(KEY_LABEL, timer.getLabel());
args.putInt(KEY_TIMER_ID, timer.getId());
final LabelDialogFragment frag = new LabelDialogFragment();
frag.setArguments(args);
return frag;
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(KEY_LABEL, mLabelBox.getText().toString());
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Bundle bundle = getArguments();
mAlarm = bundle.getParcelable(KEY_ALARM);
mTimerId = bundle.getInt(KEY_TIMER_ID, -1);
mTag = bundle.getString(KEY_TAG);
final String label = savedInstanceState != null ?
savedInstanceState.getString(KEY_LABEL) : bundle.getString(KEY_LABEL);
final Context context = getActivity();
mLabelBox = new AppCompatEditText(context);
mLabelBox.setOnEditorActionListener(new ImeDoneListener());
mLabelBox.addTextChangedListener(new TextChangeListener(context));
mLabelBox.setSingleLine();
mLabelBox.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
mLabelBox.setText(label);
mLabelBox.selectAll();
final int padding = getResources().getDimensionPixelSize(R.dimen.label_edittext_padding);
final AlertDialog alertDialog = new AlertDialog.Builder(context)
.setView(mLabelBox, padding, 0, padding, 0)
.setPositiveButton(R.string.time_picker_set, new OkListener())
.setNegativeButton(R.string.time_picker_cancel, new CancelListener())
.setMessage(R.string.label)
.create();
alertDialog.getWindow().setSoftInputMode(SOFT_INPUT_STATE_VISIBLE);
return alertDialog;
}
/**
* Sets the new label into the timer or alarm.
*/
private void setLabel() {
String label = mLabelBox.getText().toString();
if (label.trim().isEmpty()) {
// Don't allow user to input label with only whitespace.
label = "";
}
if (mAlarm != null) {
((AlarmLabelDialogHandler) getActivity()).onDialogLabelSet(mAlarm, label, mTag);
} else if (mTimerId >= 0) {
final Timer timer = DataModel.getDataModel().getTimer(mTimerId);
if (timer != null) {
DataModel.getDataModel().setTimerLabel(timer, label);
}
}
}
interface AlarmLabelDialogHandler {
void onDialogLabelSet(Alarm alarm, String label, String tag);
}
/**
* Alters the UI to indicate when input is valid or invalid.
*/
private class TextChangeListener implements TextWatcher {
private final int colorAccent;
private final int colorControlNormal;
public TextChangeListener(Context context) {
colorAccent = Utils.obtainStyledColor(context, R.attr.colorAccent, RED);
colorControlNormal = Utils.obtainStyledColor(context, R.attr.colorControlNormal, WHITE);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
final int color = TextUtils.isEmpty(s) ? colorControlNormal : colorAccent;
mLabelBox.setSupportBackgroundTintList(ColorStateList.valueOf(color));
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void afterTextChanged(Editable editable) {}
}
/**
* Handles completing the label edit from the IME keyboard.
*/
private class ImeDoneListener implements TextView.OnEditorActionListener {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
setLabel();
dismiss();
return true;
}
return false;
}
}
/**
* Handles completing the label edit from the Ok button of the dialog.
*/
private class OkListener implements DialogInterface.OnClickListener {
@Override
public void onClick(DialogInterface dialog, int which) {
setLabel();
dismiss();
}
}
/**
* Handles discarding the label edit from the Cancel button of the dialog.
*/
private class CancelListener implements DialogInterface.OnClickListener {
@Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
}
}
}