diff --git a/app/build.gradle b/app/build.gradle index a346f2fe7..5c560aa2b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,8 +7,8 @@ android { applicationId "fr.gouv.etalab.mastodon" minSdkVersion 15 targetSdkVersion 25 - versionCode 44 - versionName "1.4.4" + versionCode 45 + versionName "1.4.5" } buildTypes { release { diff --git a/app/mastodon-etalab-v1.4.5.apk b/app/mastodon-etalab-v1.4.5.apk new file mode 100644 index 000000000..54ae7d1f0 Binary files /dev/null and b/app/mastodon-etalab-v1.4.5.apk differ diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/InstanceActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/InstanceActivity.java index 70b5017fc..83f922e86 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/InstanceActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/InstanceActivity.java @@ -105,7 +105,7 @@ public class InstanceActivity extends AppCompatActivity implements OnRetrieveIns instance_title.setText(instance.getTitle()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - instance_description.setText(Html.fromHtml(instance.getDescription(), Html.FROM_HTML_MODE_COMPACT)); + instance_description.setText(Html.fromHtml(instance.getDescription(), Html.FROM_HTML_MODE_LEGACY)); else //noinspection deprecation instance_description.setText(Html.fromHtml(instance.getDescription())); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/MainActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/MainActivity.java index 84e2fac5a..1d2f7628a 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/MainActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/MainActivity.java @@ -19,6 +19,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; +import android.graphics.PorterDuff; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.NonNull; @@ -26,6 +27,7 @@ import android.support.design.widget.FloatingActionButton; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; +import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewPager; import android.support.v7.app.AlertDialog; import android.support.v7.widget.SearchView; @@ -132,17 +134,7 @@ public class MainActivity extends AppCompatActivity finish(); return; } - if( theme == Helper.THEME_DARK){ - changeDrawableColor(getApplicationContext(), R.drawable.ic_action_home_tl,R.color.dark_text); - changeDrawableColor(getApplicationContext(), R.drawable.ic_action_users_tl,R.color.dark_text); - changeDrawableColor(getApplicationContext(), R.drawable.ic_action_globe_tl,R.color.dark_text); - changeDrawableColor(getApplicationContext(), R.drawable.ic_notifications_tl,R.color.dark_text); - }else { - changeDrawableColor(getApplicationContext(), R.drawable.ic_action_home_tl,R.color.black); - changeDrawableColor(getApplicationContext(), R.drawable.ic_action_users_tl,R.color.black); - changeDrawableColor(getApplicationContext(), R.drawable.ic_action_globe_tl,R.color.black); - changeDrawableColor(getApplicationContext(), R.drawable.ic_notifications_tl,R.color.black); - } + Helper.fillMapEmoji(getApplicationContext()); //Here, the user is authenticated Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); @@ -227,7 +219,15 @@ public class MainActivity extends AppCompatActivity } }); - + if( theme == Helper.THEME_DARK){ + for(int i = 0 ; i < 4 ; i++) + if( tabLayout.getTabAt(i) != null && tabLayout.getTabAt(i).getIcon() != null) + tabLayout.getTabAt(i).getIcon().setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.dark_text), PorterDuff.Mode.SRC_IN); + }else { + for(int i = 0 ; i < 4 ; i++) + if( tabLayout.getTabAt(i) != null && tabLayout.getTabAt(i).getIcon() != null) + tabLayout.getTabAt(i).getIcon().setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.black), PorterDuff.Mode.SRC_IN); + } toolbar_search.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override @@ -533,7 +533,7 @@ public class MainActivity extends AppCompatActivity } } final float finalCacheSize = cacheSize; - builder.setMessage(getString(R.string.cache_message, String.format("%s Mo", String.format(Locale.getDefault(), "%.2f", cacheSize)))) + builder.setMessage(getString(R.string.cache_message, String.format("%s %s", String.format(Locale.getDefault(), "%.2f", cacheSize), getString(R.string.cache_units)))) .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // continue with delete @@ -544,7 +544,7 @@ public class MainActivity extends AppCompatActivity Helper.deleteDir(dir); } } catch (Exception ignored) {} - Toast.makeText(MainActivity.this, getString(R.string.toast_cache_clear,String.format("%s Mo", String.format(Locale.getDefault(), "%.2f", finalCacheSize))), Toast.LENGTH_LONG).show(); + Toast.makeText(MainActivity.this, getString(R.string.toast_cache_clear,String.format("%s %s", String.format(Locale.getDefault(), "%.2f", finalCacheSize), getString(R.string.cache_units))), Toast.LENGTH_LONG).show(); dialog.dismiss(); } }) 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 17bc2d870..9fb7467aa 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 @@ -17,11 +17,9 @@ package fr.gouv.etalab.mastodon.activities; import android.app.Activity; import android.app.AlertDialog; import android.content.ActivityNotFoundException; -import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; -import android.content.IntentFilter; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; @@ -30,10 +28,10 @@ import android.graphics.drawable.BitmapDrawable; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; +import android.os.Handler; import android.speech.RecognizerIntent; import android.support.design.widget.FloatingActionButton; import android.support.v4.content.ContextCompat; -import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.text.Editable; @@ -48,6 +46,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.inputmethod.InputMethodManager; +import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.Button; @@ -60,7 +59,6 @@ import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; -import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.TimePicker; import android.widget.Toast; @@ -134,9 +132,7 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc private Button toot_it; private AutoCompleteTextView toot_content; private EditText toot_cw_content; - private TextView toot_reply_content; - private RelativeLayout toot_reply_content_container; - private BroadcastReceiver search_validate; + private LinearLayout toot_reply_content_container; private Status tootReply = null; private String sharedContent, sharedSubject; private CheckBox toot_sensitive; @@ -148,6 +144,8 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc private Toast mToast; private LinearLayout drawer_layout; private HorizontalScrollView picture_scrollview; + private int currentCursorPosition, searchLength; + private boolean canDisplayMessage; @Override protected void onCreate(Bundle savedInstanceState) { @@ -182,7 +180,7 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc pp_progress = (ProgressBar) actionBar.getCustomView().findViewById(R.id.pp_progress); } - + canDisplayMessage = true; //By default the toot is not restored so the id -1 is defined @@ -209,8 +207,7 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc toot_picture_container = (LinearLayout) findViewById(R.id.toot_picture_container); toot_content = (AutoCompleteTextView) findViewById(R.id.toot_content); toot_cw_content = (EditText) findViewById(R.id.toot_cw_content); - toot_reply_content = (TextView) findViewById(R.id.toot_reply_content); - toot_reply_content_container = (RelativeLayout) findViewById(R.id.toot_reply_content_container); + toot_reply_content_container = (LinearLayout) findViewById(R.id.toot_reply_content_container); picture_scrollview = (HorizontalScrollView) findViewById(R.id.picture_scrollview); toot_sensitive = (CheckBox) findViewById(R.id.toot_sensitive); //search_small_container = (LinearLayout) findViewById(R.id.search_small_container); @@ -291,46 +288,9 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc int charsInToot = 0; maxChar = 500; - //Register LocalBroadcast to receive selected accounts after search - search_validate = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - String acct = intent.getStringExtra("acct"); - if( acct != null){ - acct = "@" + acct; - String content = toot_content.getText().toString(); - String[] splitContent = content.split("@"); - String newContent = ""; - for(int i = 0 ; i < (splitContent.length -1) ; i++){ - newContent += splitContent[i]; - } - newContent += acct + " "; - toot_content.setText(newContent); - toot_content.setSelection(toot_content.getText().length()); - } - // manageShowUsers(searchAction.CLOSE, false); - } - }; - LocalBroadcastManager.getInstance(this).registerReceiver(search_validate, new IntentFilter(Helper.SEARCH_VALIDATE_ACCOUNT)); - boolean isAccountPrivate = account.isLocked(); - FloatingActionButton ic_close = (FloatingActionButton) findViewById(R.id.toot_close_reply); - - /*toot_close_accounts.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - manageShowUsers(searchAction.CLOSE, true); - } - }); -*/ - ic_close.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - toot_reply_content_container.setVisibility(View.GONE); - } - }); if(isAccountPrivate){ visibility = "private"; @@ -435,29 +395,42 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc }); String pattern = "^(.|\\s)*(@([a-zA-Z0-9_]{2,}))$"; final Pattern sPattern = Pattern.compile(pattern); + toot_content.addTextChangedListener(new TextWatcher() { @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) {} + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } @Override - public void onTextChanged(CharSequence s, int start, int before, int count) {} + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } @Override public void afterTextChanged(Editable s) { - int length; - //Only check last 20 characters to avoid lags - if( s.toString().length() < 20 ){ //Less than 20 characters are written - length = s.toString().length(); + if( toot_content.getSelectionStart() != 0) + currentCursorPosition = toot_content.getSelectionStart(); + if( s.toString().length() == 0 ) + currentCursorPosition = 0; + //Only check last 15 characters before cursor position to avoid lags + if( currentCursorPosition < 15 ){ //Less than 15 characters are written before the cursor position + searchLength = currentCursorPosition; }else { - length = 20; + searchLength = 15; } - Matcher m = sPattern.matcher(s.toString().substring(s.toString().length()- length, s.toString().length())); + if( currentCursorPosition- (searchLength-1) < 0 || currentCursorPosition == 0 || currentCursorPosition > s.toString().length()) + return; + Matcher m; + + if( s.toString().charAt(0) == '@') + m = sPattern.matcher(s.toString().substring(currentCursorPosition- searchLength, currentCursorPosition)); + else + m = sPattern.matcher(s.toString().substring(currentCursorPosition- (searchLength-1), currentCursorPosition)); if(m.matches()) { String search = m.group(3); - if( pp_progress != null && pp_actionBar != null) { + if (pp_progress != null && pp_actionBar != null) { pp_progress.setVisibility(View.VISIBLE); pp_actionBar.setVisibility(View.GONE); } new RetrieveSearchAccountsAsyncTask(getApplicationContext(),search,TootActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - }else{toot_content.dismissDropDown();} int totalChar = toot_cw_content.length() + toot_content.length(); int remainChar = (maxChar - totalChar); @@ -470,8 +443,20 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc } }else { toot_it.setEnabled(false); - showAToast(getString(R.string.toot_no_space)); toot_space_left.setTextColor( Color.RED); + //Delay the advertising message to avoid to flood the user + if( canDisplayMessage ){ + canDisplayMessage = false; + showAToast(getString(R.string.toot_no_space)); + final Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + canDisplayMessage = true; + } + }, 4000); + } + } toot_space_left.setText(String.valueOf(remainChar)); } @@ -762,12 +747,6 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc return true; } - @Override - public void onDestroy(){ - super.onDestroy(); - LocalBroadcastManager.getInstance(this).unregisterReceiver(search_validate); - } - @Override public void onRetrieveAttachment(final Attachment attachment, Error error) { loading_picture.setVisibility(View.GONE); @@ -965,13 +944,44 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc Toast.makeText(getApplicationContext(), apiResponse.getError().getError(),Toast.LENGTH_LONG).show(); return; } - List accounts = apiResponse.getAccounts(); + + final List accounts = apiResponse.getAccounts(); if( accounts != null && accounts.size() > 0){ AccountsSearchAdapter accountsListAdapter = new AccountsSearchAdapter(TootActivity.this, accounts); - toot_content.showDropDown(); - toot_content.setThreshold(0); + toot_content.setThreshold(1); toot_content.setAdapter(accountsListAdapter); + final String oldContent = toot_content.getText().toString(); + String[] searchA = oldContent.substring(0,currentCursorPosition).split("@"); + final String search = searchA[searchA.length-1]; + toot_content.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + Account account = accounts.get(position); + String deltaSearch = ""; + if( currentCursorPosition-searchLength > 0 && currentCursorPosition < oldContent.length() ) + deltaSearch = oldContent.substring(currentCursorPosition-searchLength, currentCursorPosition); + else { + if( currentCursorPosition >= oldContent.length() ) + deltaSearch = oldContent.substring(currentCursorPosition-searchLength, oldContent.length()); + } + + if( !search.equals("")) + deltaSearch = deltaSearch.replace("@"+search,""); + String newContent = oldContent.substring(0,currentCursorPosition-searchLength); + newContent += deltaSearch; + newContent += "@" + account.getAcct() + " "; + int newPosition = newContent.length(); + if( currentCursorPosition < oldContent.length() - 1) + newContent += oldContent.substring(currentCursorPosition, oldContent.length()-1); + toot_content.setText(newContent); + toot_content.setSelection(newPosition); + AccountsSearchAdapter accountsListAdapter = new AccountsSearchAdapter(TootActivity.this, new ArrayList()); + toot_content.setThreshold(1); + toot_content.setAdapter(accountsListAdapter); + } + }); } + } private void restoreToot(long id){ @@ -1078,20 +1088,36 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc else setTitle(R.string.toot_title_reply); String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); - boolean show_reply = sharedpreferences.getBoolean(Helper.SET_SHOW_REPLY, false); - if( show_reply ){ - toot_reply_content_container.setVisibility(View.VISIBLE); - }else { - toot_reply_content_container.setVisibility(View.GONE); - } - String content = tootReply.getContent(); - if(tootReply.getReblog() != null) - content = tootReply.getReblog().getContent(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - toot_reply_content.setText(Html.fromHtml(content, Html.FROM_HTML_MODE_COMPACT)); - else - //noinspection deprecation - toot_reply_content.setText(Html.fromHtml(content)); + + + FloatingActionButton ic_show = (FloatingActionButton) findViewById(R.id.toot_show_reply); + + ic_show.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + AlertDialog.Builder alert = new AlertDialog.Builder(TootActivity.this); + alert.setTitle(R.string.toot_reply_content_title); + final TextView input = new TextView(TootActivity.this); + //Set the padding + input.setPadding(30, 30, 30, 30); + alert.setView(input); + String content = tootReply.getContent(); + if(tootReply.getReblog() != null) + content = tootReply.getReblog().getContent(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) + input.setText(Html.fromHtml(content, Html.FROM_HTML_MODE_LEGACY)); + else + //noinspection deprecation + input.setText(Html.fromHtml(content)); + alert.setPositiveButton(R.string.close, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + dialog.dismiss(); + } + }); + alert.show(); + } + }); + toot_reply_content_container.setVisibility(View.VISIBLE); switch (tootReply.getVisibility()){ case "public": visibility = "public"; @@ -1114,17 +1140,22 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc //If toot is not restored if( restored == -1 ){ //Retrieves mentioned accounts + OP and adds them at the beginin of the toot + ArrayList mentionedAccountsAdded = new ArrayList<>(); if( tootReply.getAccount() != null && tootReply.getAccount().getAcct() != null && !tootReply.getAccount().getId().equals(userId)) { toot_content.setText(String.format("@%s ", tootReply.getAccount().getAcct())); + mentionedAccountsAdded.add(tootReply.getAccount().getAcct()); } if( tootReply.getMentions() != null ){ for(Mention mention : tootReply.getMentions()){ - if( mention.getAcct() != null && !mention.getId().equals(userId)) { + if( mention.getAcct() != null && !mention.getId().equals(userId) && !mentionedAccountsAdded.contains(mention.getAcct())) { + mentionedAccountsAdded.add(mention.getAcct()); String tootTemp = String.format("@%s ", mention.getAcct()); toot_content.setText(String.format("%s ", (toot_content.getText().toString() + " " + tootTemp))); } } } + //Put a dot at the end of all mentioned account to force capitalization + toot_content.setText(String.format("%s. ",toot_content.getText().toString().trim())); toot_content.setSelection(toot_content.getText().length()); //Put cursor at the end } } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveDeveloperAccountsAsyncTask.java b/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveDeveloperAccountsAsyncTask.java index 5a8b1aff5..caa29d57a 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveDeveloperAccountsAsyncTask.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveDeveloperAccountsAsyncTask.java @@ -31,7 +31,6 @@ public class RetrieveDeveloperAccountsAsyncTask extends AsyncTask= Build.VERSION_CODES.N) - holder.account_ds.setText(Html.fromHtml(account.getNote(), Html.FROM_HTML_MODE_COMPACT)); + holder.account_ds.setText(Html.fromHtml(account.getNote(), Html.FROM_HTML_MODE_LEGACY)); else //noinspection deprecation holder.account_ds.setText(Html.fromHtml(account.getNote())); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsSearchAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsSearchAdapter.java index eb168cdc8..d216f216a 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsSearchAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsSearchAdapter.java @@ -16,9 +16,7 @@ package fr.gouv.etalab.mastodon.drawers; import android.content.Context; -import android.content.Intent; -import android.support.annotation.NonNull; -import android.support.v4.content.LocalBroadcastManager; +import android.support.annotation.NonNull;; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -50,7 +48,6 @@ public class AccountsSearchAdapter extends ArrayAdapter implements Filt private LayoutInflater layoutInflater; private ImageLoader imageLoader; private DisplayImageOptions options; - private Context context; public AccountsSearchAdapter(Context context, List accounts){ super(context, android.R.layout.simple_list_item_1, accounts); @@ -59,7 +56,6 @@ public class AccountsSearchAdapter extends ArrayAdapter implements Filt this.suggestions = new ArrayList<>(accounts); layoutInflater = LayoutInflater.from(context); imageLoader = ImageLoader.getInstance(); - this.context = context; options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) .cacheOnDisk(true).resetViewBeforeLoading(true).build(); } @@ -103,14 +99,6 @@ public class AccountsSearchAdapter extends ArrayAdapter implements Filt //Profile picture imageLoader.displayImage(account.getAvatar(), holder.account_pp, options); - holder.account_container.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Intent intent = new Intent(Helper.SEARCH_VALIDATE_ACCOUNT); - intent.putExtra("acct", account.getAcct()); - LocalBroadcastManager.getInstance(context).sendBroadcast(intent); - } - }); return convertView; } @@ -125,7 +113,7 @@ public class AccountsSearchAdapter extends ArrayAdapter implements Filt @Override public CharSequence convertResultToString(Object resultValue) { Account account = (Account) resultValue; - return account.getDisplay_name() + " " + account.getUsername(); + return "@" + account.getAcct(); } @Override @@ -153,8 +141,7 @@ public class AccountsSearchAdapter extends ArrayAdapter implements Filt add(cust); notifyDataSetChanged(); } - } - else{ + } else{ clear(); notifyDataSetChanged(); } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java index a0a8c34b4..9679c6527 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java @@ -449,7 +449,7 @@ public class NotificationsListAdapter extends BaseAdapter implements OnPostActio AlertDialog.Builder builder = new AlertDialog.Builder(context); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - builder.setMessage(Html.fromHtml(status.getContent(), Html.FROM_HTML_MODE_COMPACT)); + builder.setMessage(Html.fromHtml(status.getContent(), Html.FROM_HTML_MODE_LEGACY)); else //noinspection deprecation builder.setMessage(Html.fromHtml(status.getContent())); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/SearchListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/SearchListAdapter.java index 7c6b0acf4..ec8c9875c 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/SearchListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/SearchListAdapter.java @@ -196,7 +196,7 @@ public class SearchListAdapter extends BaseAdapter { } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - holder.status_content.setText(Html.fromHtml(content, Html.FROM_HTML_MODE_COMPACT)); + holder.status_content.setText(Html.fromHtml(content, Html.FROM_HTML_MODE_LEGACY)); else //noinspection deprecation holder.status_content.setText(Html.fromHtml(content)); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java index 0f5b28840..87cfb7493 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java @@ -30,9 +30,13 @@ import android.os.CountDownTimer; import android.support.v4.content.ContextCompat; import android.support.v7.widget.CardView; import android.text.Html; +import android.text.Selection; import android.text.SpannableString; import android.text.method.LinkMovementMethod; +import android.util.Log; +import android.view.ContextMenu; import android.view.LayoutInflater; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.Window; @@ -373,7 +377,10 @@ public class StatusListAdapter extends BaseAdapter implements OnPostActionInterf public void onClick(View v) { Intent intent = new Intent(context, TootActivity.class); Bundle b = new Bundle(); - b.putParcelable("tootReply", status); + if( status.getReblog() != null ) + b.putParcelable("tootReply", status.getReblog()); + else + b.putParcelable("tootReply", status); intent.putExtras(b); //Put your id to your next Intent context.startActivity(intent); if( type == RetrieveFeedsAsyncTask.Type.CONTEXT ){ @@ -386,19 +393,54 @@ public class StatusListAdapter extends BaseAdapter implements OnPostActionInterf } }); - SpannableString spannableString = Helper.clickableElements(context,content, - status.getReblog() != null?status.getReblog().getMentions():status.getMentions()); - holder.status_content.setText(spannableString, TextView.BufferType.SPANNABLE); + if( status.getContent_translated() != null && status.getContent_translated().length() > 0){ SpannableString spannableStringTrans = Helper.clickableElements(context, status.getContent_translated(), status.getReblog() != null?status.getReblog().getMentions():status.getMentions()); holder.status_content_translated.setText(spannableStringTrans, TextView.BufferType.SPANNABLE); - holder.status_content_translated.setMovementMethod(null); + holder.status_content_translated.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + holder.status_content_translated.setFocusableInTouchMode(true); + return false; + } + }); + holder.status_content_translated.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + holder.status_content_translated.setFocusableInTouchMode(false); + holder.status_content_translated.clearFocus(); + } + return false; + } + }); holder.status_content_translated.setMovementMethod(LinkMovementMethod.getInstance()); } - holder.status_content.setMovementMethod(null); + + final SpannableString spannableString = Helper.clickableElements(context,content, + status.getReblog() != null?status.getReblog().getMentions():status.getMentions()); + holder.status_content.setText(spannableString, TextView.BufferType.SPANNABLE); + holder.status_content.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + holder.status_content.setFocusableInTouchMode(true); + return false; + } + }); + holder.status_content.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + holder.status_content.setFocusableInTouchMode(false); + holder.status_content.clearFocus(); + } + return false; + } + }); holder.status_content.setMovementMethod(LinkMovementMethod.getInstance()); + if( status.getReblog() == null) holder.status_favorite_count.setText(String.valueOf(status.getFavourites_count())); else @@ -863,7 +905,7 @@ public class StatusListAdapter extends BaseAdapter implements OnPostActionInterf AlertDialog.Builder builder = new AlertDialog.Builder(context); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - builder.setMessage(Html.fromHtml(status.getContent(), Html.FROM_HTML_MODE_COMPACT)); + builder.setMessage(Html.fromHtml(status.getContent(), Html.FROM_HTML_MODE_LEGACY)); else //noinspection deprecation builder.setMessage(Html.fromHtml(status.getContent())); @@ -929,7 +971,7 @@ public class StatusListAdapter extends BaseAdapter implements OnPostActionInterf if( isOwner) { if( which == 0) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - builderInner.setMessage(Html.fromHtml(status.getContent(), Html.FROM_HTML_MODE_COMPACT)); + builderInner.setMessage(Html.fromHtml(status.getContent(), Html.FROM_HTML_MODE_LEGACY)); else //noinspection deprecation builderInner.setMessage(Html.fromHtml(status.getContent())); @@ -937,7 +979,7 @@ public class StatusListAdapter extends BaseAdapter implements OnPostActionInterf ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); String content; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - content = Html.fromHtml(status.getContent(), Html.FROM_HTML_MODE_COMPACT).toString(); + content = Html.fromHtml(status.getContent(), Html.FROM_HTML_MODE_LEGACY).toString(); else //noinspection deprecation content = Html.fromHtml(status.getContent()).toString(); @@ -959,7 +1001,7 @@ public class StatusListAdapter extends BaseAdapter implements OnPostActionInterf builderInner.setMessage(status.getAccount().getAcct()); }else if( which == 2) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - builderInner.setMessage(Html.fromHtml(status.getContent(), Html.FROM_HTML_MODE_COMPACT)); + builderInner.setMessage(Html.fromHtml(status.getContent(), Html.FROM_HTML_MODE_LEGACY)); else //noinspection deprecation builderInner.setMessage(Html.fromHtml(status.getContent())); @@ -967,7 +1009,7 @@ public class StatusListAdapter extends BaseAdapter implements OnPostActionInterf ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); String content; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - content = Html.fromHtml(status.getContent(), Html.FROM_HTML_MODE_COMPACT).toString(); + content = Html.fromHtml(status.getContent(), Html.FROM_HTML_MODE_LEGACY).toString(); else //noinspection deprecation content = Html.fromHtml(status.getContent()).toString(); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java index 21319c8e8..a7c9da639 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java @@ -23,7 +23,6 @@ import android.os.Parcelable; import android.support.v4.app.Fragment; import android.support.v4.content.LocalBroadcastManager; import android.support.v4.widget.SwipeRefreshLayout; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/SettingsFragment.java b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/SettingsFragment.java index 0804bdc89..26810de9d 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/SettingsFragment.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/SettingsFragment.java @@ -45,7 +45,6 @@ import android.widget.TextView; import android.widget.Toast; import fr.gouv.etalab.mastodon.activities.MainActivity; -import fr.gouv.etalab.mastodon.activities.TootActivity; import fr.gouv.etalab.mastodon.client.Entities.Account; import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.sqlite.AccountDAO; @@ -56,8 +55,6 @@ import static android.app.Activity.RESULT_OK; import static fr.gouv.etalab.mastodon.helper.Helper.CHANGE_THEME_INTENT; import static fr.gouv.etalab.mastodon.helper.Helper.INTENT_ACTION; import static fr.gouv.etalab.mastodon.helper.Helper.changeDrawableColor; -import static fr.gouv.etalab.mastodon.helper.Helper.loadPPInActionBar; -import static fr.gouv.etalab.mastodon.helper.Helper.updateHeaderAccountInfo; /** @@ -79,21 +76,9 @@ public class SettingsFragment extends Fragment { final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - boolean show_reply = sharedpreferences.getBoolean(Helper.SET_SHOW_REPLY, false); + boolean auto_store = sharedpreferences.getBoolean(Helper.SET_AUTO_STORE, true); - final CheckBox set_show_reply = (CheckBox) rootView.findViewById(R.id.set_show_reply); - set_show_reply.setChecked(show_reply); - - set_show_reply.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - SharedPreferences.Editor editor = sharedpreferences.edit(); - editor.putBoolean(Helper.SET_SHOW_REPLY, set_show_reply.isChecked()); - editor.apply(); - } - }); - final CheckBox set_auto_store = (CheckBox) rootView.findViewById(R.id.set_auto_store); set_auto_store.setChecked(auto_store); set_auto_store.setOnClickListener(new View.OnClickListener() { diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/SettingsProfileFragment.java b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/SettingsProfileFragment.java index 213727253..221d4144e 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/SettingsProfileFragment.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/SettingsProfileFragment.java @@ -130,7 +130,7 @@ public class SettingsProfileFragment extends Fragment implements OnRetrieveAccou final String content; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - content = Html.fromHtml(account.getNote(), Html.FROM_HTML_MODE_COMPACT).toString(); + content = Html.fromHtml(account.getNote(), Html.FROM_HTML_MODE_LEGACY).toString(); else //noinspection deprecation content = Html.fromHtml(account.getNote()).toString(); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java b/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java index a7b8f3f91..0dbbb86e4 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java @@ -54,6 +54,7 @@ import android.text.Spanned; import android.text.TextPaint; import android.text.style.ClickableSpan; import android.util.DisplayMetrics; +import android.util.Log; import android.util.Patterns; import android.view.Menu; import android.view.MenuItem; @@ -199,7 +200,6 @@ public class Helper { public static final String SET_WIFI_ONLY = "set_wifi_only"; public static final String SET_NOTIF_HOMETIMELINE = "set_notif_hometimeline"; public static final String SET_NOTIF_SILENT = "set_notif_silent"; - public static final String SET_SHOW_REPLY = "set_show_reply"; public static final String SET_SHOW_ERROR_MESSAGES = "set_show_error_messages"; public static final String SET_EMBEDDED_BROWSER = "set_embedded_browser"; public static final String SET_JAVASCRIPT = "set_javascript"; @@ -1022,7 +1022,7 @@ public class Helper { SpannableString spannableString; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - spannableString = new SpannableString(Html.fromHtml(fullContent, Html.FROM_HTML_MODE_COMPACT)); + spannableString = new SpannableString(Html.fromHtml(fullContent, Html.FROM_HTML_MODE_LEGACY)); else //noinspection deprecation spannableString = new SpannableString(Html.fromHtml(fullContent)); @@ -1067,25 +1067,26 @@ public class Helper { String targetedAccount = "@" + mention.getUsername(); if (spannableString.toString().contains(targetedAccount)) { - int startPosition = spannableString.toString().indexOf(targetedAccount); - int endPosition = spannableString.toString().lastIndexOf(targetedAccount) + targetedAccount.length(); - spannableString.setSpan(new ClickableSpan() { - @Override - public void onClick(View textView) { - Intent intent = new Intent(context, ShowAccountActivity.class); - Bundle b = new Bundle(); - b.putString("accountId", mention.getId()); - intent.putExtras(b); - context.startActivity(intent); - } - @Override - public void updateDrawState(TextPaint ds) { - super.updateDrawState(ds); - } - }, - startPosition, endPosition, - Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - + //Accounts can be mentioned several times so we have to loop + for(int startPosition = -1 ; (startPosition = spannableString.toString().indexOf(targetedAccount, startPosition + 1)) != -1 ; startPosition++){ + int endPosition = startPosition + targetedAccount.length(); + spannableString.setSpan(new ClickableSpan() { + @Override + public void onClick(View textView) { + Intent intent = new Intent(context, ShowAccountActivity.class); + Bundle b = new Bundle(); + b.putString("accountId", mention.getId()); + intent.putExtras(b); + context.startActivity(intent); + } + @Override + public void updateDrawState(TextPaint ds) { + super.updateDrawState(ds); + } + }, + startPosition, endPosition, + Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + } } } @@ -1128,7 +1129,7 @@ public class Helper { SpannableString spannableString; fullContent = Helper.shortnameToUnicode(fullContent, true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - spannableString = new SpannableString(Html.fromHtml(fullContent, Html.FROM_HTML_MODE_COMPACT)); + spannableString = new SpannableString(Html.fromHtml(fullContent, Html.FROM_HTML_MODE_LEGACY)); else //noinspection deprecation spannableString = new SpannableString(Html.fromHtml(fullContent)); diff --git a/app/src/main/res/drawable-hdpi/ic_action_eye_open.png b/app/src/main/res/drawable-hdpi/ic_action_eye_open.png new file mode 100644 index 000000000..5822f5f97 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_eye_open.png differ diff --git a/app/src/main/res/drawable-ldpi/ic_action_eye_open.png b/app/src/main/res/drawable-ldpi/ic_action_eye_open.png new file mode 100644 index 000000000..e441b7854 Binary files /dev/null and b/app/src/main/res/drawable-ldpi/ic_action_eye_open.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_action_eye_open.png b/app/src/main/res/drawable-mdpi/ic_action_eye_open.png new file mode 100644 index 000000000..53a32c497 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_eye_open.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_eye_open.png b/app/src/main/res/drawable-xhdpi/ic_action_eye_open.png new file mode 100644 index 000000000..97dcfee5f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_eye_open.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_eye_open.png b/app/src/main/res/drawable-xxhdpi/ic_action_eye_open.png new file mode 100644 index 000000000..333a69377 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_eye_open.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_eye_open.png b/app/src/main/res/drawable-xxxhdpi/ic_action_eye_open.png new file mode 100644 index 000000000..dc6087386 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_action_eye_open.png differ diff --git a/app/src/main/res/layout-sw600dp/activity_main.xml b/app/src/main/res/layout-sw600dp/activity_main.xml index cacd3ce97..337f0e26e 100644 --- a/app/src/main/res/layout-sw600dp/activity_main.xml +++ b/app/src/main/res/layout-sw600dp/activity_main.xml @@ -32,8 +32,8 @@ - + android:theme="@style/AppTheme.AppBarOverlay" + > - - - + app:srcCompat="@drawable/ic_action_eye_open" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-sw600dp/fragment_settings.xml b/app/src/main/res/layout-sw600dp/fragment_settings.xml index ed1e601d7..49ff79910 100644 --- a/app/src/main/res/layout-sw600dp/fragment_settings.xml +++ b/app/src/main/res/layout-sw600dp/fragment_settings.xml @@ -46,12 +46,6 @@ android:text="@string/set_show_error_messages" android:layout_height="wrap_content" /> - + android:theme="@style/AppTheme.AppBarOverlay" + > - - - + app:srcCompat="@drawable/ic_action_eye_open" /> + - Aucun brouillon ! Choisissez un pouet Supprimer le brouillon ? + Cliquer sur le bouton pour afficher le pouet d\'origine Aucune description ! @@ -327,6 +328,7 @@ Nettoyage du cache Il y a %1$s de données en cache.\n\nSouhaitez-vous les supprimer ? + Mo Le cache a été nettoyé ! %1$s ont été libérés diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 345349bf2..c9cb01da1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -174,6 +174,7 @@ No draft! Choose a toot Remove draft? + Click on the button to display the original toot No description available! @@ -330,7 +331,8 @@ For unread notifications? Clear cache - There are %1$s data in cache.\n\nWould you like to delete them? + There are %1$s of data in cache.\n\nWould you like to delete them? + Mb Cache was cleared! %1$s were released