package carbon.dialog; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.support.annotation.LayoutRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.support.annotation.StyleRes; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import carbon.Carbon; import carbon.R; import carbon.widget.Button; import carbon.widget.Divider; import carbon.widget.LinearLayout; import carbon.widget.TextView; public abstract class DialogBase extends android.app.Dialog { private LinearLayout container; private TextView titleTextView; private ViewGroup buttonContainer; private View dialogLayout; protected Divider topDivider; protected Divider bottomDivider; private View contentView; public DialogBase(@NonNull Context context) { super(context, Carbon.getThemeResId(context, android.R.attr.dialogTheme)); initLayout(); } public DialogBase(@NonNull Context context, @StyleRes int themeResId) { super(context, themeResId); initLayout(); } @Override public void setContentView(@LayoutRes int layoutResID) { setContentView(getLayoutInflater().inflate(layoutResID, null), null); } @Override public void setContentView(@NonNull View view) { setContentView(view, null); } @Override public void setContentView(@NonNull View view, ViewGroup.LayoutParams params) { contentView = view; contentView.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { dividerCallback(contentView.getHeight()); }); container.addView(view); } protected void initLayout() { requestWindowFeature(Window.FEATURE_NO_TITLE); Window window = getWindow(); if (window != null) { window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); window.setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); } dialogLayout = getLayoutInflater().inflate(R.layout.carbon_dialog, null); container = (LinearLayout) dialogLayout.findViewById(R.id.carbon_windowContent); super.setContentView(dialogLayout); } protected void dividerCallback(int contentHeight) { if (container.getChildCount() == 0 || container.getChildAt(0).getHeight() <= contentHeight) { if (topDivider != null) topDivider.setVisibility(View.GONE); if (bottomDivider != null) bottomDivider.setVisibility(View.GONE); } else { if (topDivider != null) topDivider.setVisibility(View.VISIBLE); if (bottomDivider != null) bottomDivider.setVisibility(View.VISIBLE); } } @Override public void setTitle(@Nullable CharSequence title) { if (titleTextView == null && title != null) { container.addView(getLayoutInflater().inflate(R.layout.carbon_dialogheader, null), 0); titleTextView = (TextView) dialogLayout.findViewById(R.id.carbon_windowTitle); titleTextView.setText(title); topDivider = (Divider) dialogLayout.findViewById(R.id.carbon_topDivider); } else if (titleTextView != null && title == null) { container.removeViewAt(0); titleTextView = null; topDivider = null; } } @Override public void setTitle(@StringRes int titleId) { setTitle(getContext().getResources().getString(titleId)); } public void setNegativeButton(String text, View.OnClickListener listener) { setButton(text, listener, R.id.carbon_buttonNegative); } public void setPositiveButton(String text, View.OnClickListener listener) { setButton(text, listener, R.id.carbon_buttonPositive); } private void setButton(String text, View.OnClickListener listener, int buttonId) { if (buttonContainer == null) { container.addView(getLayoutInflater().inflate(R.layout.carbon_dialogfooter, null)); buttonContainer = (ViewGroup) dialogLayout.findViewById(R.id.carbon_buttonContainer); bottomDivider = (Divider) dialogLayout.findViewById(R.id.carbon_bottomDivider); } Button button = (Button) findViewById(buttonId); button.setText(text); button.setOnClickListener(v -> { if (listener != null) { listener.onClick(v); } dismiss(); }); button.setVisibility(View.VISIBLE); buttonContainer.setVisibility(View.VISIBLE); } @Override public void show() { container.requestLayout(); container.setVisibility(View.INVISIBLE); super.show(); container.animateVisibility(View.VISIBLE); } @Override public void dismiss() { container.animateVisibility(View.INVISIBLE).addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { DialogBase.super.dismiss(); } }); } }