package org.yaxim.androidclient.dialogs; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.yaxim.androidclient.MainWindow; import org.yaxim.androidclient.YaximApplication; import org.yaxim.androidclient.R; import org.yaxim.androidclient.data.YaximConfiguration; import org.yaxim.androidclient.util.PreferenceConstants; import org.yaxim.androidclient.util.StatusMode; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageView; import android.widget.Spinner; import android.widget.TextView; import android.widget.AutoCompleteTextView; public class ChangeStatusDialog extends AlertDialog { private final CheckBox mDndSilent; private final Spinner mStatus; private final AutoCompleteTextView mMessage; private final MainWindow mContext; private final YaximConfiguration mConfig; public ChangeStatusDialog(final MainWindow context, final YaximConfiguration config) { super(context); mContext = context; mConfig = config; LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View group = inflater.inflate(R.layout.statusview, null, false); final List<StatusMode> modes = new ArrayList<StatusMode>( Arrays.asList(StatusMode.values())); // the user can not set statusmode "subscribe", it is only for incoming presences modes.remove(StatusMode.unknown); modes.remove(StatusMode.subscribe); Collections.sort(modes, new Comparator<StatusMode>() { public int compare(StatusMode object1, StatusMode object2) { return object2.compareTo(object1); } }); mDndSilent = (CheckBox) group.findViewById(R.id.statusview_dnd_when_silent); mDndSilent.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { mStatus.setEnabled(true); setSpinnerSelection(modes, StatusMode.fromString(mConfig.statusMode)); mDndSilent.setVisibility(View.GONE); } }); mStatus = (Spinner) group.findViewById(R.id.statusview_spinner); StatusModeAdapter mStatusAdapter; mStatusAdapter = new StatusModeAdapter(context, R.layout.status_spinner_item, modes); mStatus.setAdapter(mStatusAdapter); setSpinnerSelection(modes, mConfig.getPresenceMode()); if (mConfig.smartAwayMode != null) { mStatus.setEnabled(false); mDndSilent.setVisibility(View.VISIBLE); mDndSilent.setChecked(true); } mMessage = (AutoCompleteTextView) group.findViewById(R.id.statusview_message); mMessage.setText(mConfig.statusMessage); mMessage.setAdapter(new ArrayAdapter<String>(context, android.R.layout.simple_dropdown_item_1line, mConfig.statusMessageHistory)); mMessage.setThreshold(1); Button messageClearButton = (Button) group.findViewById(R.id.statusview_message_button_clear); messageClearButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { mMessage.setText(""); } }); setTitle(R.string.statuspopup_name); setView(group); setButton(BUTTON_POSITIVE, context.getString(android.R.string.ok), new OkListener()); setButton(BUTTON_NEGATIVE, context.getString(android.R.string.cancel), (OnClickListener) null); } private void setSpinnerSelection(List<StatusMode> modes, StatusMode status_mode) { for (int i = 0; i < modes.size(); i++) { if (modes.get(i).equals(status_mode)) { mStatus.setSelection(i); } } } private void setAndSaveStatus() { StatusMode statusMode = (StatusMode) mStatus.getSelectedItem(); String message = mMessage.getText().toString(); // save update into prefs SharedPreferences.Editor prefedit = PreferenceManager .getDefaultSharedPreferences(mContext).edit(); // do not save "offline" to prefs, do not save when DND-silent is enabled if (statusMode != StatusMode.offline && !mDndSilent.isChecked()) prefedit.putString(PreferenceConstants.STATUS_MODE, statusMode.name()); if (!message.equals(mConfig.statusMessage)) { List<String> smh = new ArrayList<String>(java.util.Arrays.asList(mConfig.statusMessageHistory)); if (!smh.contains(message)) smh.add(message); String smh_joined = android.text.TextUtils.join("\036", smh); prefedit.putString(PreferenceConstants.STATUS_MESSAGE_HISTORY, smh_joined); } prefedit.putString(PreferenceConstants.STATUS_MESSAGE, message); // check if DND-silent was disabled by the user if (!mDndSilent.isChecked() && mConfig.smartAwayMode != null) { prefedit.putBoolean(PreferenceConstants.STATUS_DNDSILENT, false); mConfig.smartAwayMode = null; } prefedit.commit(); mContext.updateStatus(statusMode); } private class OkListener implements OnClickListener { @Override public void onClick(DialogInterface dialog, int which) { setAndSaveStatus(); } } private class StatusModeAdapter extends ArrayAdapter<StatusMode> { public StatusModeAdapter(Context context, int textViewResourceId, List<StatusMode> modes) { super(context, textViewResourceId, modes); } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { return getCustomView(position, convertView, parent, true); } @Override public View getView(int position, View convertView, ViewGroup parent) { return getCustomView(position, convertView, parent, false); } public View getCustomView(int position, View convertView, ViewGroup parent, boolean padding) { LayoutInflater inflater = getLayoutInflater(); View spinner = inflater.inflate(R.layout.status_spinner_item, parent, false); TextView text = (TextView) spinner.findViewById(R.id.status_text); text.setText(getItem(position).getTextId()); ImageView icon = (ImageView) spinner.findViewById(R.id.status_icon); icon.setImageResource(getItem(position).getDrawableId()); if (!padding) spinner.setPadding(0, 0, 0, 0); return spinner; } } }