/** * Copyright (c) 2012 Todoroo Inc * * See the file "LICENSE" for the full license governing this code. */ package com.todoroo.astrid.ui; import android.app.Activity; import android.app.Dialog; import android.content.DialogInterface; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.view.Window; import android.widget.Button; import com.timsu.astrid.R; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.helper.TaskEditControlSet; import com.todoroo.astrid.service.ThemeService; public abstract class PopupControlSet extends TaskEditControlSet { protected final View displayView; protected Dialog dialog; private final String titleString; public interface PopupDialogClickListener { public boolean onClick(DialogInterface d, int which); } final PopupDialogClickListener okListener = new PopupDialogClickListener() { @Override public boolean onClick(DialogInterface d, int which) { return onOkClick(); } }; final DialogInterface.OnCancelListener cancelListener = new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface d) { onCancelClick(); } }; public PopupControlSet(Activity activity, int viewLayout, int displayViewLayout, final int title) { super(activity, viewLayout); if (displayViewLayout != -1) this.displayView = LayoutInflater.from(activity).inflate(displayViewLayout, null); else this.displayView = null; titleString = (title > 0) ? activity.getString(title) : ""; //$NON-NLS-1$ if (displayView != null) { displayView.setOnClickListener(getDisplayClickListener()); } } @Override public View getDisplayView() { return displayView; } protected Dialog buildDialog(String title, final PopupDialogClickListener okClickListener, DialogInterface.OnCancelListener cancelClickListener) { int theme = ThemeService.getEditDialogTheme(); dialog = new Dialog(activity, theme); if (title.length() == 0) dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); else dialog.setTitle(title); View v = getView(); dialog.setContentView(v, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); Button dismiss = (Button) v.findViewById(R.id.edit_dlg_ok); if (dismiss != null) { dismiss.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { if (okClickListener.onClick(dialog, 0)) DialogUtilities.dismissDialog(activity, dialog); } }); } LayoutParams params = dialog.getWindow().getAttributes(); params.width = LayoutParams.FILL_PARENT; params.height = LayoutParams.WRAP_CONTENT; if (AndroidUtilities.isTabletSized(activity)) { DisplayMetrics metrics = activity.getResources().getDisplayMetrics(); if ((metrics.widthPixels / metrics.density) >= AndroidUtilities.MIN_TABLET_HEIGHT) params.width = (3 * metrics.widthPixels) / 5; else if ((metrics.widthPixels / metrics.density) >= AndroidUtilities.MIN_TABLET_WIDTH) params.width = (4 * metrics.widthPixels) / 5; } dialog.getWindow().setAttributes((android.view.WindowManager.LayoutParams) params); dialog.setOnCancelListener(cancelClickListener); dialog.setOwnerActivity(PopupControlSet.this.activity); additionalDialogSetup(); return dialog; } protected OnClickListener getDisplayClickListener() { return new OnClickListener() { @Override public void onClick(View v) { if (dialog == null) { buildDialog(titleString, okListener, cancelListener); } dialog.show(); } }; } protected void additionalDialogSetup() { // Will be called after dialog is set up. // Subclasses can override } /** * @return true if the dialog should be dismissed as the result of * the click. Default is true. */ protected boolean onOkClick() { refreshDisplayView(); return true; } protected void onCancelClick() { refreshDisplayView(); } public Dialog getDialog() { return dialog; } @Override public String writeToModel(Task task) { if (initialized && dialog != null) dialog.dismiss(); return super.writeToModel(task); } @Override public void readFromTask(Task task) { super.readFromTask(task); refreshDisplayView(); } protected abstract void refreshDisplayView(); }