Improvement of the autocomplete - 1

This commit is contained in:
tom79 2017-08-09 18:27:03 +02:00
parent dd9bcee721
commit 08aed22ec8
5 changed files with 49 additions and 24 deletions

View File

@ -128,7 +128,7 @@ public class AboutActivity extends AppCompatActivity implements OnRetrieveSearcA
} }
@Override @Override
public void onRetrieveSearchAccounts(APIResponse apiResponse) { public void onRetrieveSearchAccounts(APIResponse apiResponse, String search) {
about_developer.setEnabled(true); about_developer.setEnabled(true);
final List<Account> accounts = apiResponse.getAccounts(); final List<Account> accounts = apiResponse.getAccounts();
if( accounts != null && accounts.size() > 0 && accounts.get(0) != null) { if( accounts != null && accounts.size() > 0 && accounts.get(0) != null) {

View File

@ -28,6 +28,7 @@ import android.graphics.drawable.BitmapDrawable;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.speech.RecognizerIntent; import android.speech.RecognizerIntent;
import android.support.design.widget.FloatingActionButton; import android.support.design.widget.FloatingActionButton;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
@ -36,6 +37,7 @@ import android.support.v7.app.AppCompatActivity;
import android.text.Editable; import android.text.Editable;
import android.text.Html; import android.text.Html;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
@ -142,7 +144,8 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc
private Toast mToast; private Toast mToast;
private LinearLayout drawer_layout; private LinearLayout drawer_layout;
private HorizontalScrollView picture_scrollview; private HorizontalScrollView picture_scrollview;
private String search; private int currentCursorPosition, searchLength;
private boolean canDisplayMessage;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -177,7 +180,7 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc
pp_progress = (ProgressBar) actionBar.getCustomView().findViewById(R.id.pp_progress); 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 //By default the toot is not restored so the id -1 is defined
@ -392,6 +395,7 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc
}); });
String pattern = "^(.|\\s)*(@([a-zA-Z0-9_]{2,}))$"; String pattern = "^(.|\\s)*(@([a-zA-Z0-9_]{2,}))$";
final Pattern sPattern = Pattern.compile(pattern); final Pattern sPattern = Pattern.compile(pattern);
toot_content.addTextChangedListener(new TextWatcher() { toot_content.addTextChangedListener(new TextWatcher() {
@Override @Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {} public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@ -399,22 +403,24 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc
public void onTextChanged(CharSequence s, int start, int before, int count) {} public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override @Override
public void afterTextChanged(Editable s) { public void afterTextChanged(Editable s) {
int length; if( toot_content.getSelectionStart() > 0 )
//Only check last 20 characters to avoid lags currentCursorPosition = toot_content.getSelectionStart();
if( s.toString().length() < 20 ){ //Less than 20 characters are written else if( toot_content.getText().length() == 0)
length = s.toString().length(); 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 { }else {
length = 20; searchLength = 15;
} }
Matcher m = sPattern.matcher(s.toString().substring(s.toString().length()- length, s.toString().length())); Matcher m = sPattern.matcher(s.toString().substring(currentCursorPosition- searchLength, currentCursorPosition));
if(m.matches()) { if(m.matches()) {
search = m.group(3); 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_progress.setVisibility(View.VISIBLE);
pp_actionBar.setVisibility(View.GONE); pp_actionBar.setVisibility(View.GONE);
} }
new RetrieveSearchAccountsAsyncTask(getApplicationContext(),search,TootActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); new RetrieveSearchAccountsAsyncTask(getApplicationContext(),search,TootActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}else{toot_content.dismissDropDown();} }else{toot_content.dismissDropDown();}
int totalChar = toot_cw_content.length() + toot_content.length(); int totalChar = toot_cw_content.length() + toot_content.length();
int remainChar = (maxChar - totalChar); int remainChar = (maxChar - totalChar);
@ -427,8 +433,20 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc
} }
}else { }else {
toot_it.setEnabled(false); toot_it.setEnabled(false);
showAToast(getString(R.string.toot_no_space));
toot_space_left.setTextColor( Color.RED); 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)); toot_space_left.setText(String.valueOf(remainChar));
} }
@ -445,6 +463,7 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc
break; break;
} }
} }
currentCursorPosition = toot_content.getOffsetForPosition(event.getX(), event.getY());
return false; return false;
} }
}); });
@ -904,7 +923,7 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc
} }
@Override @Override
public void onRetrieveSearchAccounts(APIResponse apiResponse) { public void onRetrieveSearchAccounts(APIResponse apiResponse, final String search) {
if( pp_progress != null && pp_actionBar != null) { if( pp_progress != null && pp_actionBar != null) {
pp_progress.setVisibility(View.GONE); pp_progress.setVisibility(View.GONE);
pp_actionBar.setVisibility(View.VISIBLE); pp_actionBar.setVisibility(View.VISIBLE);
@ -923,13 +942,22 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc
toot_content.showDropDown(); toot_content.showDropDown();
toot_content.setThreshold(0); toot_content.setThreshold(0);
toot_content.setAdapter(accountsListAdapter); toot_content.setAdapter(accountsListAdapter);
final String toot_content_str = toot_content.getText().toString().replace("@"+search,""); final String oldContent = toot_content.getText().toString();
toot_content.setOnItemClickListener(new AdapterView.OnItemClickListener() { toot_content.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Account account = accounts.get(position); Account account = accounts.get(position);
toot_content.setText(toot_content_str + " @" + account.getAcct() + " "); String deltaSearch = oldContent.substring(currentCursorPosition-searchLength, currentCursorPosition);
toot_content.setSelection(toot_content.getText().length()-1); deltaSearch = deltaSearch.replace("@"+search,"");
String newContent = oldContent.substring(0,currentCursorPosition-searchLength);
newContent += deltaSearch;
newContent += "@" + account.getAcct() + " ";
int newPosition = newContent.length() -1;
if( currentCursorPosition < oldContent.length() - 1)
newContent += oldContent.substring(currentCursorPosition, oldContent.length()-1);
toot_content.setText(newContent);
toot_content.setSelection(newPosition);
toot_content.dismissDropDown(); toot_content.dismissDropDown();
} }
}); });
@ -1049,8 +1077,6 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc
ic_show.setOnClickListener(new View.OnClickListener() { ic_show.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
AlertDialog.Builder alert = new AlertDialog.Builder(TootActivity.this); AlertDialog.Builder alert = new AlertDialog.Builder(TootActivity.this);
alert.setTitle(R.string.toot_reply_content_title); alert.setTitle(R.string.toot_reply_content_title);
final TextView input = new TextView(TootActivity.this); final TextView input = new TextView(TootActivity.this);

View File

@ -31,7 +31,6 @@ public class RetrieveDeveloperAccountsAsyncTask extends AsyncTask<Void, Void, Vo
private Context context; private Context context;
private APIResponse apiResponse; private APIResponse apiResponse;
private OnRetrieveSearcAccountshInterface listener; private OnRetrieveSearcAccountshInterface listener;
private API api;
public RetrieveDeveloperAccountsAsyncTask(Context context, OnRetrieveSearcAccountshInterface onRetrieveSearcAccountshInterface){ public RetrieveDeveloperAccountsAsyncTask(Context context, OnRetrieveSearcAccountshInterface onRetrieveSearcAccountshInterface){
this.context = context; this.context = context;
@ -40,13 +39,13 @@ public class RetrieveDeveloperAccountsAsyncTask extends AsyncTask<Void, Void, Vo
@Override @Override
protected Void doInBackground(Void... params) { protected Void doInBackground(Void... params) {
api = new API(context); API api = new API(context);
apiResponse = api.searchDeveloper(); apiResponse = api.searchDeveloper();
return null; return null;
} }
@Override @Override
protected void onPostExecute(Void result) { protected void onPostExecute(Void result) {
listener.onRetrieveSearchAccounts(apiResponse); listener.onRetrieveSearchAccounts(apiResponse, null);
} }
} }

View File

@ -49,7 +49,7 @@ public class RetrieveSearchAccountsAsyncTask extends AsyncTask<Void, Void, Void>
@Override @Override
protected void onPostExecute(Void result) { protected void onPostExecute(Void result) {
listener.onRetrieveSearchAccounts(apiResponse); listener.onRetrieveSearchAccounts(apiResponse, query);
} }
} }

View File

@ -22,5 +22,5 @@ import fr.gouv.etalab.mastodon.client.APIResponse;
* Interface for search accounts * Interface for search accounts
*/ */
public interface OnRetrieveSearcAccountshInterface { public interface OnRetrieveSearcAccountshInterface {
void onRetrieveSearchAccounts(APIResponse apiResponse); void onRetrieveSearchAccounts(APIResponse apiResponse, String shearch);
} }