Improves emoji support + fixes an issue when loading next toots

This commit is contained in:
tom79 2017-06-19 15:59:34 +02:00
parent 1a19b6337d
commit a1e1a3bd06
15 changed files with 2511 additions and 1904 deletions

View File

@ -16,6 +16,8 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -46,6 +46,7 @@ import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import fr.gouv.etalab.mastodon.asynctasks.UpdateAccountInfoByIDAsyncTask;
import fr.gouv.etalab.mastodon.client.Entities.Account;
@ -92,6 +93,7 @@ public class MainActivity extends AppCompatActivity
LEFT_TO_RIGHT,
POP
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -105,6 +107,7 @@ public class MainActivity extends AppCompatActivity
finish();
return;
}
Helper.fillMapEmoji(getApplicationContext());
//Here, the user is authenticated
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

View File

@ -41,7 +41,6 @@ import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.emojione.Emojione;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
@ -283,7 +282,7 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi
if( account != null){
setTitle(account.getAcct());
account_dn.setText(Emojione.shortnameToUnicode(account.getDisplay_name(), true));
account_dn.setText(Helper.shortnameToUnicode(account.getDisplay_name(), true));
account_un.setText(String.format("@%s", account.getUsername()));
if( account.getAcct() != null && account.getAcct().equals(account.getUsername()))
account_ac.setVisibility(View.GONE);

View File

@ -34,7 +34,6 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.emojione.Emojione;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
@ -152,7 +151,7 @@ public class AccountsListAdapter extends BaseAdapter implements OnPostActionInte
holder.account_ds.setVisibility(View.VISIBLE);
}
});
holder.account_dn.setText(Emojione.shortnameToUnicode(account.getDisplay_name(), true));
holder.account_dn.setText(Helper.shortnameToUnicode(account.getDisplay_name(), true));
holder.account_un.setText(String.format("@%s",account.getUsername()));
holder.account_ac.setText(account.getAcct());
if( account.getDisplay_name().equals(account.getAcct()))

View File

@ -26,7 +26,6 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.emojione.Emojione;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
@ -91,7 +90,7 @@ public class AccountsSearchAdapter extends BaseAdapter {
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.account_dn.setText(Emojione.shortnameToUnicode(account.getDisplay_name(), true));
holder.account_dn.setText(Helper.shortnameToUnicode(account.getDisplay_name(), true));
holder.account_un.setText(String.format("@%s",account.getUsername()));
//Profile picture
imageLoader.displayImage(account.getAvatar(), holder.account_pp, options);

View File

@ -30,7 +30,6 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.emojione.Emojione;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
@ -210,7 +209,7 @@ public class NotificationsListAdapter extends BaseAdapter {
}
});
holder.notification_account_displayname.setText(Emojione.shortnameToUnicode(notification.getAccount().getDisplay_name(), true));
holder.notification_account_displayname.setText(Helper.shortnameToUnicode(notification.getAccount().getDisplay_name(), true));
holder.notification_account_username.setText( String.format("@%s",notification.getAccount().getUsername()));
//Profile picture
imageLoader.displayImage(notification.getAccount().getAvatar(), holder.notification_account_profile, options);

View File

