Can create private conversations from friends list

This commit is contained in:
Pierre 2018-01-07 15:06:17 +01:00
parent 00de759caf
commit f5c8232b14
7 changed files with 153 additions and 0 deletions

View File

@ -4,10 +4,13 @@ import android.app.AlertDialog;
import android.app.FragmentTransaction; import android.app.FragmentTransaction;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.BottomNavigationView; import android.support.design.widget.BottomNavigationView;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.widget.Toast; import android.widget.Toast;
@ -18,6 +21,7 @@ import org.communiquons.android.comunic.client.data.Account.AccountUtils;
import org.communiquons.android.comunic.client.data.DatabaseHelper; import org.communiquons.android.comunic.client.data.DatabaseHelper;
import org.communiquons.android.comunic.client.data.conversations.ConversationsListHelper; import org.communiquons.android.comunic.client.data.conversations.ConversationsListHelper;
import org.communiquons.android.comunic.client.data.friendsList.FriendRefreshLoopRunnable; import org.communiquons.android.comunic.client.data.friendsList.FriendRefreshLoopRunnable;
import org.communiquons.android.comunic.client.data.utils.UiUtils;
import org.communiquons.android.comunic.client.fragments.ConversationFragment; import org.communiquons.android.comunic.client.fragments.ConversationFragment;
import org.communiquons.android.comunic.client.fragments.ConversationsListFragment; import org.communiquons.android.comunic.client.fragments.ConversationsListFragment;
import org.communiquons.android.comunic.client.fragments.FriendsListFragment; import org.communiquons.android.comunic.client.fragments.FriendsListFragment;
@ -34,6 +38,11 @@ public class MainActivity extends AppCompatActivity
implements ConversationsListHelper.openConversationListener, implements ConversationsListHelper.openConversationListener,
ConversationsListHelper.updateConversationListener { ConversationsListHelper.updateConversationListener {
/**
* Debug tag
*/
private static final String TAG = "MainActivity";
/** /**
* Account object * Account object
*/ */
@ -54,6 +63,11 @@ public class MainActivity extends AppCompatActivity
*/ */
private DatabaseHelper dbHelper; private DatabaseHelper dbHelper;
/**
* Conversations list helper
*/
private ConversationsListHelper conversationsListHelper;
/** /**
* Bottom navigation view * Bottom navigation view
*/ */
@ -87,6 +101,9 @@ public class MainActivity extends AppCompatActivity
//Initialize DatabaseHelper //Initialize DatabaseHelper
dbHelper = DatabaseHelper.getInstance(this); dbHelper = DatabaseHelper.getInstance(this);
//Intialize conversation list helper
conversationsListHelper = new ConversationsListHelper(this, dbHelper);
//If it is the first time the application is launched, start the user friends tab //If it is the first time the application is launched, start the user friends tab
if(savedInstanceState == null){ if(savedInstanceState == null){
openFriendsFragment(); openFriendsFragment();
@ -279,6 +296,37 @@ public class MainActivity extends AppCompatActivity
} }
@Override
public void openPrivateConversation(int userID) {
//Log action
Log.v(TAG, "Open private conversation with user ID " + userID);
//Create a loading dialog
final AlertDialog dialog = UiUtils.create_loading_dialog(this);
//Get conversation ID in the background
new AsyncTask<Integer, Void, Integer>(){
@Override
protected Integer doInBackground(Integer... params) {
return conversationsListHelper.getPrivate(params[0], true);
}
@Override
protected void onPostExecute(@Nullable Integer integer) {
//Close loading dialog
dialog.dismiss();
if(integer != null)
openConversation(integer);
else
Toast.makeText(MainActivity.this, R.string.err_get_private_conversation,
Toast.LENGTH_SHORT).show();
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, userID);
}
@Override @Override
public void createConversation() { public void createConversation() {
updateConversation(0); updateConversation(0);

View File

@ -103,6 +103,49 @@ public class ConversationsListHelper {
return downloadSingle(convID); return downloadSingle(convID);
} }
/**
* Search and return the ID of a private conversation with a specified user
*
* @param userID The ID of the target user
* @param allowCreate If set to true, then if the server does not find any matching conversation,
* it will automatically create a new one
* @return The ID of the conversation or null in case of failure
*/
@Nullable
public Integer getPrivate(int userID, boolean allowCreate){
//Prepare an API request
APIRequestParameters params = new APIRequestParameters(mContext,
"conversations/getPrivate");
params.addParameter("otherUser", userID);
params.addParameter("allowCreate", allowCreate);
//Try to perform request
try {
APIResponse response = new APIRequest().exec(params);
JSONObject object = response.getJSONObject();
//Check for conversations ID
if(!object.has("conversationsID"))
return null;
//Get conversations ID
JSONArray conversations = object.getJSONArray("conversationsID");
//Check if the array is empty
if(conversations.length() == 0)
return null;
else
return conversations.getInt(0);
}
//Catch errors
catch (Exception e) {
e.printStackTrace();
return null;
}
}
/** /**
* Get the display name of a conversation * Get the display name of a conversation
* *

View File

@ -1,9 +1,12 @@
package org.communiquons.android.comunic.client.data.utils; package org.communiquons.android.comunic.client.data.utils;
import android.app.AlertDialog;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Build; import android.os.Build;
import org.communiquons.android.comunic.client.R;
/** /**
* User Interface utilities * User Interface utilities
* *
@ -39,4 +42,23 @@ public class UiUtils {
public static Drawable getDrawable(Context context, int drawable_id){ public static Drawable getDrawable(Context context, int drawable_id){
return context.getResources().getDrawable(drawable_id, context.getTheme()); return context.getResources().getDrawable(drawable_id, context.getTheme());
} }
/**
* Create and display a loading dialog
*
* Use dismiss() to close this dialog
*
* @param context The context of the application
* @return The created alert dialog
*/
public static AlertDialog create_loading_dialog(Context context){
//Create alert dialog
AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setView(R.layout.dialog_loading);
//Display the dialog
return builder.show();
}
} }

View File

@ -101,6 +101,16 @@ public class FriendsListFragment extends Fragment {
//Create get user helper //Create get user helper
usersHelper = new GetUsersHelper(mContext, mDbHelper); usersHelper = new GetUsersHelper(mContext, mDbHelper);
//Cast activity to convOpener
try {
convOpener = (ConversationsListHelper.openConversationListener) getActivity();
} catch (ClassCastException e){
e.printStackTrace();
throw new RuntimeException(getActivity().getClass().getName() + " must implement" +
"ConversationsListHelper.openConversationListener !");
}
} }
@Nullable @Nullable
@ -225,6 +235,11 @@ public class FriendsListFragment extends Fragment {
switch (item.getItemId()){ switch (item.getItemId()){
//To open a private conversation with the friend
case R.id.menu_fragment_friendslist_private_conversation:
convOpener.openPrivateConversation(friendsList.get(friendPos).getFriend().getId());
return true;
//To delete the friend //To delete the friend
case R.id.menu_fragment_friendslist_delete_friend: case R.id.menu_fragment_friendslist_delete_friend:
delete_friend(friendPos); delete_friend(friendPos);

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ProgressBar
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dialog_loading_msg"/>
</LinearLayout>

View File

@ -1,6 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Start private conversation -->
<item
android:id="@+id/menu_fragment_friendslist_private_conversation"
android:title="@string/action_friends_start_private_conversation" />
<!-- Delete the friend --> <!-- Delete the friend -->
<item <item
android:id="@+id/menu_fragment_friendslist_delete_friend" android:id="@+id/menu_fragment_friendslist_delete_friend"

View File

@ -92,4 +92,7 @@
<string name="fragment_update_conversation_members_menu_delete">Remove</string> <string name="fragment_update_conversation_members_menu_delete">Remove</string>
<string name="err_get_conversation_info">Could not get information about the conversation !</string> <string name="err_get_conversation_info">Could not get information about the conversation !</string>
<string name="err_conversation_update">Could not update conversation !</string> <string name="err_conversation_update">Could not update conversation !</string>
<string name="action_friends_start_private_conversation">Private conversation</string>
<string name="err_get_private_conversation">Could not get a private conversation !</string>
<string name="dialog_loading_msg">Loading…</string>
</resources> </resources>