package com.fastaccess.ui.base; import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.support.annotation.LayoutRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.BottomSheetBehavior; import android.support.design.widget.BottomSheetDialogFragment; import android.support.v7.view.ContextThemeWrapper; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import com.fastaccess.R; import com.fastaccess.helper.ViewHelper; import butterknife.ButterKnife; import butterknife.Unbinder; import icepick.Icepick; /** * Created by Kosh on 16 Sep 2016, 2:11 PM */ @SuppressWarnings("RestrictedApi") public abstract class BaseBottomSheetDialog extends BottomSheetDialogFragment { protected BottomSheetBehavior<View> bottomSheetBehavior; private final BottomSheetBehavior.BottomSheetCallback bottomSheetCallback = new BottomSheetBehavior.BottomSheetCallback() { @Override public void onStateChanged(@NonNull View bottomSheet, int newState) { if (newState == BottomSheetBehavior.STATE_HIDDEN) { isAlreadyHidden = true; onHidden(); } } @Override public void onSlide(@NonNull View bottomSheet, float slideOffset) { if (slideOffset == -1.0) { isAlreadyHidden = true; onDismissedByScrolling(); } } }; protected boolean isAlreadyHidden; @Nullable private Unbinder unbinder; @LayoutRes protected abstract int layoutRes(); @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Icepick.saveInstanceState(this, outState); } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null && !savedInstanceState.isEmpty()) { Icepick.restoreInstanceState(this, savedInstanceState); } } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { final Context contextThemeWrapper = new ContextThemeWrapper(getContext(), getContext().getTheme()); LayoutInflater themeAwareInflater = inflater.cloneInContext(contextThemeWrapper); View view = themeAwareInflater.inflate(layoutRes(), container, false); unbinder = ButterKnife.bind(this, view); view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { view.getViewTreeObserver().removeOnGlobalLayoutListener(this); View parent = getDialog().findViewById(R.id.design_bottom_sheet); if (parent != null) { bottomSheetBehavior = BottomSheetBehavior.from(parent); if (bottomSheetBehavior != null) { bottomSheetBehavior.setBottomSheetCallback(bottomSheetCallback); bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); } } } }); return view; } @Override public void setupDialog(Dialog dialog, int style) { super.setupDialog(dialog, style); } @Override public void onDestroyView() { super.onDestroyView(); if (unbinder != null) unbinder.unbind(); } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Dialog dialog = super.onCreateDialog(savedInstanceState); dialog.setOnShowListener(dialogInterface -> { if (ViewHelper.isTablet(getActivity())) { if (dialog.getWindow() != null) { dialog.getWindow().setLayout( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT); } } onDialogIsShowing(); }); dialog.setOnKeyListener((dialog1, keyCode, event) -> { if (keyCode == KeyEvent.KEYCODE_BACK) { isAlreadyHidden = true; onDismissedByScrolling(); } return false; }); return dialog; } @Override public void onDetach() { if (!isAlreadyHidden) { onDismissedByScrolling(); } super.onDetach(); } protected void onHidden() { try { dismiss(); } catch (IllegalStateException ignored) {} //FML FIXME } protected void onDismissedByScrolling() {} protected void onDialogIsShowing() {} }