From ce610e0262ec01ff91a3fb1b73fe932c9ee0dde0 Mon Sep 17 00:00:00 2001 From: Jake McGinty Date: Fri, 29 May 2015 10:54:59 -0700 Subject: [PATCH] no more emoji pane fragment Fixes #3271 Closes #3280 // FREEBIE --- res/layout/conversation_activity.xml | 8 +- res/layout/emoji_drawer_stub.xml | 6 ++ .../securesms/ConversationActivity.java | 17 ++--- .../components/emoji/EmojiDrawer.java | 73 +++++++++++-------- .../components/emoji/EmojiEditText.java | 4 +- ...jiPageFragment.java => EmojiPageView.java} | 47 +++++++----- 6 files changed, 87 insertions(+), 68 deletions(-) create mode 100644 res/layout/emoji_drawer_stub.xml rename src/org/thoughtcrime/securesms/components/emoji/{EmojiPageFragment.java => EmojiPageView.java} (76%) diff --git a/res/layout/conversation_activity.xml b/res/layout/conversation_activity.xml index a9cdca633..f3f315e70 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 000000000..dd8612ec4 --- /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 3ec4731ad..58b98fccb 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 325caa5d0..07105bd40 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 43e3cfaeb..5ee4680dd 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 9f2bfdccf..a2c053250 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) {