diff --git a/res/layout/conversation_activity.xml b/res/layout/conversation_activity.xml index 481083293d..3e540c2109 100644 --- a/res/layout/conversation_activity.xml +++ b/res/layout/conversation_activity.xml @@ -1,20 +1,20 @@ - + + - - + + + diff --git a/res/layout/emoji_drawer.xml b/res/layout/emoji_drawer.xml index fa4849f634..09afc8ef67 100644 --- a/res/layout/emoji_drawer.xml +++ b/res/layout/emoji_drawer.xml @@ -1,11 +1,7 @@ - + - \ No newline at end of file + \ No newline at end of file diff --git a/src/org/thoughtcrime/securesms/ConversationActivity.java b/src/org/thoughtcrime/securesms/ConversationActivity.java index 32fdbb1d85..dd164ede53 100644 --- a/src/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationActivity.java @@ -49,6 +49,7 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnFocusChangeListener; import android.view.View.OnKeyListener; +import android.view.ViewStub; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.Button; @@ -68,13 +69,12 @@ import org.thoughtcrime.securesms.components.KeyboardAwareLinearLayout; import org.thoughtcrime.securesms.components.KeyboardAwareLinearLayout.OnKeyboardShownListener; import org.thoughtcrime.securesms.components.SendButton; import org.thoughtcrime.securesms.components.emoji.EmojiDrawer.EmojiEventListener; -import org.thoughtcrime.securesms.components.emoji.EmojiPopup; +import org.thoughtcrime.securesms.components.emoji.EmojiDrawer; import org.thoughtcrime.securesms.components.emoji.EmojiToggle; import org.thoughtcrime.securesms.contacts.ContactAccessor; import org.thoughtcrime.securesms.contacts.ContactAccessor.ContactData; import org.thoughtcrime.securesms.components.camera.HidingImageButton; import org.thoughtcrime.securesms.components.camera.QuickAttachmentDrawer.AttachmentDrawerListener; -import org.thoughtcrime.securesms.components.camera.QuickAttachmentDrawer.DrawerState; import org.thoughtcrime.securesms.components.camera.QuickAttachmentDrawer; import org.thoughtcrime.securesms.crypto.MasterCipher; import org.thoughtcrime.securesms.crypto.MasterSecret; @@ -178,7 +178,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity private AttachmentManager attachmentManager; private BroadcastReceiver securityUpdateReceiver; private BroadcastReceiver groupUpdateReceiver; - private Optional emojiPopup = Optional.absent(); + private Optional emojiDrawer = Optional.absent(); private EmojiToggle emojiToggle; protected HidingImageButton quickAttachmentToggle; private QuickAttachmentDrawer quickAttachmentDrawer; @@ -267,7 +267,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); quickAttachmentDrawer.onConfigurationChanged(); - hideEmojiPopup(false); + hideEmojiDrawer(false); } @Override @@ -276,7 +276,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity if (recipients != null) recipients.removeListener(this); if (securityUpdateReceiver != null) unregisterReceiver(securityUpdateReceiver); if (groupUpdateReceiver != null) unregisterReceiver(groupUpdateReceiver); - if (isEmojiDrawerOpen()) hideEmojiPopup(false); + if (isEmojiDrawerOpen()) hideEmojiDrawer(false); super.onDestroy(); } @@ -384,8 +384,10 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity @Override public void onBackPressed() { + Log.w(TAG, "onBackPressed()"); if (isEmojiDrawerOpen()) { - hideEmojiPopup(false); + Log.w(TAG, "hiding emoji popup"); + hideEmojiDrawer(false); } else if (quickAttachmentDrawer.isOpen()) { quickAttachmentDrawer.close(); } else { @@ -395,7 +397,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity @Override public void onKeyboardShown() { - hideEmojiPopup(true); + hideEmojiDrawer(true); } //////// Event Handlers @@ -866,10 +868,10 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity getSupportActionBar().setDisplayShowTitleEnabled(false); } - private EmojiPopup getEmojiPopup() { - if (!emojiPopup.isPresent()) { - EmojiPopup emojiPopup = new EmojiPopup(container); - emojiPopup.setEmojiEventListener(new EmojiEventListener() { + private EmojiDrawer getEmojiDrawer() { + if (!emojiDrawer.isPresent()) { + EmojiDrawer emojiDrawer = (EmojiDrawer)((ViewStub)findViewById(R.id.emoji_drawer_stub)).inflate(); + emojiDrawer.setEmojiEventListener(new EmojiEventListener() { @Override public void onKeyEvent(KeyEvent keyEvent) { composeText.dispatchKeyEvent(keyEvent); } @@ -879,28 +881,33 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity composeText.insertEmoji(emoji); } }); - this.emojiPopup = Optional.of(emojiPopup); + this.emojiDrawer = Optional.of(emojiDrawer); } - return emojiPopup.get(); + return emojiDrawer.get(); } - private void showEmojiPopup() { - getEmojiPopup().show(); + private void showEmojiDrawer() { + getEmojiDrawer().show(container); emojiToggle.setToIme(); } - protected void hideEmojiPopup(boolean expectingKeyboard) { + protected void hideEmojiDrawer(boolean expectingKeyboard) { if (isEmojiDrawerOpen()) { - getEmojiPopup().dismiss(); if (!expectingKeyboard || container.isLandscape()) { - container.unpadForCustomKeyboard(); + getEmojiDrawer().dismiss(); + } else { + container.postOnKeyboardOpen(new Runnable() { + @Override public void run() { + getEmojiDrawer().dismiss(); + } + }); } } emojiToggle.setToEmoji(); } private boolean isEmojiDrawerOpen() { - return emojiPopup.isPresent() && emojiPopup.get().isShowing(); + return emojiDrawer.isPresent() && emojiDrawer.get().isShowing(); } private void initializeResources() { @@ -1358,12 +1365,12 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity public void onClick(View v) { Log.w(TAG, "EmojiToggleListener onClick()"); if (isEmojiDrawerOpen()) { - hideEmojiPopup(true); + hideEmojiDrawer(true); openKeyboardForComposition(); } else { container.postOnKeyboardClose(new Runnable() { @Override public void run() { - showEmojiPopup(); + showEmojiDrawer(); } }); quickAttachmentDrawer.close(); @@ -1378,7 +1385,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity InputMethodManager input = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); input.hideSoftInputFromWindow(composeText.getWindowToken(), 0); composeText.clearFocus(); - hideEmojiPopup(false); + hideEmojiDrawer(false); quickAttachmentDrawer.open(); } } @@ -1426,7 +1433,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity @Override public void onClick(View v) { - hideEmojiPopup(true); + hideEmojiDrawer(true); } @Override @@ -1454,7 +1461,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus && isEmojiDrawerOpen()) { - hideEmojiPopup(true); + hideEmojiDrawer(true); } else if (hasFocus && quickAttachmentDrawer.isOpen()) { quickAttachmentDrawer.close(); } diff --git a/src/org/thoughtcrime/securesms/ConversationPopupActivity.java b/src/org/thoughtcrime/securesms/ConversationPopupActivity.java index d2ce2dd041..b165601008 100644 --- a/src/org/thoughtcrime/securesms/ConversationPopupActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationPopupActivity.java @@ -114,8 +114,8 @@ public class ConversationPopupActivity extends ConversationActivity { } @Override - protected void hideEmojiPopup(boolean expectingKeyboard) { - super.hideEmojiPopup(false); + protected void hideEmojiDrawer(boolean expectingKeyboard) { + super.hideEmojiDrawer(false); } @Override diff --git a/src/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java b/src/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java index 264a84c32e..c2acb489ea 100644 --- a/src/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java +++ b/src/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java @@ -97,14 +97,6 @@ public class KeyboardAwareLinearLayout extends LinearLayoutCompat { oldRect.set(newRect); } - public void padForCustomKeyboard(final int height) { - setPadding(0, 0, 0, height); - } - - public void unpadForCustomKeyboard() { - setPadding(0, 0, 0, 0); - } - private int getViewInset() { if (Build.VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) { return 0; @@ -135,7 +127,6 @@ public class KeyboardAwareLinearLayout extends LinearLayoutCompat { setKeyboardPortraitHeight(keyboardHeight); } notifyShownListeners(); - unpadForCustomKeyboard(); } protected void onKeyboardClose() { @@ -188,6 +179,19 @@ public class KeyboardAwareLinearLayout extends LinearLayoutCompat { } } + public void postOnKeyboardOpen(final Runnable runnable) { + if (!keyboardOpen) { + addOnKeyboardShownListener(new OnKeyboardShownListener() { + @Override public void onKeyboardShown() { + removeOnKeyboardShownListener(this); + runnable.run(); + } + }); + } else { + runnable.run(); + } + } + public void addOnKeyboardHiddenListener(OnKeyboardHiddenListener listener) { hiddenListeners.add(listener); } @@ -205,13 +209,15 @@ public class KeyboardAwareLinearLayout extends LinearLayoutCompat { } private void notifyHiddenListeners() { - for (OnKeyboardHiddenListener listener : hiddenListeners) { + final Set listeners = new HashSet<>(hiddenListeners); + for (OnKeyboardHiddenListener listener : listeners) { listener.onKeyboardHidden(); } } private void notifyShownListeners() { - for (OnKeyboardShownListener listener : shownListeners) { + final Set listeners = new HashSet<>(shownListeners); + for (OnKeyboardShownListener listener : listeners) { listener.onKeyboardShown(); } } diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiDrawer.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiDrawer.java index 1e6eb8f16b..43560755d8 100644 --- a/src/org/thoughtcrime/securesms/components/emoji/EmojiDrawer.java +++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiDrawer.java @@ -5,7 +5,6 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; -import android.support.v7.widget.LinearLayoutCompat; import android.util.AttributeSet; import android.util.Log; import android.view.KeyEvent; @@ -19,6 +18,7 @@ import android.widget.LinearLayout; import com.astuetz.PagerSlidingTabStrip; import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.components.KeyboardAwareLinearLayout; import org.thoughtcrime.securesms.components.RepeatableImageKey; import org.thoughtcrime.securesms.components.RepeatableImageKey.KeyEventListener; import org.thoughtcrime.securesms.components.emoji.EmojiPageView.EmojiSelectionListener; @@ -27,10 +27,9 @@ import org.thoughtcrime.securesms.util.ResUtil; import java.util.LinkedList; import java.util.List; -public class EmojiDrawer extends LinearLayoutCompat { +public class EmojiDrawer extends LinearLayout { private static final KeyEvent DELETE_KEY_EVENT = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL); - private LinearLayout container; private ViewPager pager; private List models; private PagerSlidingTabStrip strip; @@ -42,11 +41,8 @@ public class EmojiDrawer extends LinearLayoutCompat { } public EmojiDrawer(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public EmojiDrawer(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); + super(context, attrs); + setOrientation(VERTICAL); final View v = LayoutInflater.from(getContext()).inflate(R.layout.emoji_drawer, this, true); initializeResources(v); initializePageModels(); @@ -59,7 +55,6 @@ public class EmojiDrawer extends LinearLayoutCompat { private void initializeResources(View v) { Log.w("EmojiDrawer", "initializeResources()"); - this.container = (LinearLayout) v.findViewById(R.id.container); this.pager = (ViewPager) v.findViewById(R.id.emoji_pager); this.strip = (PagerSlidingTabStrip) v.findViewById(R.id.tabs); @@ -71,8 +66,19 @@ public class EmojiDrawer extends LinearLayoutCompat { }); } - public boolean isOpen() { - return container.getVisibility() == View.VISIBLE; + public boolean isShowing() { + return getVisibility() == VISIBLE; + } + + public void show(KeyboardAwareLinearLayout container) { + ViewGroup.LayoutParams params = getLayoutParams(); + params.height = container.getKeyboardHeight(); + setLayoutParams(params); + setVisibility(VISIBLE); + } + + public void dismiss() { + setVisibility(GONE); } private void initializeEmojiGrid() { diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiPopup.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiPopup.java deleted file mode 100644 index e1fbff1d06..0000000000 --- a/src/org/thoughtcrime/securesms/components/emoji/EmojiPopup.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.thoughtcrime.securesms.components.emoji; - -import android.util.Log; -import android.view.Gravity; -import android.view.View; -import android.view.ViewTreeObserver.OnGlobalLayoutListener; -import android.widget.PopupWindow; - -import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.components.KeyboardAwareLinearLayout; -import org.thoughtcrime.securesms.components.emoji.EmojiDrawer.EmojiEventListener; - -public class EmojiPopup extends PopupWindow { - private static final String TAG = EmojiPopup.class.getSimpleName(); - private KeyboardAwareLinearLayout parent; - - public EmojiPopup(KeyboardAwareLinearLayout parent) { - super(new EmojiDrawer(parent.getContext()), - parent.getWidth(), - parent.getResources().getDimensionPixelSize(R.dimen.min_emoji_drawer_height)); - this.parent = parent; - getContentView().setClickable(true); - getContentView().setFocusableInTouchMode(true); - getContentView().setFocusable(true); - setTouchable(true); - setFocusable(true); - } - - public void setEmojiEventListener(EmojiEventListener listener) { - ((EmojiDrawer)getContentView()).setEmojiEventListener(listener); - } - - public void show() { - setHeight(parent.getKeyboardHeight()); - setWidth(parent.getWidth()); - parent.padForCustomKeyboard(getHeight()); - Log.w(TAG, String.format("show(%d, %d)", getWidth(), getHeight())); - showAtLocation(parent, Gravity.BOTTOM | Gravity.LEFT, 0, 0); - } - - @Override - public void dismiss() { - super.dismiss(); - } - - public void update() { - update(parent, 0, 0, parent.getWidth(), -1); - } -}