Internal users / groups references (@) are now supported

This commit is contained in:
Pierre HUBERT 2018-09-03 13:19:36 +02:00
parent 50ccebfc91
commit 9cf7e86ac8
8 changed files with 248 additions and 4 deletions

View File

@ -0,0 +1,11 @@
package org.communiquons.android.comunic.client.data.enums;
/**
* Kinds of virtual directory
*
* @author Pierre HUBERT
*/
public enum VirtualDirectoryType {
USER,
GROUP
}

View File

@ -0,0 +1,77 @@
package org.communiquons.android.comunic.client.data.helpers;
import android.content.Context;
import android.support.annotation.Nullable;
import org.communiquons.android.comunic.client.data.enums.VirtualDirectoryType;
import org.communiquons.android.comunic.client.data.models.APIRequest;
import org.communiquons.android.comunic.client.data.models.APIResponse;
import org.communiquons.android.comunic.client.data.models.VirtualDirectory;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Virtual directory helper
*
* @author Pierre HUBERT
*/
public class VirtualDirectoryHelper extends BaseHelper {
public VirtualDirectoryHelper(Context context) {
super(context);
}
/**
* Find the information associated with a directory
*
* @param directory The directory to find
* @return Information about the directory / null in case of failure
*/
@Nullable
public VirtualDirectory find(String directory){
APIRequest request = new APIRequest(getContext(), "virtualDirectory/find");
request.addString("directory", directory);
try {
APIResponse response = new APIRequestHelper().exec(request);
if(response.getResponse_code() != 200) return null;
return APIToVirtualDirectory(response.getJSONObject());
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* Turn an API entry into a VirtualDirectory object
*
* @param obj The object to parse
* @return Generated VirtualDirectory object
* @throws JSONException in case of failure
*/
private static VirtualDirectory APIToVirtualDirectory(JSONObject obj) throws JSONException {
VirtualDirectory virtualDirectory = new VirtualDirectory();
virtualDirectory.setKind(StringToVirtualDirectoryType(obj.getString("kind")));
virtualDirectory.setId(obj.getInt("id"));
return virtualDirectory;
}
/**
* Turn a string into a virtual directory type
*
* @param string The string to convert
* @return Matching value in enum
*/
private static VirtualDirectoryType StringToVirtualDirectoryType(String string) {
switch (string){
case "user":
return VirtualDirectoryType.USER;
case "group":
return VirtualDirectoryType.GROUP;
}
throw new AssertionError();
}
}

View File

@ -0,0 +1,31 @@
package org.communiquons.android.comunic.client.data.models;
import org.communiquons.android.comunic.client.data.enums.VirtualDirectoryType;
/**
* Virtual directory information
*
* @author Pierre HUBERT
*/
public class VirtualDirectory {
//Private fields
private VirtualDirectoryType kind;
private int id;
public VirtualDirectoryType getKind() {
return kind;
}
public void setKind(VirtualDirectoryType kind) {
this.kind = kind;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}

View File

@ -13,7 +13,6 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
@ -24,15 +23,19 @@ import android.widget.Toast;
import org.communiquons.android.comunic.client.BuildConfig;
import org.communiquons.android.comunic.client.R;
import org.communiquons.android.comunic.client.crashreporter.CrashReporter;
import org.communiquons.android.comunic.client.data.enums.VirtualDirectoryType;
import org.communiquons.android.comunic.client.data.helpers.APIRequestHelper;
import org.communiquons.android.comunic.client.data.helpers.AccountHelper;
import org.communiquons.android.comunic.client.data.helpers.ConversationsListHelper;
import org.communiquons.android.comunic.client.data.helpers.DatabaseHelper;
import org.communiquons.android.comunic.client.data.helpers.DebugHelper;
import org.communiquons.android.comunic.client.data.models.NotificationsCount;
import org.communiquons.android.comunic.client.data.models.VirtualDirectory;
import org.communiquons.android.comunic.client.data.runnables.FriendRefreshLoopRunnable;
import org.communiquons.android.comunic.client.data.services.NotificationsService;
import org.communiquons.android.comunic.client.data.utils.PreferencesUtils;
import org.communiquons.android.comunic.client.ui.asynctasks.FindVirtualDirectoryTask;
import org.communiquons.android.comunic.client.ui.asynctasks.SafeAsyncTask;
import org.communiquons.android.comunic.client.ui.fragments.ConversationFragment;
import org.communiquons.android.comunic.client.ui.fragments.ConversationsListFragment;
import org.communiquons.android.comunic.client.ui.fragments.FriendsListFragment;
@ -91,6 +94,11 @@ public class MainActivity extends BaseActivity implements
*/
private NavigationBar mNavBar;
/**
* Tasks
*/
private FindVirtualDirectoryTask mFindVirtualDirectoryTask;
/**
* Broadcast receiver
*/
@ -197,9 +205,12 @@ public class MainActivity extends BaseActivity implements
friendsListRefreshRunnable.interrupt();
}
@Override
protected void onDestroy() {
super.onDestroy();
unsetFindVirtualDirectoryTask();
}
/**
* Activity context menu
@ -421,6 +432,70 @@ public class MainActivity extends BaseActivity implements
((MainActivity)activity).getSupportFragmentManager().popBackStack();
}
/**
* Follow a tag to open it
*
* @param activity Activity object
* @param tag The tag to follow
*/
public static void FollowTag(@NonNull Activity activity, String tag){
if(!(activity instanceof MainActivity))
throw new RuntimeException("Need a MainActivity!");
((MainActivity)activity).followTag(tag);
}
/**
* Unset FindVirtualDirectoryTask callback in order to prevent memory leaks
*/
private void unsetFindVirtualDirectoryTask(){
if(mFindVirtualDirectoryTask != null)
mFindVirtualDirectoryTask.setOnPostExecuteListener(null);
}
/**
* Follow a tag to open it
*
* @param tag The tag to find
*/
public void followTag(String tag){
final AlertDialog dialog = UiUtils.create_loading_dialog(this);
unsetFindVirtualDirectoryTask();
mFindVirtualDirectoryTask = new FindVirtualDirectoryTask(this);
mFindVirtualDirectoryTask.setOnPostExecuteListener(new SafeAsyncTask.OnPostExecuteListener<VirtualDirectory>() {
@Override
public void OnPostExecute(VirtualDirectory virtualDirectory) {
dialog.dismiss();
openDirectory(virtualDirectory);
}
});
mFindVirtualDirectoryTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, tag);
}
/**
* Open a directory
*
* @param directory The directory to open
*/
public void openDirectory(@Nullable VirtualDirectory directory){
if(directory == null){
Toast.makeText(this, R.string.err_find_tag, Toast.LENGTH_SHORT).show();
return;
}
if (directory.getKind() == VirtualDirectoryType.GROUP){
Toast.makeText(this, R.string.err_groups_not_supported,
Toast.LENGTH_SHORT).show();
}
else if(directory.getKind() == VirtualDirectoryType.USER){
openUserPage(directory.getId());
}
}
/**
* Open the friends list fragment
*/

View File

@ -0,0 +1,22 @@
package org.communiquons.android.comunic.client.ui.asynctasks;
import android.content.Context;
import org.communiquons.android.comunic.client.data.helpers.VirtualDirectoryHelper;
import org.communiquons.android.comunic.client.data.models.VirtualDirectory;
/**
* Find a virtual directory task
*
* @author Pierre HUBERT
*/
public class FindVirtualDirectoryTask extends SafeAsyncTask<String, Void, VirtualDirectory> {
public FindVirtualDirectoryTask(Context context) {
super(context);
}
@Override
protected VirtualDirectory doInBackground(String... strings) {
return new VirtualDirectoryHelper(getContext()).find(strings[0]);
}
}

View File

@ -15,6 +15,7 @@ import android.util.AttributeSet;
import android.view.View;
import org.communiquons.android.comunic.client.data.utils.StringsUtils;
import org.communiquons.android.comunic.client.ui.activities.MainActivity;
import org.communiquons.android.comunic.client.ui.utils.UiUtils;
/**
@ -76,7 +77,7 @@ public class ContentTextView extends android.support.v7.widget.AppCompatTextView
int pos = 0;
for (String part : parts) {
//Mark it as URL
//Process it as URL if possible
if (StringsUtils.isURL(part)) {
ClickableSpan clickableSpan = new URLClickableSpan(part);
@ -85,6 +86,12 @@ public class ContentTextView extends android.support.v7.widget.AppCompatTextView
}
else if(part.length() > 0 && part.charAt(0) == '@'){
ClickableSpan clickableSpan = new TAGClickableSpan(part);
ssb.setSpan(clickableSpan, pos, pos + part.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
pos += part.length() + 1;
}
@ -123,4 +130,21 @@ public class ContentTextView extends android.support.v7.widget.AppCompatTextView
getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(mURL)));
}
}
/**
* Clickable span for tag
*/
private class TAGClickableSpan extends BaseClickableSpan {
private String mTag;
private TAGClickableSpan(String tag){
mTag = tag.substring(1);
}
@Override
public void onClick(View widget) {
MainActivity.FollowTag(getActivity(), mTag);
}
}
}

View File

@ -289,4 +289,6 @@
<string name="array_authenticated_users">Les utilisateurs connectés à Comunic</string>
<string name="array_friends_only">Uniquement mes amis</string>
<string name="err_update_account_image_visibility">Une erreur a survenu lors de la mise à jour du niveau de visibilité de l\'image de compte !</string>
<string name="err_find_tag">Le tag spécifié n\'a pas été trouvé !</string>
<string name="err_groups_not_supported">Les groupes ne sont pas encore supportés sur l\'application Android…</string>
</resources>

View File

@ -288,4 +288,6 @@
<string name="array_authenticated_users">Authenticated users</string>
<string name="array_friends_only">Friends only</string>
<string name="err_update_account_image_visibility">Could not update account image visibility level!</string>
<string name="err_find_tag">Could not find requested tag!</string>
<string name="err_groups_not_supported">Groups are not supported yet by the Android application!</string>
</resources>