mirror of
https://github.com/pierre42100/ComunicAndroid
synced 2024-11-27 15:59:29 +00:00
Display search user result
This commit is contained in:
parent
ae5f851101
commit
352627067e
@ -2,12 +2,10 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="org.communiquons.android.comunic.client">
|
package="org.communiquons.android.comunic.client">
|
||||||
|
|
||||||
<!-- Internet access is required to access the API -->
|
<!-- Internet access is required to access the API and download medias -->
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:fullBackupContent="@xml/backup_scheme"
|
android:fullBackupContent="@xml/backup_scheme"
|
||||||
@ -16,6 +14,8 @@
|
|||||||
android:roundIcon="@mipmap/ic_launcher_round"
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/AppTheme">
|
android:theme="@style/AppTheme">
|
||||||
|
|
||||||
|
<!-- Main activity of the application -->
|
||||||
<activity android:name=".MainActivity">
|
<activity android:name=".MainActivity">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
@ -23,8 +23,17 @@
|
|||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<activity android:name=".LoginActivity"
|
|
||||||
android:label="@string/activity_login_header"></activity>
|
<!-- Login activity -->
|
||||||
|
<activity
|
||||||
|
android:name=".LoginActivity"
|
||||||
|
android:label="@string/activity_login_header" />
|
||||||
|
|
||||||
|
<!-- Search user activity -->
|
||||||
|
<activity
|
||||||
|
android:name=".SearchUserActivity"
|
||||||
|
android:label="@string/activity_searchuser_title"/>
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
@ -0,0 +1,132 @@
|
|||||||
|
package org.communiquons.android.comunic.client;
|
||||||
|
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
import android.support.v7.app.AppCompatActivity;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.text.Editable;
|
||||||
|
import android.text.TextWatcher;
|
||||||
|
import android.util.ArrayMap;
|
||||||
|
import android.widget.EditText;
|
||||||
|
import android.widget.ListView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import org.communiquons.android.comunic.client.data.DatabaseHelper;
|
||||||
|
import org.communiquons.android.comunic.client.data.UsersInfo.GetUsersHelper;
|
||||||
|
import org.communiquons.android.comunic.client.data.UsersInfo.UsersBasicAdapter;
|
||||||
|
import org.communiquons.android.comunic.client.data.UsersInfo.UserInfo;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class SearchUserActivity extends AppCompatActivity
|
||||||
|
implements TextWatcher{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Debug tag
|
||||||
|
*/
|
||||||
|
private static final String TAG = "SearchUserActivity";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search field
|
||||||
|
*/
|
||||||
|
private EditText searchField;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Results list
|
||||||
|
*/
|
||||||
|
private ListView resultListView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search result user informations
|
||||||
|
*/
|
||||||
|
private ArrayList<UserInfo> resultArray;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search results adapter
|
||||||
|
*/
|
||||||
|
private UsersBasicAdapter resultAdapter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get user infos helper
|
||||||
|
*/
|
||||||
|
private GetUsersHelper getUsersHelper;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_search_user);
|
||||||
|
|
||||||
|
//Create a get user helper object
|
||||||
|
getUsersHelper = new GetUsersHelper(this, DatabaseHelper.getInstance(this));
|
||||||
|
|
||||||
|
//Get view
|
||||||
|
searchField = (EditText) findViewById(R.id.activity_search_user_field);
|
||||||
|
resultListView = (ListView) findViewById(R.id.activity_search_user_results);
|
||||||
|
|
||||||
|
//Set on key listener
|
||||||
|
searchField.addTextChangedListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
||||||
|
//Do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
||||||
|
//Do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterTextChanged(Editable s) {
|
||||||
|
newSearch(""+searchField.getText());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform a new search on the server
|
||||||
|
*
|
||||||
|
* @param query The query to perform on the server
|
||||||
|
*/
|
||||||
|
private void newSearch(String query){
|
||||||
|
|
||||||
|
//Check if there is a query
|
||||||
|
if(query.equals(""))
|
||||||
|
return; //Cancel the request
|
||||||
|
|
||||||
|
new AsyncTask<String, Void, ArrayMap<Integer, UserInfo>>(){
|
||||||
|
@Override
|
||||||
|
protected ArrayMap<Integer, UserInfo> doInBackground(String... params) {
|
||||||
|
return getUsersHelper.search_users(params[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(ArrayMap<Integer, UserInfo> result) {
|
||||||
|
searchCallback(result);
|
||||||
|
}
|
||||||
|
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, query);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search callback function
|
||||||
|
*
|
||||||
|
* @param result The result of the research
|
||||||
|
*/
|
||||||
|
private void searchCallback(@Nullable ArrayMap<Integer, UserInfo> result){
|
||||||
|
|
||||||
|
//Check for errors
|
||||||
|
if(result == null){
|
||||||
|
Toast.makeText(this, R.string.err_search_user, Toast.LENGTH_SHORT).show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Save the results
|
||||||
|
resultArray = new ArrayList<>(result.values());
|
||||||
|
|
||||||
|
//Display the result
|
||||||
|
resultAdapter = new UsersBasicAdapter(this, resultArray);
|
||||||
|
|
||||||
|
//Set the adapter
|
||||||
|
resultListView.setAdapter(resultAdapter);
|
||||||
|
}
|
||||||
|
}
|
@ -59,7 +59,7 @@ class ImageDownloadRunnable implements Runnable {
|
|||||||
InputStream is = conn.getInputStream();
|
InputStream is = conn.getInputStream();
|
||||||
|
|
||||||
//Process image
|
//Process image
|
||||||
Bitmap image =BitmapFactory.decodeStream(is);
|
Bitmap image = BitmapFactory.decodeStream(is);
|
||||||
image.compress(Bitmap.CompressFormat.PNG, 100, os);
|
image.compress(Bitmap.CompressFormat.PNG, 100, os);
|
||||||
|
|
||||||
os.close();
|
os.close();
|
||||||
|
@ -10,6 +10,7 @@ import org.communiquons.android.comunic.client.api.APIRequest;
|
|||||||
import org.communiquons.android.comunic.client.api.APIRequestParameters;
|
import org.communiquons.android.comunic.client.api.APIRequestParameters;
|
||||||
import org.communiquons.android.comunic.client.api.APIResponse;
|
import org.communiquons.android.comunic.client.api.APIResponse;
|
||||||
import org.communiquons.android.comunic.client.data.DatabaseHelper;
|
import org.communiquons.android.comunic.client.data.DatabaseHelper;
|
||||||
|
import org.json.JSONArray;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
@ -155,6 +156,57 @@ public class GetUsersHelper {
|
|||||||
return usersInfo;
|
return usersInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search for user from online source
|
||||||
|
*
|
||||||
|
* @param query The query string
|
||||||
|
* @return A list of users / false in case of failure
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public ArrayMap<Integer, UserInfo> search_users(String query){
|
||||||
|
|
||||||
|
//Fetch users online
|
||||||
|
ArrayList<Integer> usersID = search_users_online(query);
|
||||||
|
|
||||||
|
//Check for errors
|
||||||
|
if(usersID == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return getMultiple(usersID);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search for users on the API
|
||||||
|
*
|
||||||
|
* @param query The query of the research
|
||||||
|
* @return The ID of the corresponding users / false in case of failure
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
private ArrayList<Integer> search_users_online(String query){
|
||||||
|
|
||||||
|
//Make an API request
|
||||||
|
APIRequestParameters params = new APIRequestParameters(mContext, "search/user");
|
||||||
|
params.addParameter("query", query);
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
//Get and extract the response
|
||||||
|
APIResponse response = new APIRequest().exec(params);
|
||||||
|
JSONArray array = response.getJSONArray();
|
||||||
|
|
||||||
|
//Make response
|
||||||
|
ArrayList<Integer> IDs = new ArrayList<>();
|
||||||
|
for(int i = 0; i < array.length(); i++){
|
||||||
|
IDs.add(array.getInt(i));
|
||||||
|
}
|
||||||
|
return IDs;
|
||||||
|
|
||||||
|
} catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get and return the information about multiple users from the server
|
* Get and return the information about multiple users from the server
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package org.communiquons.android.comunic.client.data.UsersInfo;
|
package org.communiquons.android.comunic.client.data.UsersInfo;
|
||||||
|
|
||||||
|
import org.communiquons.android.comunic.client.data.utils.Utilities;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class contains the informations about a single user
|
* This class contains the informations about a single user
|
||||||
*
|
*
|
||||||
@ -80,6 +82,15 @@ public class UserInfo {
|
|||||||
return firstName + " " + lastName;
|
return firstName + " " + lastName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the full name of the user ready to be shown
|
||||||
|
*
|
||||||
|
* @return The full name of the user
|
||||||
|
*/
|
||||||
|
public String getDisplayFullName(){
|
||||||
|
return Utilities.prepareStringTextView(getFullName());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the image URL of the account of the user
|
* Set the image URL of the account of the user
|
||||||
*
|
*
|
||||||
|
@ -0,0 +1,69 @@
|
|||||||
|
package org.communiquons.android.comunic.client.data.UsersInfo;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ArrayAdapter;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import org.communiquons.android.comunic.client.R;
|
||||||
|
import org.communiquons.android.comunic.client.data.ImageLoad.ImageLoadManager;
|
||||||
|
import org.communiquons.android.comunic.client.data.utils.UiUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.zip.Inflater;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User basic adapter
|
||||||
|
*
|
||||||
|
* Allow to display basic informations about a set of users in a ListView
|
||||||
|
*
|
||||||
|
* @author Pierre HUBERT
|
||||||
|
* Created by pierre on 1/1/18.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class UsersBasicAdapter extends ArrayAdapter<UserInfo> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Public constructor
|
||||||
|
*
|
||||||
|
* @param context The context of the activity
|
||||||
|
* @param list The dataset
|
||||||
|
*/
|
||||||
|
public UsersBasicAdapter(@NonNull Context context, @NonNull ArrayList<UserInfo> list){
|
||||||
|
super(context, 0, list);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
|
||||||
|
|
||||||
|
//Check if the view has to be inflated
|
||||||
|
if(convertView == null)
|
||||||
|
convertView = LayoutInflater.from(getContext()).
|
||||||
|
inflate(R.layout.user_basic_adapter_item, parent, false);
|
||||||
|
|
||||||
|
//Get item
|
||||||
|
UserInfo userInfos = getItem(position);
|
||||||
|
|
||||||
|
if(userInfos != null){
|
||||||
|
|
||||||
|
//Set user name
|
||||||
|
((TextView) convertView.findViewById(R.id.user_name)).
|
||||||
|
setText(userInfos.getDisplayFullName());
|
||||||
|
|
||||||
|
//Set account image
|
||||||
|
ImageView account_image = convertView.findViewById(R.id.user_account_image);
|
||||||
|
ImageLoadManager.remove(account_image);
|
||||||
|
account_image.setImageDrawable(UiUtils.getDrawable(getContext(),
|
||||||
|
R.drawable.default_account_image));
|
||||||
|
ImageLoadManager.load(getContext(), userInfos.getAcountImageURL(), account_image);
|
||||||
|
}
|
||||||
|
|
||||||
|
return convertView;
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
package org.communiquons.android.comunic.client.data.utils;
|
package org.communiquons.android.comunic.client.data.utils;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -28,4 +29,14 @@ public class UiUtils {
|
|||||||
return context.getResources().getColor(color_id);
|
return context.getResources().getColor(color_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a drawable from ressources
|
||||||
|
*
|
||||||
|
* @param context The context of the application
|
||||||
|
* @param drawable_id The ID of the drawable to get
|
||||||
|
*/
|
||||||
|
public static Drawable getDrawable(Context context, int drawable_id){
|
||||||
|
return context.getResources().getDrawable(drawable_id, context.getTheme());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package org.communiquons.android.comunic.client.fragments;
|
package org.communiquons.android.comunic.client.fragments;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
import android.app.Fragment;
|
import android.app.Fragment;
|
||||||
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
@ -10,9 +12,11 @@ import android.widget.Button;
|
|||||||
import android.widget.CheckBox;
|
import android.widget.CheckBox;
|
||||||
import android.widget.ListView;
|
import android.widget.ListView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import org.communiquons.android.comunic.client.MainActivity;
|
import org.communiquons.android.comunic.client.MainActivity;
|
||||||
import org.communiquons.android.comunic.client.R;
|
import org.communiquons.android.comunic.client.R;
|
||||||
|
import org.communiquons.android.comunic.client.SearchUserActivity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create and / or update a conversation fragment
|
* Create and / or update a conversation fragment
|
||||||
@ -23,6 +27,16 @@ import org.communiquons.android.comunic.client.R;
|
|||||||
|
|
||||||
public class UpdateConversationFragment extends Fragment {
|
public class UpdateConversationFragment extends Fragment {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Debug tag
|
||||||
|
*/
|
||||||
|
private static final String TAG = "UpdateConversationFragment";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find user ID intent
|
||||||
|
*/
|
||||||
|
public static final int FIND_USER_ID_INTENT = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The name of the conversation
|
* The name of the conversation
|
||||||
*/
|
*/
|
||||||
@ -89,6 +103,19 @@ public class UpdateConversationFragment extends Fragment {
|
|||||||
*/
|
*/
|
||||||
private void requestAddMember(){
|
private void requestAddMember(){
|
||||||
|
|
||||||
|
//Make intent
|
||||||
|
Intent intent = new Intent(getActivity(), SearchUserActivity.class);
|
||||||
|
startActivityForResult(intent, FIND_USER_ID_INTENT);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
|
super.onActivityResult(requestCode, resultCode, data);
|
||||||
|
|
||||||
|
//Check if it is a success
|
||||||
|
if(resultCode == Activity.RESULT_OK){
|
||||||
|
Toast.makeText(getActivity(), "Request success", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
28
app/src/main/res/layout/activity_search_user.xml
Normal file
28
app/src/main/res/layout/activity_search_user.xml
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<!-- Enter user name -->
|
||||||
|
<android.support.design.widget.TextInputLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/activity_search_user_field"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="@string/activity_searchuser_text_placeholder"
|
||||||
|
android:maxLines="1"/>
|
||||||
|
|
||||||
|
</android.support.design.widget.TextInputLayout>
|
||||||
|
|
||||||
|
<!-- Results list -->
|
||||||
|
<ListView
|
||||||
|
android:id="@+id/activity_search_user_results"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
23
app/src/main/res/layout/user_basic_adapter_item.xml
Normal file
23
app/src/main/res/layout/user_basic_adapter_item.xml
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/user_account_image"
|
||||||
|
android:layout_width="@dimen/account_image_default_width"
|
||||||
|
android:layout_height="@dimen/account_image_default_height"
|
||||||
|
android:src="@drawable/default_account_image" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/user_name"
|
||||||
|
style="?textAppearanceListItem"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
tools:text="User name"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:paddingStart="5dp"
|
||||||
|
android:paddingEnd="1dp"/>
|
||||||
|
</LinearLayout>
|
@ -79,4 +79,7 @@
|
|||||||
<string name="fragment_update_conversation_button_create">Create</string>
|
<string name="fragment_update_conversation_button_create">Create</string>
|
||||||
<string name="fragment_update_conversation_follow">Follow the conversation</string>
|
<string name="fragment_update_conversation_follow">Follow the conversation</string>
|
||||||
<string name="fragment_update_conversation_addmember">Add a member</string>
|
<string name="fragment_update_conversation_addmember">Add a member</string>
|
||||||
|
<string name="activity_searchuser_title">Search user</string>
|
||||||
|
<string name="activity_searchuser_text_placeholder">User name</string>
|
||||||
|
<string name="err_search_user">Could not search user !</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
Loading…
Reference in New Issue
Block a user