no more emoji pane fragment

Fixes #3271
Closes #3280

// FREEBIE
pull/1/head
Jake McGinty 10 years ago committed by Moxie Marlinspike
parent e130d0a3e6
commit ce610e0262

@ -139,8 +139,10 @@
</LinearLayout> </LinearLayout>
</RelativeLayout> </RelativeLayout>
<FrameLayout android:id="@+id/emoji_drawer" <ViewStub android:id="@+id/emoji_drawer_stub"
android:layout_width="match_parent" android:inflatedId="@+id/emoji_drawer"
android:layout_height="wrap_content" /> android:layout="@layout/emoji_drawer_stub"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout> </LinearLayout>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<org.thoughtcrime.securesms.components.emoji.EmojiDrawer
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.1" />

@ -41,6 +41,7 @@ import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener; import android.view.View.OnFocusChangeListener;
import android.view.View.OnKeyListener; import android.view.View.OnKeyListener;
import android.view.ViewStub;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.ImageButton; import android.widget.ImageButton;
@ -150,7 +151,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
private AttachmentManager attachmentManager; private AttachmentManager attachmentManager;
private BroadcastReceiver securityUpdateReceiver; private BroadcastReceiver securityUpdateReceiver;
private BroadcastReceiver groupUpdateReceiver; private BroadcastReceiver groupUpdateReceiver;
private Optional<EmojiDrawer> emojiDrawer; private Optional<EmojiDrawer> emojiDrawer = Optional.absent();
private EmojiToggle emojiToggle; private EmojiToggle emojiToggle;
private Recipients recipients; private Recipients recipients;
@ -690,7 +691,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
attachButton = (ImageButton) findViewById(R.id.attach_button); attachButton = (ImageButton) findViewById(R.id.attach_button);
composeText = (ComposeText) findViewById(R.id.embedded_text_editor); composeText = (ComposeText) findViewById(R.id.embedded_text_editor);
charactersLeft = (TextView) findViewById(R.id.space_left); charactersLeft = (TextView) findViewById(R.id.space_left);
emojiDrawer = Optional.absent();
emojiToggle = (EmojiToggle) findViewById(R.id.emoji_toggle); emojiToggle = (EmojiToggle) findViewById(R.id.emoji_toggle);
attachmentAdapter = new AttachmentTypeSelectorAdapter(this); attachmentAdapter = new AttachmentTypeSelectorAdapter(this);
@ -720,15 +720,10 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
private EmojiDrawer getEmojiDrawer() { private EmojiDrawer getEmojiDrawer() {
if (emojiDrawer.isPresent()) return emojiDrawer.get(); if (emojiDrawer.isPresent()) return emojiDrawer.get();
EmojiDrawer emojiDrawer = (EmojiDrawer)((ViewStub)findViewById(R.id.emoji_drawer_stub)).inflate();
EmojiDrawer emojiDrawerFragment = EmojiDrawer.newInstance(); emojiDrawer.setComposeEditText(composeText);
emojiDrawerFragment.setComposeEditText(composeText); this.emojiDrawer = Optional.of(emojiDrawer);
getSupportFragmentManager().beginTransaction() return emojiDrawer;
.add(R.id.emoji_drawer, emojiDrawerFragment)
.commit();
getSupportFragmentManager().executePendingTransactions();
emojiDrawer = Optional.of(emojiDrawerFragment);
return emojiDrawerFragment;
} }
private boolean isEmojiDrawerOpen() { private boolean isEmojiDrawerOpen() {

@ -1,14 +1,12 @@
package org.thoughtcrime.securesms.components.emoji; package org.thoughtcrime.securesms.components.emoji;
import android.content.Context; import android.content.Context;
import android.os.Bundle;
import android.support.annotation.ArrayRes; import android.support.annotation.ArrayRes;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.Fragment; import android.support.v4.view.PagerAdapter;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log; import android.util.Log;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -17,6 +15,7 @@ import android.view.ViewGroup;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ImageView.ScaleType; import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import com.astuetz.PagerSlidingTabStrip; import com.astuetz.PagerSlidingTabStrip;
@ -25,13 +24,13 @@ import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.KeyboardAwareLinearLayout; import org.thoughtcrime.securesms.components.KeyboardAwareLinearLayout;
import org.thoughtcrime.securesms.components.RepeatableImageKey; import org.thoughtcrime.securesms.components.RepeatableImageKey;
import org.thoughtcrime.securesms.components.RepeatableImageKey.KeyEventListener; 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 org.thoughtcrime.securesms.util.ResUtil;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; 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 static final KeyEvent DELETE_KEY_EVENT = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
private EmojiEditText composeText; private EmojiEditText composeText;
@ -41,30 +40,30 @@ public class EmojiDrawer extends Fragment {
private PagerSlidingTabStrip strip; private PagerSlidingTabStrip strip;
private RecentEmojiPageModel recentModel; private RecentEmojiPageModel recentModel;
public static EmojiDrawer newInstance(@ArrayRes int categories, @ArrayRes int icons) { public EmojiDrawer(Context context) {
final EmojiDrawer fragment = new EmojiDrawer(); super(context);
final Bundle args = new Bundle(); init();
args.putInt("categories", categories);
args.putInt("icons", icons);
fragment.setArguments(args);
return fragment;
} }
public static EmojiDrawer newInstance() { public EmojiDrawer(Context context, AttributeSet attrs) {
return newInstance(R.array.emoji_categories, R.array.emoji_category_icons); super(context, attrs);
init();
}
public EmojiDrawer(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
} }
public void setComposeEditText(EmojiEditText composeText) { public void setComposeEditText(EmojiEditText composeText) {
this.composeText = composeText; this.composeText = composeText;
} }
@Override private void init() {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View v = LayoutInflater.from(getContext()).inflate(R.layout.emoji_drawer, this, true);
final View v = inflater.inflate(R.layout.emoji_drawer, container, false);
initializeResources(v); initializeResources(v);
initializePageModels(getArguments().getInt("categories"), getArguments().getInt("icons")); initializePageModels(R.array.emoji_categories, R.array.emoji_category_icons);
initializeEmojiGrid(); initializeEmojiGrid();
return v;
} }
private void initializeResources(View v) { private void initializeResources(View v) {
@ -90,7 +89,7 @@ public class EmojiDrawer extends Fragment {
public void show() { public void show() {
int keyboardHeight = container.getKeyboardHeight(); int keyboardHeight = container.getKeyboardHeight();
Log.w("EmojiDrawer", "setting emoji drawer to height " + keyboardHeight); 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.requestLayout();
container.setVisibility(View.VISIBLE); container.setVisibility(View.VISIBLE);
} }
@ -100,8 +99,7 @@ public class EmojiDrawer extends Fragment {
} }
private void initializeEmojiGrid() { private void initializeEmojiGrid() {
pager.setAdapter(new EmojiPagerAdapter(getActivity(), pager.setAdapter(new EmojiPagerAdapter(getContext(),
getFragmentManager(),
models, models,
new EmojiSelectionListener() { new EmojiSelectionListener() {
@Override public void onEmojiSelected(int emojiCode) { @Override public void onEmojiSelected(int emojiCode) {
@ -117,17 +115,17 @@ public class EmojiDrawer extends Fragment {
} }
private void initializePageModels(@ArrayRes int pagesRes, @ArrayRes int iconsRes) { private void initializePageModels(@ArrayRes int pagesRes, @ArrayRes int iconsRes) {
final int[] icons = ResUtil.getResourceIds(getActivity(), iconsRes); final int[] icons = ResUtil.getResourceIds(getContext(), iconsRes);
final int[] pages = ResUtil.getResourceIds(getActivity(), pagesRes); final int[] pages = ResUtil.getResourceIds(getContext(), pagesRes);
this.models = new LinkedList<>(); this.models = new LinkedList<>();
this.recentModel = new RecentEmojiPageModel(getActivity()); this.recentModel = new RecentEmojiPageModel(getContext());
this.models.add(recentModel); this.models.add(recentModel);
for (int i = 0; i < icons.length; i++) { for (int i = 0; i < icons.length; i++) {
this.models.add(new StaticEmojiPageModel(icons[i], getResources().getIntArray(pages[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 implements PagerSlidingTabStrip.CustomTabProvider
{ {
private Context context; private Context context;
@ -135,11 +133,10 @@ public class EmojiDrawer extends Fragment {
private EmojiSelectionListener listener; private EmojiSelectionListener listener;
public EmojiPagerAdapter(@NonNull Context context, public EmojiPagerAdapter(@NonNull Context context,
@NonNull FragmentManager fm,
@NonNull List<EmojiPageModel> pages, @NonNull List<EmojiPageModel> pages,
@Nullable EmojiSelectionListener listener) @Nullable EmojiSelectionListener listener)
{ {
super(fm); super();
this.context = context; this.context = context;
this.pages = pages; this.pages = pages;
this.listener = listener; this.listener = listener;
@ -150,16 +147,28 @@ public class EmojiDrawer extends Fragment {
return pages.size(); return pages.size();
} }
@Override public Fragment getItem(int i) { @Override public Object instantiateItem(ViewGroup container, int position) {
return EmojiPageFragment.newInstance(pages.get(i), listener); 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) { @Override public void setPrimaryItem(ViewGroup container, int position, Object object) {
EmojiPageFragment current = (EmojiPageFragment) object; EmojiPageView current = (EmojiPageView) object;
current.onSelected(); current.onSelected();
super.setPrimaryItem(container, position, object); super.setPrimaryItem(container, position, object);
} }
@Override public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override public View getCustomTabView(ViewGroup viewGroup, int i) { @Override public View getCustomTabView(ViewGroup viewGroup, int i) {
ImageView image = new ImageView(context); ImageView image = new ImageView(context);
image.setScaleType(ScaleType.CENTER_INSIDE); image.setScaleType(ScaleType.CENTER_INSIDE);

@ -17,9 +17,7 @@ public class EmojiEditText extends AppCompatEditText {
super(context, attrs); super(context, attrs);
} }
public EmojiEditText(Context context, AttributeSet attrs, public EmojiEditText(Context context, AttributeSet attrs, int defStyleAttr) {
int defStyleAttr)
{
super(context, attrs, defStyleAttr); super(context, attrs, defStyleAttr);
} }

@ -1,11 +1,10 @@
package org.thoughtcrime.securesms.components.emoji; package org.thoughtcrime.securesms.components.emoji;
import android.annotation.TargetApi;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Build.VERSION_CODES;
import android.support.annotation.NonNull; import android.util.AttributeSet;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -13,25 +12,38 @@ import android.widget.AbsListView;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter; import android.widget.BaseAdapter;
import android.widget.FrameLayout;
import android.widget.GridView; import android.widget.GridView;
import android.widget.ImageView; import android.widget.ImageView;
import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.R;
public class EmojiPageFragment extends Fragment { public class EmojiPageView extends FrameLayout {
private static final String TAG = EmojiPageFragment.class.getSimpleName(); private static final String TAG = EmojiPageView.class.getSimpleName();
private EmojiPageModel model; private EmojiPageModel model;
private EmojiSelectionListener listener; private EmojiSelectionListener listener;
private GridView grid; private GridView grid;
public static EmojiPageFragment newInstance(@NonNull EmojiPageModel model, public EmojiPageView(Context context) {
@Nullable EmojiSelectionListener listener) super(context);
{ init();
EmojiPageFragment fragment = new EmojiPageFragment(); }
fragment.setModel(model);
fragment.setEmojiSelectedListener(listener); public EmojiPageView(Context context, AttributeSet attrs) {
return fragment; 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() { public void onSelected() {
@ -40,10 +52,8 @@ public class EmojiPageFragment extends Fragment {
} }
} }
@Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, private void init() {
Bundle savedInstanceState) final View view = LayoutInflater.from(getContext()).inflate(R.layout.emoji_grid_layout, this, true);
{
final View view = inflater.inflate(R.layout.emoji_grid_layout, container, false);
grid = (GridView) view.findViewById(R.id.emoji); 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.setColumnWidth(getResources().getDimensionPixelSize(R.dimen.emoji_drawer_size) + 2 * getResources().getDimensionPixelSize(R.dimen.emoji_drawer_item_padding));
grid.setOnItemClickListener(new OnItemClickListener() { grid.setOnItemClickListener(new OnItemClickListener() {
@ -51,12 +61,11 @@ public class EmojiPageFragment extends Fragment {
if (listener != null) listener.onEmojiSelected((Integer)view.getTag()); if (listener != null) listener.onEmojiSelected((Integer)view.getTag());
} }
}); });
grid.setAdapter(new EmojiGridAdapter(getActivity(), model));
return view;
} }
public void setModel(EmojiPageModel model) { public void setModel(EmojiPageModel model) {
this.model = model; this.model = model;
grid.setAdapter(new EmojiGridAdapter(getContext(), model));
} }
public void setEmojiSelectedListener(EmojiSelectionListener listener) { public void setEmojiSelectedListener(EmojiSelectionListener listener) {
Loading…
Cancel
Save