DialogBase.java 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package com.afollestad.materialdialogs;
  2. import android.app.Dialog;
  3. import android.content.Context;
  4. import android.content.DialogInterface;
  5. import android.os.Message;
  6. import android.view.View;
  7. import java.lang.reflect.Field;
  8. /**
  9. * @author Aidan Follestad (afollestad)
  10. */
  11. class DialogBase extends Dialog implements DialogInterface.OnShowListener {
  12. private OnShowListener mShowListener;
  13. protected DialogBase(Context context, int theme) {
  14. super(context, theme);
  15. }
  16. @Override
  17. public final void setOnShowListener(OnShowListener listener) {
  18. mShowListener = listener;
  19. }
  20. protected final void setOnShowListenerInternal() {
  21. super.setOnShowListener(this);
  22. }
  23. protected final void setViewInternal(View view) {
  24. setContentView(view);
  25. }
  26. @Override
  27. public void onShow(DialogInterface dialog) {
  28. if (mShowListener != null)
  29. mShowListener.onShow(dialog);
  30. }
  31. @Override
  32. protected void onStop() {
  33. super.onStop();
  34. // Prevent framework leak
  35. try {
  36. Class superCls = getClass().getSuperclass().getSuperclass();
  37. Field cancelMsg = superCls.getDeclaredField("mCancelMessage");
  38. scrubMessageField(cancelMsg);
  39. Field dismissMsg = superCls.getDeclaredField("mDismissMessage");
  40. scrubMessageField(dismissMsg);
  41. Field showMsg = superCls.getDeclaredField("mShowMessage");
  42. scrubMessageField(showMsg);
  43. } catch (Exception e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. private void scrubMessageField(Field field) throws Exception {
  48. field.setAccessible(true);
  49. Object val = field.get(this);
  50. if (val != null) {
  51. Message msg = (Message) val;
  52. msg.recycle();
  53. field.set(this, null);
  54. }
  55. }
  56. }