package com.paulvarry.intra42.utils; import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.database.MatrixCursor; import android.provider.BaseColumns; import android.widget.Toast; import androidx.annotation.ArrayRes; import androidx.cursoradapter.widget.CursorAdapter; import androidx.cursoradapter.widget.SimpleCursorAdapter; import com.paulvarry.intra42.AppClass; import com.paulvarry.intra42.R; import com.paulvarry.intra42.activities.SubnotionListActivity; import com.paulvarry.intra42.activities.project.ProjectActivity; import com.paulvarry.intra42.activities.tags.TagsActivity; import com.paulvarry.intra42.activities.user.UserActivity; import java.net.MalformedURLException; import java.net.URL; public class SuperSearch { public static final String[] suggestions = { "u [user] - search on users", "u.[login] - open a user", "p [project] - search on projects", "p.[slug] - open a project", "t [topic] - search on topics", "t.[topic_id] - open a topic", "tag.[tag_id] - open a tag" }; public static final String[] suggestionsReplace = { "u ", "u.", "p ", "p.", "t ", "t.", "tag.", "a./v2/" }; /** * Try to open query before make search * * @param activity The current context * @param query Query to open stuff * @return Return if somethings is opened */ public static boolean open(Activity activity, String query) { if (query.contains("intra.42.")) { return openURL(activity, query); } return openActivity(activity, query); } private static boolean openURL(Activity activity, String query) { URL url; try { url = new URL(query); } catch (MalformedURLException e) { e.printStackTrace(); return false; } String[] split = url.getPath().split("/"); if (split.length <= 1) return false; if (query.contains("projects.intra.42")) { if (split.length != 3) return false; if (split[1].contentEquals("projects")) { Analytics.search("OPEN_URL_PROJECT", query); ProjectActivity.openIt(activity, split[2]); return true; } else if (split[2].contentEquals("mine") || true) { Analytics.search("OPEN_URL_PROJECT", query); ProjectActivity.openIt(activity, split[1]); return true; } else { ProjectActivity.openIt(activity, split[1], split[2]); return true; } } else if (query.contains("profile.intra.42")) { if (split.length == 3 && split[1].contentEquals("users")) { Analytics.search("OPEN_URL_USER", query); UserActivity.openIt(activity, split[2], activity); return true; } } else if (query.contains("elearning.intra.42")) { if (split.length < 3) return false; if (split[1].contentEquals("notions")) { Analytics.search("OPEN_URL_NOTION", query); SubnotionListActivity.openIt(activity, split[2]); return true; } } else if (split.length >= 3 && split[1].contentEquals("tags")) { Analytics.search("OPEN_URL_TAG", query); TagsActivity.openIt(activity, Integer.parseInt(split[2])); } return false; } /** * Open content from search bar like u.pvarry (open pvarry's profile page) * * @param activity A activity for context * @param query The query * @return if open is catch */ private static boolean openActivity(Activity activity, String query) { String[] split = query.split("\\."); if (split.length <= 1) return false; try { if (searchOnArray(R.array.search_users, split[0], activity)) { Analytics.search("OPEN_USER", query); UserActivity.openIt(activity, split[1], activity); return true; } else if (searchOnArray(R.array.search_projects, split[0], activity)) { Analytics.search("OPEN_PROJECT", query); ProjectActivity.openIt(activity, split[1]); return true; } else if (searchOnArray(R.array.search_tags, split[0], activity)) { Analytics.search("OPEN_TAG", query); TagsActivity.openIt(activity, Integer.parseInt(split[1])); return true; } else if (searchOnArray(R.array.search_location, split[0], activity)) { Analytics.search("OPEN_LOCATION", query); UserActivity.openLocation(activity, split[1], (AppClass) activity.getApplication()); return true; } else if (query.contains("@student.42")) { Analytics.search("OPEN_USER_WITH_MAIL", query); UserActivity.openIt(activity, query.split("@")[0]); return true; } else return false; } catch (NumberFormatException e) { Toast.makeText(activity, activity.getString(R.string.search_error_on_open_this_element), Toast.LENGTH_SHORT).show(); } return false; } public static boolean searchOnArray(@ArrayRes int l, String elem, Context context) { Resources res = context.getResources(); String[] array = res.getStringArray(l); for (String s : array) { if (s.equals(elem)) { return true; } } return false; } public static SimpleCursorAdapter setSearchSuggestionAdapter(Context context) { final String[] from = new String[]{"name"}; final int[] to = new int[]{android.R.id.text1}; SimpleCursorAdapter searchAdapter = new SimpleCursorAdapter(context, android.R.layout.simple_list_item_1, null, from, to, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); final MatrixCursor c = new MatrixCursor(new String[]{BaseColumns._ID, "name"}); for (int i = 0; i < SuperSearch.suggestions.length; i++) { c.addRow(new Object[]{i, SuperSearch.suggestions[i]}); } searchAdapter.changeCursor(c); return searchAdapter; } }