From d76783d29196563de8632aeb84c3283c0978e877 Mon Sep 17 00:00:00 2001 From: stom79 Date: Fri, 3 Nov 2017 13:55:18 +0100 Subject: [PATCH] Custom emoji picker --- .../mastodon/activities/TootActivity.java | 50 ++++++++ .../mastodon/drawers/CustomEmojiAdapter.java | 117 ++++++++++++++++++ .../drawable-anydpi/ic_insert_emoticon.xml | 9 ++ app/src/main/res/menu/main_toot.xml | 5 + app/src/main/res/values-de/strings.xml | 2 + app/src/main/res/values-fr/strings.xml | 2 + app/src/main/res/values-nl/strings.xml | 2 + app/src/main/res/values-pt/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 9 files changed, 191 insertions(+) create mode 100644 app/src/main/java/fr/gouv/etalab/mastodon/drawers/CustomEmojiAdapter.java create mode 100644 app/src/main/res/drawable-anydpi/ic_insert_emoticon.xml diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java index 419f9552b..1fb9ed8dd 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java @@ -47,6 +47,7 @@ import android.text.InputFilter; import android.text.InputType; import android.text.SpannableString; import android.text.TextWatcher; +import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; @@ -63,6 +64,7 @@ import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.DatePicker; import android.widget.EditText; +import android.widget.GridView; import android.widget.HorizontalScrollView; import android.widget.ImageButton; import android.widget.ImageView; @@ -120,8 +122,10 @@ import fr.gouv.etalab.mastodon.client.Entities.Mention; import fr.gouv.etalab.mastodon.client.Entities.Results; import fr.gouv.etalab.mastodon.client.Entities.Status; import fr.gouv.etalab.mastodon.client.Entities.StoredStatus; +import fr.gouv.etalab.mastodon.drawers.CustomEmojiAdapter; import fr.gouv.etalab.mastodon.drawers.EmojisSearchAdapter; import fr.gouv.etalab.mastodon.interfaces.OnRetrieveEmojiInterface; +import fr.gouv.etalab.mastodon.sqlite.CustomEmojiDAO; import fr.gouv.etalab.mastodon.translation.Translate; import fr.gouv.etalab.mastodon.client.Entities.Version; import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; @@ -188,6 +192,7 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc private Account accountReply; private View popup_trans; private AlertDialog dialogTrans; + private AlertDialog alertDialogEmoji; @Override protected void onCreate(Bundle savedInstanceState) { @@ -862,6 +867,41 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc } }); picker.show(getSupportFragmentManager(), "COUNTRY_PICKER"); + return true; + case R.id.action_emoji: + final List emojis = new CustomEmojiDAO(getApplicationContext(), db).getAllEmojis(); + final AlertDialog.Builder builder = new AlertDialog.Builder(this); + int paddingPixel = 15; + float density = getResources().getDisplayMetrics().density; + int paddingDp = (int)(paddingPixel * density); + builder.setNeutralButton(R.string.cancel, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.setTitle(R.string.insert_emoji); + if( emojis != null && emojis.size() > 0) { + GridView gridView = new GridView(TootActivity.this); + gridView.setAdapter(new CustomEmojiAdapter(getApplicationContext(), android.R.layout.simple_list_item_1, emojis)); + gridView.setNumColumns(5); + gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + toot_content.getText().insert(toot_content.getSelectionStart(), " :" + emojis.get(position).getShortcode()+": "); + alertDialogEmoji.dismiss(); + } + }); + gridView.setPadding(paddingDp,paddingDp,paddingDp,paddingDp); + builder.setView(gridView); + }else{ + TextView textView = new TextView(TootActivity.this); + textView.setText(getString(R.string.no_emoji)); + textView.setPadding(paddingDp,paddingDp,paddingDp,paddingDp); + builder.setView(textView); + } + alertDialogEmoji = builder.show(); + + return true; case R.id.action_microphone: Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); @@ -1059,6 +1099,16 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc if( itemViewReply != null) itemViewReply.setVisible(false); } + SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + String instanceVersion = sharedpreferences.getString(Helper.INSTANCE_VERSION, null); + Version currentVersion = new Version(instanceVersion); + Version minVersion = new Version("2.0"); + MenuItem itemEmoji = menu.findItem(R.id.action_emoji); + if (currentVersion.compareTo(minVersion) == 1 || currentVersion.equals(minVersion)) { + itemEmoji.setVisible(true); + }else{ + itemEmoji.setVisible(false); + } if( accountReply != null){ MenuItem itemRestore = menu.findItem(R.id.action_restore); if( itemRestore != null) diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/CustomEmojiAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/CustomEmojiAdapter.java new file mode 100644 index 000000000..80c501f0c --- /dev/null +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/CustomEmojiAdapter.java @@ -0,0 +1,117 @@ +package fr.gouv.etalab.mastodon.drawers; +/* Copyright 2017 Thomas Schneider + * + * This file is a part of Mastalab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Mastalab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Mastalab; if not, + * see . */ + + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.support.annotation.NonNull; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.GridView; +import android.widget.ImageView; + +import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; +import com.nostra13.universalimageloader.core.DisplayImageOptions; +import com.nostra13.universalimageloader.core.ImageLoader; +import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; +import com.nostra13.universalimageloader.core.assist.FailReason; +import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; +import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; + +import java.io.File; +import java.util.List; + +import fr.gouv.etalab.mastodon.client.Entities.Emojis; +import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; +import mastodon.etalab.gouv.fr.mastodon.R; + +/** + * Created by Thomas on 03/11/2017. + * Adapter to display custom emojis + */ +public class CustomEmojiAdapter extends ArrayAdapter { + + + private Context context; + private List emojis; + private CustomEmojiAdapter customEmojiAdapter; + + public CustomEmojiAdapter(@NonNull Context context, int resource, List emojis) { + super(context, resource, resource); + this.context = context; + this.emojis = emojis; + customEmojiAdapter = this; + } + + @Override + public int getCount() { + return emojis.size(); + } + + @Override + public Emojis getItem(int position) { + return emojis.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @NonNull + public View getView(final int position, View convertView, @NonNull ViewGroup parent) { + final ImageView imageView; + Emojis emoji = emojis.get(position); + if (convertView == null) { + imageView = new ImageView(context); + float density = context.getResources().getDisplayMetrics().density; + imageView.setLayoutParams(new GridView.LayoutParams((int)(30*density), (int)(30*density))); + imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); + imageView.setPadding((int)(2*density), (int)(5*density), (int)(2*density), (int)(5*density)); + } else { + imageView = (ImageView) convertView; + } + ImageLoader imageLoader = ImageLoader.getInstance(); + File cacheDir = new File(context.getCacheDir(), context.getString(R.string.app_name)); + ImageLoaderConfiguration configImg = new ImageLoaderConfiguration.Builder(context) + .imageDownloader(new PatchBaseImageDownloader(context)) + .threadPoolSize(5) + .threadPriority(Thread.MIN_PRIORITY + 3) + .denyCacheImageMultipleSizesInMemory() + .diskCache(new UnlimitedDiskCache(cacheDir)) + .build(); + DisplayImageOptions optionNew = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) + .cacheOnDisk(true).resetViewBeforeLoading(true).build(); + if( !imageLoader.isInited()) + imageLoader.init(configImg); + imageLoader.loadImage(emoji.getUrl(), optionNew, new SimpleImageLoadingListener() { + @Override + public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { + super.onLoadingComplete(imageUri, view, loadedImage); + BitmapDrawable icon = new BitmapDrawable(context.getResources(), loadedImage); + imageView.setImageDrawable(icon); + } + + @Override + public void onLoadingFailed(String imageUri, View view, FailReason failReason) { + } + }); + return imageView; + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable-anydpi/ic_insert_emoticon.xml b/app/src/main/res/drawable-anydpi/ic_insert_emoticon.xml new file mode 100644 index 000000000..c242c6e52 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_insert_emoticon.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/menu/main_toot.xml b/app/src/main/res/menu/main_toot.xml index b430d4f7c..0676894ef 100644 --- a/app/src/main/res/menu/main_toot.xml +++ b/app/src/main/res/menu/main_toot.xml @@ -6,6 +6,11 @@ android:title="@string/show_reply" android:icon="@drawable/ic_visibility" app:showAsAction="always" /> + Translate Please, wait few seconds before making this action. Das Profil wird möglicherweise unvollständig wiedergegeben. + Emoji einfügen + The app did not collect custom emojis for the moment. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 37abcde6c..96016bcb7 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -437,4 +437,6 @@ Traduire Veuillez patienter quelques secondes avant de faire cette action. Les données ci-dessous peuvent ne pas refléter ce profil dans sa totalité. + Insérer un émoji + L\'application n\'a pas encore collecté d\'emojis personnalisés \ No newline at end of file diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 696e4d395..b32c3c3f7 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -434,4 +434,6 @@ Translate Please, wait few seconds before making this action. De informatie hieronder kan mogelijk een incompleet beeld geven van dit gebruikersprofiel. + Emoji toevoegen + The app did not collect custom emojis for the moment. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 8bc81a4cb..a2b176615 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -436,4 +436,6 @@ Translate Please, wait few seconds before making this action. Information below may reflect the user\'s profile incompletely. + Inserir Emoji + The app did not collect custom emojis for the moment. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aaff56f47..452ebc45f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -94,6 +94,8 @@ Failed! Scheduled toots Information below may reflect the user\'s profile incompletely. + Insert emoji + The app did not collect custom emojis for the moment. No toot to display The toot was added to favourites