package org.softeg.slartus.forpdaplus.controls.quickpost; import android.app.Activity; import android.content.res.Configuration; import android.graphics.Rect; import android.os.Parcelable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.PopupWindow; import org.softeg.slartus.forpdaplus.App; import org.softeg.slartus.forpdaplus.R; import org.softeg.slartus.forpdaplus.controls.quickpost.items.BBCodesAndSmilesItem; import org.softeg.slartus.forpdaplus.controls.quickpost.items.BaseQuickView; import org.softeg.slartus.forpdaplus.controls.quickpost.items.BbCodesItem; import org.softeg.slartus.forpdaplus.controls.quickpost.items.EmoticsItem; import org.softeg.slartus.forpdaplus.controls.quickpost.items.SettingsItem; import java.util.ArrayList; import java.util.List; public class PopupPanelView { private int mViewsFlags = VIEW_FLAG_ALL; public static final int VIEW_FLAG_SETTINGS = 2; public static final int VIEW_FLAG_EMOTICS = 4; public static final int VIEW_FLAG_BBCODES = 8; public static final int VIEW_FLAG_ALL = VIEW_FLAG_SETTINGS | VIEW_FLAG_EMOTICS | VIEW_FLAG_BBCODES; private int keyboardHeight; private EditText mPostEditText; private ImageButton advanced_button; private View emoticonsCover; private ViewPager mViewPager; private QuickPostPagerAdapter mQuickPostPagerAdapter; private View popUpView; private PopupWindow popupWindow; private boolean isKeyBoardVisible; private View parentLayout; private String mForumId, mTopicId, mAuthKey; public PopupPanelView(int views) { mViewsFlags = views; } public void createView(LayoutInflater inflater, ImageButton advanced_button, EditText editText) { popUpView = inflater.inflate(R.layout.quick_post_tabs_fragment, null); assert popUpView != null; mViewPager = (ViewPager) popUpView.findViewById(R.id.pager1); this.advanced_button = advanced_button; mPostEditText = editText; mPostEditText.setOnFocusChangeListener((view, b) -> { if (b) hidePopupWindow(); }); mPostEditText.setOnClickListener(view -> hidePopupWindow()); advanced_button.setOnClickListener(view -> toggleAdvPanelVisibility()); } public void activityCreated(Activity activity){ activityCreated(activity, null); } public void activityCreated(Activity activity, View view) { parentLayout = activity.getWindow().getDecorView().findViewById(android.R.id.content); if(view==null) this.emoticonsCover = parentLayout.findViewById(R.id.footer_for_emoticons); else this.emoticonsCover = view.findViewById(R.id.footer_for_emoticons); final float popUpheight = App.getContext().getResources().getDimension( R.dimen.keyboard_height); changeKeyboardHeight((int) popUpheight); enablePopUpView(); checkKeyboardHeight(parentLayout); ArrayList<QuickPostItem> items = new ArrayList<>(); int select = 0; if ((mViewsFlags & VIEW_FLAG_SETTINGS) != 0) { items.add(new SettingsItem()); select = 1; } if (activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { items.add(new BBCodesAndSmilesItem()); } else { if ((mViewsFlags & VIEW_FLAG_EMOTICS) != 0) { items.add(new EmoticsItem()); } if ((mViewsFlags & VIEW_FLAG_BBCODES) != 0) { items.add(new BbCodesItem()); } } mQuickPostPagerAdapter = new QuickPostPagerAdapter(activity, items); mViewPager.setAdapter(mQuickPostPagerAdapter); mViewPager.setCurrentItem(select); } public void setTopic(String forumId, String topicId, String authKey) { mForumId = forumId; mTopicId = topicId; mAuthKey = authKey; for (BaseQuickView view : mQuickPostPagerAdapter.getViews()) { if (view != null) view.setTopic(forumId, topicId, authKey); } } private void toggleAdvPanelVisibility() { if (!popupWindow.isShowing()) { showPopupWindow(); } else { hidePopupWindow(); } } private void showPopupWindow() { if (!popupWindow.isShowing()) { popupWindow.setHeight(keyboardHeight); if (isKeyBoardVisible) { emoticonsCover.setVisibility(LinearLayout.GONE); } else { emoticonsCover.setVisibility(LinearLayout.VISIBLE); } popupWindow.showAtLocation(parentLayout, Gravity.BOTTOM, 0, 0); } advanced_button.setImageResource(R.drawable.close_grey); } public void hidePopupWindow() { if (popupWindow != null && popupWindow.isShowing()) { popupWindow.dismiss(); } advanced_button.setImageResource(R.drawable.plus); } /** * change height of emoticons keyboard according to height of actual * keyboard * * @param height minimum height by which we can make sure actual keyboard is * open or not */ private LinearLayout.LayoutParams params; private void changeKeyboardHeight(int height) { if (height > 100) { keyboardHeight = height; params = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, keyboardHeight); emoticonsCover.setLayoutParams(params); } } /** * Checking keyboard height and keyboard visibility */ private int previousHeightDiffrence = 0; private int heightDifference; private int screenHeight; private int k = -1; private Rect r; @SuppressWarnings("ConstantConditions") private void checkKeyboardHeight(final View parentLayout) { parentLayout.getViewTreeObserver().addOnGlobalLayoutListener( () -> { r = new Rect(); parentLayout.getWindowVisibleDisplayFrame(r); screenHeight = parentLayout.getRootView().getHeight(); if (k == -1) k = screenHeight - r.bottom; heightDifference = screenHeight - r.bottom - k; if (previousHeightDiffrence - heightDifference > 50) { hidePopupWindow(); } isKeyBoardVisible = heightDifference > 100; if (previousHeightDiffrence != heightDifference) changeKeyboardHeight(heightDifference); previousHeightDiffrence = heightDifference; } ); } /** * Defining all components of emoticons keyboard */ private void enablePopUpView() { // Creating a pop window for emoticons keyboard popupWindow = new PopupWindow(popUpView, ViewGroup.LayoutParams.MATCH_PARENT, keyboardHeight, false); popupWindow.setOnDismissListener(() -> emoticonsCover.setVisibility(LinearLayout.GONE)); } public void destroy() { try { if (popupWindow != null) popupWindow.dismiss(); popupWindow = null; for(QuickPostItem item:mQuickPostPagerAdapter.mItems) if(item.getBaseQuickView()!=null) item.getBaseQuickView().onDestroy(); } catch (Throwable ex) { Log.e("PopupPanelView", ex.toString()); } } public void pause(){ try { hidePopupWindow(); for(QuickPostItem item:mQuickPostPagerAdapter.mItems) if(item.getBaseQuickView()!=null) item.getBaseQuickView().onPause(); } catch (Throwable ex) { Log.e("PopupPanelView", ex.toString()); } } public void resume(){ try { for(QuickPostItem item:mQuickPostPagerAdapter.mItems) if(item.getBaseQuickView()!=null) item.getBaseQuickView().onResume(); } catch (Throwable ex) { Log.e("PopupPanelView", ex.toString()); } } public class QuickPostPagerAdapter extends PagerAdapter { private List<QuickPostItem> mItems; private BaseQuickView[] mViews; private Activity mActivity; public QuickPostPagerAdapter(Activity activity, List<QuickPostItem> items) { mActivity = activity; mItems = items; mViews = new BaseQuickView[mItems.size()]; } @Override public Object instantiateItem(ViewGroup container, int position) { if (mViews[position] == null) { mViews[position] = mItems.get(position).createView(mActivity, mPostEditText); mViews[position].setTopic(mForumId, mTopicId, mAuthKey); } container.addView(mViews[position], 0); return mViews[position]; } @Override public void destroyItem(ViewGroup container, int position, Object view) { container.removeView((View) view); } @Override public int getCount() { return mItems.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view.equals(object); } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { } @Override public Parcelable saveState() { return null; } @Override public CharSequence getPageTitle(int position) { return mActivity.getString(mItems.get(position).getTitle()); } public BaseQuickView[] getViews() { return mViews; } } }