@ -31,7 +31,6 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.emojione.Emojione;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
@ -168,7 +167,7 @@ public class SearchListAdapter extends BaseAdapter {
final String content, displayName, username, ppurl;
if( status.getReblog() != null){
content = status.getReblog().getContent();
displayName = Emojione.shortnameToUnicode(status.getReblog().getAccount().getDisplay_name(), true);
displayName = Helper.shortnameToUnicode(status.getReblog().getAccount().getDisplay_name(), true);
username = status.getReblog().getAccount().getUsername();
holder.status_reblog_user.setText(displayName + " " +String.format("@%s",username));
ppurl = status.getReblog().getAccount().getAvatar();
@ -178,7 +177,7 @@ public class SearchListAdapter extends BaseAdapter {
}else {
ppurl = status.getAccount().getAvatar();
content = status.getContent();
displayName = Emojione.shortnameToUnicode(status.getAccount().getDisplay_name(), true);
displayName = Helper.shortnameToUnicode(status.getAccount().getDisplay_name(), true);
username = status.getAccount().getUsername();
holder.status_reblog_user.setVisibility(View.GONE);
holder.status_account_displayname.setText(displayName);

View File

@ -50,7 +50,6 @@ import android.widget.TextView;
import android.widget.Toast;
import android.widget.VideoView;
import com.emojione.Emojione;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
@ -243,7 +242,7 @@ public class StatusListAdapter extends BaseAdapter implements OnPostActionInterf
}else {
ppurl = status.getAccount().getAvatar();
content = status.getContent();
displayName = Emojione.shortnameToUnicode(status.getAccount().getDisplay_name(), true);
displayName = Helper.shortnameToUnicode(status.getAccount().getDisplay_name(), true);
username = status.getAccount().getUsername();
holder.status_reblog_user.setVisibility(View.GONE);
holder.status_account_displayname.setText(displayName);

View File

@ -256,7 +256,7 @@ public class DisplayAccountsFragment extends Fragment implements OnRetrieveAccou
lv_accounts.setAdapter(accountsListAdapter);
swiped = false;
}
if( accounts != null) {
if( accounts != null && accounts.size() > 0) {
for(Account tmpAccount: accounts){
this.accounts.add(tmpAccount);
}

View File

@ -175,7 +175,7 @@ public class DisplayFollowRequestSentFragment extends Fragment implements OnRetr
lv_accounts.setAdapter(accountsFollowRequestAdapter);
swiped = false;
}
if( accounts != null) {
if( accounts != null && accounts.size() > 0) {
for(Account tmpAccount: accounts){
this.accounts.add(tmpAccount);
}

View File

@ -178,7 +178,7 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve
}
max_id = apiResponse.getMax_id();
if( notifications != null) {
if( notifications != null && notifications.size() > 0) {
for(Notification tmpNotification: notifications){
this.notifications.add(tmpNotification);
}

View File

@ -58,7 +58,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn
private StatusListAdapter statusListAdapter;
private String max_id;
private List<Status> statuses;
private static RetrieveFeedsAsyncTask.Type type;
private RetrieveFeedsAsyncTask.Type type;
private RelativeLayout mainLoader, nextElementLoader, textviewNoAction;
private boolean firstLoad;
private SwipeRefreshLayout swipeRefreshLayout;
@ -265,6 +265,8 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn
swipeRefreshLayout.setRefreshing(false);
swiped = false;
return;
}else if( apiResponse.getError() != null && apiResponse.getError().getError().startsWith("404 -")) {
flag_loading = false;
}
List<Status> statuses = apiResponse.getStatuses();
if( !swiped && firstLoad && (statuses == null || statuses.size() == 0))
@ -277,7 +279,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn
swiped = false;
}
max_id = apiResponse.getMax_id();
if( statuses != null) {
if( statuses != null && statuses.size() > 0) {
for(Status tmpStatus: statuses){
this.statuses.add(tmpStatus);
}
@ -285,7 +287,8 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn
}
swipeRefreshLayout.setRefreshing(false);
firstLoad = false;
flag_loading = statuses != null && statuses.size() < tootsPerPage;
if( flag_loading )
flag_loading = statuses != null && statuses.size() < tootsPerPage;
//Store last toot id for home timeline to avoid to notify for those that have been already seen
if(statuses != null && statuses.size() > 0 && type == RetrieveFeedsAsyncTask.Type.HOME ){
final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);

View File

@ -25,6 +25,7 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.AssetFileDescriptor;
import android.content.res.Resources;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
@ -41,6 +42,7 @@ import android.support.design.widget.NavigationView;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
@ -55,14 +57,22 @@ import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import fr.gouv.etalab.mastodon.activities.LoginActivity;
import fr.gouv.etalab.mastodon.activities.ShowAccountActivity;
@ -159,6 +169,59 @@ public class Helper {
private static boolean menuAccountsOpened = false;
private static final Pattern SHORTNAME_PATTERN = Pattern.compile(":([-+\\w]+):");
/**
* Convert emojis in input to unicode
* @param input String
* @param removeIfUnsupported boolean
* @return String
*/
public static String shortnameToUnicode(String input, boolean removeIfUnsupported) {
Matcher matcher = SHORTNAME_PATTERN.matcher(input);
boolean supported = Build.VERSION.SDK_INT >= 16;
while (matcher.find()) {
String unicode = emoji.get(matcher.group(1));
if (unicode == null) {
continue;
}
if (supported) {
input = input.replace(":" + matcher.group(1) + ":", unicode);
} else if (removeIfUnsupported) {
input = input.replace(":" + matcher.group(1) + ":", "");
}
}
return input;
}
//Emoji manager
private static Map<String, String> emoji = new HashMap<>();
public static void fillMapEmoji(Context context) {
// here comes file reading code with loop
try {
BufferedReader br = new BufferedReader(new InputStreamReader(context.getAssets().open("emoji.csv")));
String line;
while( (line = br.readLine()) != null) {
String str[] = line.split(",");
String unicode = null;
if(str.length == 4)
unicode = new String(new int[] {Integer.parseInt(str[1].replace("0x","").trim(), 16)},Integer.parseInt(str[2].trim()),Integer.parseInt(str[3].trim()));
else if(str.length == 5)
unicode = new String(new int[] {Integer.parseInt(str[1].replace("0x","").trim(), 16), Integer.parseInt(str[2].replace("0x","").trim(), 16)},Integer.parseInt(str[3].trim()), Integer.parseInt(str[4].trim()));
else if(str.length == 6)
unicode = new String(new int[] {Integer.parseInt(str[1].replace("0x","").trim(), 16), Integer.parseInt(str[2].replace("0x","").trim(), 16), Integer.parseInt(str[3].replace("0x","").trim(), 16)}, Integer.parseInt(str[4].trim()), Integer.parseInt(str[5].trim()));
else if(str.length == 7)
unicode = new String(new int[] {Integer.parseInt(str[1].replace("0x","").trim(), 16), Integer.parseInt(str[2].replace("0x","").trim(), 16), Integer.parseInt(str[3].replace("0x","").trim(), 16), Integer.parseInt(str[4].replace("0x","").trim(), 16)}, Integer.parseInt(str[5].trim()),Integer.parseInt(str[6].trim()));
if( unicode != null)
emoji.put(str[0],unicode);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/***
* Check if the user is connected to Internet
* @return boolean