diff --git a/res/layout/conversation_activity.xml b/res/layout/conversation_activity.xml
index a9cdca6333..f3f315e705 100644
--- a/res/layout/conversation_activity.xml
+++ b/res/layout/conversation_activity.xml
@@ -139,8 +139,10 @@
-
+
diff --git a/res/layout/emoji_drawer_stub.xml b/res/layout/emoji_drawer_stub.xml
new file mode 100644
index 0000000000..dd8612ec42
--- /dev/null
+++ b/res/layout/emoji_drawer_stub.xml
@@ -0,0 +1,6 @@
+
+
\ No newline at end of file
diff --git a/src/org/thoughtcrime/securesms/ConversationActivity.java b/src/org/thoughtcrime/securesms/ConversationActivity.java
index 3ec4731ada..58b98fccba 100644
--- a/src/org/thoughtcrime/securesms/ConversationActivity.java
+++ b/src/org/thoughtcrime/securesms/ConversationActivity.java
@@ -41,6 +41,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.ImageButton;
@@ -150,7 +151,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
private AttachmentManager attachmentManager;
private BroadcastReceiver securityUpdateReceiver;
private BroadcastReceiver groupUpdateReceiver;
- private Optional emojiDrawer;
+ private Optional emojiDrawer = Optional.absent();
private EmojiToggle emojiToggle;
private Recipients recipients;
@@ -690,7 +691,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
attachButton = (ImageButton) findViewById(R.id.attach_button);
composeText = (ComposeText) findViewById(R.id.embedded_text_editor);
charactersLeft = (TextView) findViewById(R.id.space_left);
- emojiDrawer = Optional.absent();
emojiToggle = (EmojiToggle) findViewById(R.id.emoji_toggle);
attachmentAdapter = new AttachmentTypeSelectorAdapter(this);
@@ -720,15 +720,10 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
private EmojiDrawer getEmojiDrawer() {
if (emojiDrawer.isPresent()) return emojiDrawer.get();
-
- EmojiDrawer emojiDrawerFragment = EmojiDrawer.newInstance();
- emojiDrawerFragment.setComposeEditText(composeText);
- getSupportFragmentManager().beginTransaction()
- .add(R.id.emoji_drawer, emojiDrawerFragment)
- .commit();
- getSupportFragmentManager().executePendingTransactions();
- emojiDrawer = Optional.of(emojiDrawerFragment);
- return emojiDrawerFragment;
+ EmojiDrawer emojiDrawer = (EmojiDrawer)((ViewStub)findViewById(R.id.emoji_drawer_stub)).inflate();
+ emojiDrawer.setComposeEditText(composeText);
+ this.emojiDrawer = Optional.of(emojiDrawer);
+ return emojiDrawer;
}
private boolean isEmojiDrawerOpen() {
diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiDrawer.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiDrawer.java
index 325caa5d09..07105bd40d 100644
--- a/src/org/thoughtcrime/securesms/components/emoji/EmojiDrawer.java
+++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiDrawer.java
@@ -1,14 +1,12 @@
package org.thoughtcrime.securesms.components.emoji;
import android.content.Context;
-import android.os.Bundle;
import android.support.annotation.ArrayRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentStatePagerAdapter;
+import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
+import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -17,6 +15,7 @@ import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
+import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import com.astuetz.PagerSlidingTabStrip;
@@ -25,13 +24,13 @@ 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.EmojiPageFragment.EmojiSelectionListener;
+import org.thoughtcrime.securesms.components.emoji.EmojiPageView.EmojiSelectionListener;
import org.thoughtcrime.securesms.util.ResUtil;
import java.util.LinkedList;
import java.util.List;
-public class EmojiDrawer extends Fragment {
+public class EmojiDrawer extends KeyboardAwareLinearLayout {
private static final KeyEvent DELETE_KEY_EVENT = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
private EmojiEditText composeText;
@@ -41,30 +40,30 @@ public class EmojiDrawer extends Fragment {
private PagerSlidingTabStrip strip;
private RecentEmojiPageModel recentModel;
- public static EmojiDrawer newInstance(@ArrayRes int categories, @ArrayRes int icons) {
- final EmojiDrawer fragment = new EmojiDrawer();
- final Bundle args = new Bundle();
- args.putInt("categories", categories);
- args.putInt("icons", icons);
- fragment.setArguments(args);
- return fragment;
+ public EmojiDrawer(Context context) {
+ super(context);
+ init();
}
- public static EmojiDrawer newInstance() {
- return newInstance(R.array.emoji_categories, R.array.emoji_category_icons);
+ public EmojiDrawer(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init();
+ }
+
+ public EmojiDrawer(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ init();
}
public void setComposeEditText(EmojiEditText composeText) {
this.composeText = composeText;
}
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- final View v = inflater.inflate(R.layout.emoji_drawer, container, false);
+ private void init() {
+ final View v = LayoutInflater.from(getContext()).inflate(R.layout.emoji_drawer, this, true);
initializeResources(v);
- initializePageModels(getArguments().getInt("categories"), getArguments().getInt("icons"));
+ initializePageModels(R.array.emoji_categories, R.array.emoji_category_icons);
initializeEmojiGrid();
- return v;
}
private void initializeResources(View v) {
@@ -90,7 +89,7 @@ public class EmojiDrawer extends Fragment {
public void show() {
int keyboardHeight = container.getKeyboardHeight();
Log.w("EmojiDrawer", "setting emoji drawer to height " + keyboardHeight);
- container.setLayoutParams(new FrameLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, keyboardHeight));
+ container.setLayoutParams(new LinearLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, keyboardHeight));
container.requestLayout();
container.setVisibility(View.VISIBLE);
}
@@ -100,8 +99,7 @@ public class EmojiDrawer extends Fragment {
}
private void initializeEmojiGrid() {
- pager.setAdapter(new EmojiPagerAdapter(getActivity(),
- getFragmentManager(),
+ pager.setAdapter(new EmojiPagerAdapter(getContext(),
models,
new EmojiSelectionListener() {
@Override public void onEmojiSelected(int emojiCode) {
@@ -117,17 +115,17 @@ public class EmojiDrawer extends Fragment {
}
private void initializePageModels(@ArrayRes int pagesRes, @ArrayRes int iconsRes) {
- final int[] icons = ResUtil.getResourceIds(getActivity(), iconsRes);
- final int[] pages = ResUtil.getResourceIds(getActivity(), pagesRes);
+ final int[] icons = ResUtil.getResourceIds(getContext(), iconsRes);
+ final int[] pages = ResUtil.getResourceIds(getContext(), pagesRes);
this.models = new LinkedList<>();
- this.recentModel = new RecentEmojiPageModel(getActivity());
+ this.recentModel = new RecentEmojiPageModel(getContext());
this.models.add(recentModel);
for (int i = 0; i < icons.length; i++) {
this.models.add(new StaticEmojiPageModel(icons[i], getResources().getIntArray(pages[i])));
}
}
- public static class EmojiPagerAdapter extends FragmentStatePagerAdapter
+ public static class EmojiPagerAdapter extends PagerAdapter
implements PagerSlidingTabStrip.CustomTabProvider
{
private Context context;
@@ -135,11 +133,10 @@ public class EmojiDrawer extends Fragment {
private EmojiSelectionListener listener;
public EmojiPagerAdapter(@NonNull Context context,
- @NonNull FragmentManager fm,
@NonNull List pages,
@Nullable EmojiSelectionListener listener)
{
- super(fm);
+ super();
this.context = context;
this.pages = pages;
this.listener = listener;
@@ -150,16 +147,28 @@ public class EmojiDrawer extends Fragment {
return pages.size();
}
- @Override public Fragment getItem(int i) {
- return EmojiPageFragment.newInstance(pages.get(i), listener);
+ @Override public Object instantiateItem(ViewGroup container, int position) {
+ EmojiPageView page = new EmojiPageView(context);
+ page.setModel(pages.get(position));
+ page.setEmojiSelectedListener(listener);
+ container.addView(page);
+ return page;
+ }
+
+ @Override public void destroyItem(ViewGroup container, int position, Object object) {
+ container.removeView((View)object);
}
@Override public void setPrimaryItem(ViewGroup container, int position, Object object) {
- EmojiPageFragment current = (EmojiPageFragment) object;
+ EmojiPageView current = (EmojiPageView) object;
current.onSelected();
super.setPrimaryItem(container, position, object);
}
+ @Override public boolean isViewFromObject(View view, Object object) {
+ return view == object;
+ }
+
@Override public View getCustomTabView(ViewGroup viewGroup, int i) {
ImageView image = new ImageView(context);
image.setScaleType(ScaleType.CENTER_INSIDE);
diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiEditText.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiEditText.java
index 43e3cfaeb3..5ee4680dde 100644
--- a/src/org/thoughtcrime/securesms/components/emoji/EmojiEditText.java
+++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiEditText.java
@@ -17,9 +17,7 @@ public class EmojiEditText extends AppCompatEditText {
super(context, attrs);
}
- public EmojiEditText(Context context, AttributeSet attrs,
- int defStyleAttr)
- {
+ public EmojiEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiPageFragment.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiPageView.java
similarity index 76%
rename from src/org/thoughtcrime/securesms/components/emoji/EmojiPageFragment.java
rename to src/org/thoughtcrime/securesms/components/emoji/EmojiPageView.java
index 9f2bfdccf9..a2c0532509 100644
--- a/src/org/thoughtcrime/securesms/components/emoji/EmojiPageFragment.java
+++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiPageView.java
@@ -1,11 +1,10 @@
package org.thoughtcrime.securesms.components.emoji;
+import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
+import android.os.Build.VERSION_CODES;
+import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -13,25 +12,38 @@ import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
+import android.widget.FrameLayout;
import android.widget.GridView;
import android.widget.ImageView;
import org.thoughtcrime.securesms.R;
-public class EmojiPageFragment extends Fragment {
- private static final String TAG = EmojiPageFragment.class.getSimpleName();
+public class EmojiPageView extends FrameLayout {
+ private static final String TAG = EmojiPageView.class.getSimpleName();
private EmojiPageModel model;
private EmojiSelectionListener listener;
private GridView grid;
- public static EmojiPageFragment newInstance(@NonNull EmojiPageModel model,
- @Nullable EmojiSelectionListener listener)
- {
- EmojiPageFragment fragment = new EmojiPageFragment();
- fragment.setModel(model);
- fragment.setEmojiSelectedListener(listener);
- return fragment;
+ public EmojiPageView(Context context) {
+ super(context);
+ init();
+ }
+
+ public EmojiPageView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init();
+ }
+
+ public EmojiPageView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init();
+ }
+
+ @TargetApi(VERSION_CODES.LOLLIPOP)
+ public EmojiPageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ init();
}
public void onSelected() {
@@ -40,10 +52,8 @@ public class EmojiPageFragment extends Fragment {
}
}
- @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState)
- {
- final View view = inflater.inflate(R.layout.emoji_grid_layout, container, false);
+ private void init() {
+ final View view = LayoutInflater.from(getContext()).inflate(R.layout.emoji_grid_layout, this, true);
grid = (GridView) view.findViewById(R.id.emoji);
grid.setColumnWidth(getResources().getDimensionPixelSize(R.dimen.emoji_drawer_size) + 2 * getResources().getDimensionPixelSize(R.dimen.emoji_drawer_item_padding));
grid.setOnItemClickListener(new OnItemClickListener() {
@@ -51,12 +61,11 @@ public class EmojiPageFragment extends Fragment {
if (listener != null) listener.onEmojiSelected((Integer)view.getTag());
}
});
- grid.setAdapter(new EmojiGridAdapter(getActivity(), model));
- return view;
}
public void setModel(EmojiPageModel model) {
this.model = model;
+ grid.setAdapter(new EmojiGridAdapter(getContext(), model));
}
public void setEmojiSelectedListener(EmojiSelectionListener listener) {