package com.moez.QKSMS.ui.dialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.annotation.StringRes;
import android.support.v7.widget.RecyclerView;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
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.LiveViewManager;
import com.moez.QKSMS.common.utils.Units;
import com.moez.QKSMS.enums.QKPreference;
import com.moez.QKSMS.ui.ThemeManager;
import com.moez.QKSMS.ui.base.QKActivity;
import com.moez.QKSMS.ui.view.QKTextView;
import java.util.ArrayList;
public class QKDialog extends DialogFragment {
private final String TAG = "QKDialog";
protected QKActivity mContext;
protected Resources mResources;
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 OnClickListener mPositiveButtonClickListener;
private QKTextView mPositiveButtonView;
private boolean mNeutralButtonEnabled;
private String mNeutralButtonText;
private OnClickListener mNeutralButtonClickListener;
private QKTextView mNeutralButtonView;
private boolean mNegativeButtonEnabled;
private String mNegativeButtonText;
private OnClickListener mNegativeButtonClickListener;
private QKTextView mNegativeButtonView;
private ArrayList<String> mMenuItems = new ArrayList<>();
private ArrayList<Long> mMenuItemIds = new ArrayList<>();
public QKDialog() {
}
@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);
Log.d(TAG, "title enabled");
}
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 || mCustomView instanceof RecyclerView) {
mCustomPanel.addView(mCustomView);
} else {
ScrollView scrollView = new ScrollView(mContext);
scrollView.addView(mCustomView);
mCustomPanel.addView(scrollView);
}
}
if (mPositiveButtonEnabled || 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.setOnClickListener(mPositiveButtonClickListener);
LiveViewManager.registerView(QKPreference.THEME, mPositiveButtonView, key -> {
mPositiveButtonView.setTextColor(ThemeManager.getColor());
});
}
if (mNeutralButtonEnabled) {
mNeutralButtonView = (QKTextView) view.findViewById(R.id.buttonNeutral);
mNeutralButtonView.setVisibility(View.VISIBLE);
mNeutralButtonView.setText(mNeutralButtonText);
mNeutralButtonView.setOnClickListener(mNeutralButtonClickListener);
}
if (mNegativeButtonEnabled) {
mNegativeButtonView = (QKTextView) view.findViewById(R.id.buttonNegative);
mNegativeButtonView.setVisibility(View.VISIBLE);
mNegativeButtonView.setText(mNegativeButtonText);
mNegativeButtonView.setOnClickListener(mNegativeButtonClickListener);
}
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);
}
public QKDialog setContext(QKActivity context) {
mContext = context;
mResources = context.getResources();
return this;
}
public QKDialog setTitle(int resource) {
return setTitle(mResources.getString(resource));
}
public QKDialog setTitle(String title) {
mTitleEnabled = true;
mTitleText = title;
return this;
}
public QKDialog setMessage(int resource) {
return setMessage(mResources.getString(resource));
}
public QKDialog setMessage(String message) {
mMessageEnabled = true;
mMessageText = message;
return this;
}
public QKDialog setCancelOnTouchOutside(boolean cancelable) {
setCancelable(cancelable);
return this;
}
// TODO fix stack from bottom issue
public QKDialog setButtonBarOrientation(int orientation) {
mButtonBarOrientation = orientation;
return this;
}
public QKDialog setCustomView(View view) {
mCustomViewEnabled = true;
mCustomView = view;
return this;
}
public QKDialog addMenuItem(@StringRes int titleId, long id) {
return addMenuItem(mContext.getString(titleId), id);
}
/**
* Adds a menu style item, allowing for dynamic ids for different items. This is useful when the item order
* is set dynamically, like in the MessageListItem
*
* If you use this method, always make sure to use #buildMenu(OnItemClickListener) to compile the items and add the
* click listener
*/
public QKDialog addMenuItem(String title, long id) {
mMenuItems.add(title);
mMenuItemIds.add(id);
return this;
}
public QKDialog buildMenu(final OnItemClickListener onItemClickListener) {
ArrayAdapter adapter = new ArrayAdapter<>(mContext, R.layout.list_item_simple, mMenuItems);
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 OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// Ignore the given ID and use the one that we set in #addMenuItem()
onItemClickListener.onItemClick(parent, view, position, mMenuItemIds.get(position));
dismiss();
}
});
return setCustomView(listView);
}
public QKDialog setItems(int resource, final OnItemClickListener onClickListener) {
return setItems(mResources.getStringArray(resource), onClickListener);
}
public QKDialog setItems(String[] items, final OnItemClickListener onClickListener) {
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 OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (onClickListener != null) {
onClickListener.onItemClick(parent, view, position, id);
dismiss();
}
}
});
return setCustomView(listView);
}
public QKDialog setDoubleLineItems(int titles, int bodies, final OnItemClickListener onClickListener) {
return setDoubleLineItems(mResources.getStringArray(titles), mResources.getStringArray(bodies), onClickListener);
}
public QKDialog setDoubleLineItems(String[] titles, String[] bodies, final OnItemClickListener onClickListener) {
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 OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (onClickListener != null) {
onClickListener.onItemClick(parent, view, position, id);
dismiss();
}
}
});
return setCustomView(listView);
}
public QKDialog setTripleLineItems(int titles, int subtitles, int bodies, final OnItemClickListener onClickListener) {
return setTripleLineItems(mResources.getStringArray(titles), mResources.getStringArray(subtitles), mResources.getStringArray(bodies), onClickListener);
}
public QKDialog setTripleLineItems(String[] titles, String[] subtitles, String[] bodies, final OnItemClickListener onClickListener) {
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 OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (onClickListener != null) {
onClickListener.onItemClick(parent, view, position, id);
dismiss();
}
}
});
return setCustomView(listView);
}
public QKDialog setPositiveButton(int resource, OnClickListener onClickListener) {
return setPositiveButton(mResources.getString(resource), onClickListener);
}
public QKDialog setPositiveButton(String text, final OnClickListener onClickListener) {
mPositiveButtonEnabled = true;
mPositiveButtonText = text;
mPositiveButtonClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (onClickListener != null) {
onClickListener.onClick(v);
}
dismiss();
}
};
return this;
}
public QKDialog setNeutralButton(int resource, OnClickListener onClickListener) {
return setNeutralButton(mResources.getString(resource), onClickListener);
}
public QKDialog setNeutralButton(String text, final OnClickListener onClickListener) {
mNeutralButtonEnabled = true;
mNeutralButtonText = text;
mNeutralButtonClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (onClickListener != null) {
onClickListener.onClick(v);
}
dismiss();
}
};
return this;
}
public QKDialog setNegativeButton(int resource, OnClickListener onClickListener) {
return setNegativeButton(mResources.getString(resource), onClickListener);
}
public QKDialog setNegativeButton(String text, final OnClickListener onClickListener) {
mNegativeButtonEnabled = true;
mNegativeButtonText = text;
mNegativeButtonClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (onClickListener != null) {
onClickListener.onClick(v);
}
dismiss();
}
};
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;
}
}
public void show() {
try {
super.show(mContext.getFragmentManager(), null);
} catch (IllegalStateException ignored) {
// Sometimes the context is destroyed, but the check for that is API 17+
}
}
@Deprecated
@Override
public void show(FragmentManager manager, String tag) {
super.show(manager, tag);
}
}