package com.moez.QKSMS.ui.dialog.mms; import android.app.Dialog; import android.app.DialogFragment; import android.app.Fragment; import android.content.Context; import android.content.DialogInterface; import android.content.res.Resources; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.ScrollView; import com.moez.QKSMS.R; import com.moez.QKSMS.common.utils.Units; import com.moez.QKSMS.ui.ThemeManager; import com.moez.QKSMS.ui.view.QKTextView; /** * @author Moez Bhatti * @author Shane Creighton-Young * @since 2015-02-08 * * BaseDialogFragment is a backwards-compatible, Material-styled Dialog fragment. * * To listen on results from BaseDialogFragment, launch it from a Fragment that implements * DialogFragmentListener. Then, the "onDialogFragmentResult" methods will get called much like * "onActivityResult". */ public class MMSDialogFragment extends DialogFragment { private final String TAG = "QKDialogFragment"; private Context mContext; private Resources mResources; protected DialogFragmentListener mListener; // Result codes for this public static final int POSITIVE_BUTTON_RESULT = 0; public static final int NEUTRAL_BUTTON_RESULT = 1; public static final int NEGATIVE_BUTTON_RESULT = 2; public static final int LIST_ITEM_CLICK_RESULT = 3; public static final int DISMISS_RESULT = 4; // Views private boolean mTitleEnabled; private String mTitleText; private QKTextView mTitleView; private LinearLayout mContentPanel; private boolean mMessageEnabled; private String mMessageText; private QKTextView mMessageView; private LinearLayout mCustomPanel; private boolean mCustomViewEnabled; private View mCustomView; private LinearLayout mButtonBar; private int mButtonBarOrientation = LinearLayout.HORIZONTAL; private boolean mPositiveButtonEnabled; private String mPositiveButtonText; private QKTextView mPositiveButtonView; private boolean mNeutralButtonEnabled; private String mNeutralButtonText; private QKTextView mNeutralButtonView; private boolean mNegativeButtonEnabled; private String mNegativeButtonText; private QKTextView mNegativeButtonView; public interface DialogFragmentListener { // Called when the DialogFragment button is pressed, the DialogFragment is dismissed, etc. public void onDialogFragmentResult(int resultCode, DialogFragment fragment); // Called when a list item within the dialog is pressed. public void onDialogFragmentListResult(int resultCode, DialogFragment fragment, int index); } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Restore the target fragment; this is our listener. mListener = (DialogFragmentListener)getTargetFragment(); } /** * Sets the listener of the the DialogFragment. * * The generic stuff is just to ensure that the listener is both a Fragment and a * DialogFragmentListener. */ public <T extends Fragment & DialogFragmentListener> MMSDialogFragment setListener(T l) { mListener = l; setTargetFragment(l, 0); return this; } /** * Notify the listener of a result. */ protected void onResult(int resultCode) { if (mListener != null) { mListener.onDialogFragmentResult(resultCode, this); } } /** * Notify the listener of a result relating to a list item. */ protected void onListResult(int resultCode, int index) { if (mListener != null) { mListener.onDialogFragmentListResult(resultCode, this, index); } } // Make setTargetFragment final so that nobody subclasses BaseDialogFragment and breaks it. @Override final public void setTargetFragment(Fragment fragment, int requestCode) { super.setTargetFragment(fragment, requestCode); } /** * Builds the dialog using all the View parameters. */ @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = new Dialog(mContext); Window window = dialog.getWindow(); window.requestFeature(Window.FEATURE_NO_TITLE); window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.dialog_material, null); if (mTitleEnabled || mMessageEnabled) { mContentPanel = (LinearLayout) view.findViewById(R.id.contentPanel); mContentPanel.setVisibility(View.VISIBLE); } if (mTitleEnabled) { mTitleView = (QKTextView) view.findViewById(R.id.alertTitle); mTitleView.setVisibility(View.VISIBLE); mTitleView.setText(mTitleText); } if (mMessageEnabled) { mMessageView = (QKTextView) view.findViewById(R.id.message); mMessageView.setVisibility(View.VISIBLE); mMessageView.setText(mMessageText); } if (mCustomViewEnabled) { mCustomPanel = (LinearLayout) view.findViewById(R.id.customPanel); mCustomPanel.setVisibility(View.VISIBLE); if (mCustomView instanceof ListView) { mCustomPanel.addView(mCustomView); } else { ScrollView scrollView = new ScrollView(mContext); scrollView.addView(mCustomView); mCustomPanel.addView(scrollView); } } if (mPositiveButtonEnabled || mNeutralButtonEnabled || mNegativeButtonEnabled) { mButtonBar = (LinearLayout) view.findViewById(R.id.buttonPanel); mButtonBar.setVisibility(View.VISIBLE); mButtonBar.setOrientation(mButtonBarOrientation); } if (mPositiveButtonEnabled) { mPositiveButtonView = (QKTextView) view.findViewById(R.id.buttonPositive); mPositiveButtonView.setVisibility(View.VISIBLE); mPositiveButtonView.setText(mPositiveButtonText); mPositiveButtonView.setTextColor(ThemeManager.getColor()); mPositiveButtonView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onResult(POSITIVE_BUTTON_RESULT); } }); } if (mNeutralButtonEnabled) { mNeutralButtonView = (QKTextView) view.findViewById(R.id.buttonNeutral); mNeutralButtonView.setVisibility(View.VISIBLE); mNeutralButtonView.setText(mNeutralButtonText); mNeutralButtonView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onResult(NEUTRAL_BUTTON_RESULT); } }); } if (mNegativeButtonEnabled) { mNegativeButtonView = (QKTextView) view.findViewById(R.id.buttonNegative); mNegativeButtonView.setVisibility(View.VISIBLE); mNegativeButtonView.setText(mNegativeButtonText); mNegativeButtonView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onResult(NEGATIVE_BUTTON_RESULT); } }); } dialog.setContentView(view); return dialog; } @Override public void onStart() { super.onStart(); Window window = getDialog().getWindow(); WindowManager.LayoutParams windowParams = window.getAttributes(); windowParams.dimAmount = 0.33f; windowParams.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND; window.setAttributes(windowParams); DisplayMetrics metrics = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); int width = (int) (metrics.widthPixels * 0.9); window.setLayout(width, ViewGroup.LayoutParams.WRAP_CONTENT); } /** * Called when the dialog is cancelled by the user (i.e. the user clicks outside of it) */ @Override public void onCancel(DialogInterface dialog) { onResult(DISMISS_RESULT); } public MMSDialogFragment setContext(Context context) { mContext = context; mResources = context.getResources(); return this; } public MMSDialogFragment setTitle(int resource) { return setTitle(mResources.getString(resource)); } public MMSDialogFragment setTitle(String title) { mTitleEnabled = true; mTitleText = title; return this; } public MMSDialogFragment setMessage(int resource) { return setMessage(mResources.getString(resource)); } public MMSDialogFragment setMessage(String message) { mMessageEnabled = true; mMessageText = message; return this; } public MMSDialogFragment setCancelOnTouchOutside(boolean cancelable) { setCancelable(cancelable); return this; } // TODO fix stack from bottom issue public MMSDialogFragment setButtonBarOrientation(int orientation) { mButtonBarOrientation = orientation; return this; } public MMSDialogFragment setCustomView(View view) { mCustomViewEnabled = true; mCustomView = view; return this; } public MMSDialogFragment setItems(int resource, final int resultCode) { return setItems(mResources.getStringArray(resource)); } public MMSDialogFragment setItems(String[] items) { ArrayAdapter adapter = new ArrayAdapter<>(mContext, R.layout.list_item_simple, items); ListView listView = new ListView(mContext); listView.setAdapter(adapter); listView.setDivider(null); listView.setPadding(0, Units.dpToPx(mContext, 8), 0, Units.dpToPx(mContext, 8)); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { onListResult(LIST_ITEM_CLICK_RESULT, position); dismiss(); } }); return setCustomView(listView); } public MMSDialogFragment setDoubleLineItems(int titles, int bodies) { return setDoubleLineItems( mResources.getStringArray(titles), mResources.getStringArray(bodies) ); } public MMSDialogFragment setDoubleLineItems(String[] titles, String[] bodies) { int size = Math.min(titles.length, bodies.length); DoubleLineListItem[] doubleLineListItems = new DoubleLineListItem[size]; for (int i = 0; i < size; i++) { doubleLineListItems[i] = new DoubleLineListItem(); doubleLineListItems[i].title = titles[i]; doubleLineListItems[i].body = bodies[i]; } ArrayAdapter adapter = new DoubleLineArrayAdapter(mContext, doubleLineListItems); ListView listView = new ListView(mContext); listView.setAdapter(adapter); listView.setDivider(null); listView.setPadding(0, Units.dpToPx(mContext, 8), 0, Units.dpToPx(mContext, 8)); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { onListResult(LIST_ITEM_CLICK_RESULT, position); dismiss(); } }); return setCustomView(listView); } public MMSDialogFragment setTripleLineItems(int titles, int subtitles, int bodies) { return setTripleLineItems( mResources.getStringArray(titles), mResources.getStringArray(subtitles), mResources.getStringArray(bodies) ); } public MMSDialogFragment setTripleLineItems(String[] titles, String[] subtitles, String[] bodies) { int size = Math.min(titles.length, Math.min(subtitles.length, bodies.length)); TripleLineListItem[] tripleLineListItems = new TripleLineListItem[size]; for (int i = 0; i < size; i++) { tripleLineListItems[i] = new TripleLineListItem(); tripleLineListItems[i].title = titles[i]; tripleLineListItems[i].subtitle = subtitles[i]; tripleLineListItems[i].body = bodies[i]; } ArrayAdapter adapter = new TripleLineArrayAdapter(mContext, tripleLineListItems); ListView listView = new ListView(mContext); listView.setAdapter(adapter); listView.setDivider(null); listView.setPadding(0, Units.dpToPx(mContext, 8), 0, Units.dpToPx(mContext, 8)); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { onListResult(LIST_ITEM_CLICK_RESULT, position); dismiss(); } }); return setCustomView(listView); } public MMSDialogFragment setPositiveButton(int resource) { return setPositiveButton(mResources.getString(resource)); } public MMSDialogFragment setPositiveButton(String text) { mPositiveButtonEnabled = true; mPositiveButtonText = text; return this; } public MMSDialogFragment setNeutralButton(int resource) { return setNeutralButton(mResources.getString(resource)); } public MMSDialogFragment setNeutralButton(String text) { mNeutralButtonEnabled = true; mNeutralButtonText = text; return this; } public MMSDialogFragment setNegativeButton(int resource) { return setNegativeButton(mResources.getString(resource)); } public MMSDialogFragment setNegativeButton(String text) { mNegativeButtonEnabled = true; mNegativeButtonText = text; return this; } @Override public void onPause() { super.onPause(); dismiss(); } private class DoubleLineListItem { String title; String body; } private class DoubleLineArrayAdapter extends ArrayAdapter<DoubleLineListItem> { public DoubleLineArrayAdapter(Context context, DoubleLineListItem[] items) { super(context, R.layout.list_item_dual, items); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.list_item_dual, parent, false); } ((QKTextView) convertView.findViewById(R.id.list_item_title)) .setText(getItem(position).title); ((QKTextView) convertView.findViewById(R.id.list_item_body)) .setText(getItem(position).body); return convertView; } } private class TripleLineListItem { String title; String subtitle; String body; } private class TripleLineArrayAdapter extends ArrayAdapter<TripleLineListItem> { public TripleLineArrayAdapter(Context context, TripleLineListItem[] items) { super(context, R.layout.list_item_triple, items); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.list_item_triple, parent, false); } QKTextView title = (QKTextView) convertView.findViewById(R.id.list_item_title); title.setTextColor(ThemeManager.getColor()); title.setText(getItem(position).title); QKTextView subtitle = (QKTextView) convertView.findViewById(R.id.list_item_subtitle); subtitle.setTextColor(ThemeManager.getTextOnBackgroundPrimary()); subtitle.setText(getItem(position).subtitle); ((QKTextView) convertView.findViewById(R.id.list_item_body)) .setText(getItem(position).body); return convertView; } } }