Loading app/src/main/java/it/niedermann/owncloud/notes/persistence/ShareRepository.kt +1 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ class ShareRepository private constructor(private val applicationContext: Contex ): Single<ArrayList<JSONObject>> { return Single.fromCallable { val shareAPI = apiProvider.getShareAPI(applicationContext, account) val call2 = shareAPI.getSharees2(search = searchString, page = page, perPage = perPage) val call2 = shareAPI.getSharees(search = searchString, page = page, perPage = perPage) val response2 = call2.execute() val respJSON = JSONObject(response2.body().toString()) Loading app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/ShareAPI.kt +1 −12 Original line number Diff line number Diff line Loading @@ -3,7 +3,6 @@ package it.niedermann.owncloud.notes.persistence.sync import com.nextcloud.android.sso.api.EmptyResponse import com.owncloud.android.lib.resources.shares.OCShare import com.owncloud.android.lib.resources.shares.ShareType import it.niedermann.owncloud.notes.share.model.ShareesData import it.niedermann.owncloud.notes.shared.model.OcsResponse import retrofit2.Call import retrofit2.http.DELETE Loading @@ -13,16 +12,6 @@ import retrofit2.http.POST import retrofit2.http.Query interface ShareAPI { @GET("sharees") fun getSharees2( @Query("format") format: String = "json", @Query("itemType") itemType: String = "file", @Query("search") search: String, @Query("page") page: Int, @Query("perPage") perPage: Int, @Query("lookup") lookup: Boolean = true, ): Call<Any> @GET("sharees") fun getSharees( @Query("format") format: String = "json", Loading @@ -31,7 +20,7 @@ interface ShareAPI { @Query("page") page: Int, @Query("perPage") perPage: Int, @Query("lookup") lookup: Boolean = true, ): Call<OcsResponse<ShareesData>> ): Call<Any> @GET("shares") fun getShares(remoteId: Long): Call<OcsResponse<List<OCShare>>> Loading app/src/main/java/it/niedermann/owncloud/notes/share/NoteShareActivity.java +24 −3 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ import it.niedermann.owncloud.notes.persistence.ShareRepository; import it.niedermann.owncloud.notes.persistence.entity.Account; import it.niedermann.owncloud.notes.persistence.entity.Note; import it.niedermann.owncloud.notes.share.adapter.ShareeListAdapter; import it.niedermann.owncloud.notes.share.adapter.SuggestionAdapter; import it.niedermann.owncloud.notes.share.dialog.FileDetailSharingMenuBottomSheetDialog; import it.niedermann.owncloud.notes.share.dialog.QuickSharingPermissionsBottomSheetDialog; import it.niedermann.owncloud.notes.share.dialog.ShareLinkToDialog; Loading @@ -57,7 +58,6 @@ import it.niedermann.owncloud.notes.share.dialog.SharePasswordDialogFragment; import it.niedermann.owncloud.notes.share.helper.UsersAndGroupsSearchProvider; import it.niedermann.owncloud.notes.share.listener.FileDetailsSharingMenuBottomSheetActions; import it.niedermann.owncloud.notes.share.listener.ShareeListAdapterListener; import it.niedermann.owncloud.notes.share.model.ShareesData; import it.niedermann.owncloud.notes.share.model.UsersAndGroupsSearchConfig; import it.niedermann.owncloud.notes.share.operations.ClientFactoryImpl; import it.niedermann.owncloud.notes.share.operations.RetrieveHoverCardAsyncTask; Loading Loading @@ -154,6 +154,9 @@ public class NoteShareActivity extends BrandedActivity implements ShareeListAdap return; } SuggestionAdapter suggestionAdapter = new SuggestionAdapter(this, null); binding.searchView.setSuggestionsAdapter(suggestionAdapter); // assumes parent activity is the searchable activity binding.searchView.setSearchableInfo(searchManager.getSearchableInfo(componentName)); Loading @@ -176,12 +179,30 @@ public class NoteShareActivity extends BrandedActivity implements ShareeListAdap @Override public boolean onQueryTextChange(String newText) { new Thread(() -> {{ ShareesData data = provider.searchForUsersOrGroups(newText); Log_OC.e(NoteShareActivity.class.getSimpleName(), "Fetched" + newText); try (Cursor cursor = provider.searchForUsersOrGroups(newText)) { runOnUiThread(() -> suggestionAdapter.changeCursor(cursor)); } }}).start(); return false; } }); binding.searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() { @Override public boolean onSuggestionSelect(int position) { return false; } @Override public boolean onSuggestionClick(int position) { Cursor cursor = suggestionAdapter.getCursor(); if (cursor.moveToPosition(position)) { String suggestion = cursor.getString(cursor.getColumnIndexOrThrow(SearchManager.SUGGEST_COLUMN_TEXT_1)); binding.searchView.setQuery(suggestion, false); } return true; } }); } private void disableSearchView(View view) { Loading app/src/main/java/it/niedermann/owncloud/notes/share/adapter/SuggestionAdapter.java 0 → 100644 +31 −0 Original line number Diff line number Diff line package it.niedermann.owncloud.notes.share.adapter; import android.app.SearchManager; import android.content.Context; import android.database.Cursor; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import androidx.cursoradapter.widget.CursorAdapter; public class SuggestionAdapter extends CursorAdapter { public SuggestionAdapter(Context context, Cursor cursor) { super(context, cursor, false); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(context); return inflater.inflate(android.R.layout.simple_list_item_1, parent, false); } @Override public void bindView(View view, Context context, Cursor cursor) { TextView textView = view.findViewById(android.R.id.text1); String suggestion = cursor.getString(cursor.getColumnIndexOrThrow(SearchManager.SUGGEST_COLUMN_TEXT_1)); textView.setText(suggestion); } } app/src/main/java/it/niedermann/owncloud/notes/share/helper/UsersAndGroupsSearchProvider.java +15 −24 Original line number Diff line number Diff line Loading @@ -29,7 +29,6 @@ import com.owncloud.android.lib.resources.shares.ShareType; import com.owncloud.android.lib.resources.users.Status; import com.owncloud.android.lib.resources.users.StatusType; import org.json.JSONException; import org.json.JSONObject; import java.io.ByteArrayOutputStream; Loading @@ -38,19 +37,14 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.concurrent.ExecutionException; import io.reactivex.Scheduler; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; import it.niedermann.nextcloud.sso.glide.SingleSignOnUrl; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.persistence.ShareRepository; import it.niedermann.owncloud.notes.persistence.entity.Account; import it.niedermann.owncloud.notes.share.model.ShareesData; import it.niedermann.owncloud.notes.share.model.UsersAndGroupsSearchConfig; /** Loading @@ -77,19 +71,19 @@ public class UsersAndGroupsSearchProvider { public static final String CONTENT = "content"; private String AUTHORITY; private String DATA_USER; private String DATA_GROUP; private String DATA_ROOM; private String DATA_REMOTE; private String DATA_EMAIL; private String DATA_CIRCLE; private final String AUTHORITY; private final String DATA_USER; private final String DATA_GROUP; private final String DATA_ROOM; private final String DATA_REMOTE; private final String DATA_EMAIL; private final String DATA_CIRCLE; private UriMatcher mUriMatcher; private final UriMatcher mUriMatcher; private ShareRepository repository; private Account account; private Context context; private final ShareRepository repository; private final Account account; private final Context context; public UsersAndGroupsSearchProvider(Context context, Account account, ShareRepository repository) { this.context = context; Loading Loading @@ -126,14 +120,14 @@ public class UsersAndGroupsSearchProvider { ACTION_SHARE_WITH = context.getString(R.string.users_and_groups_share_with); } public ShareesData searchForUsersOrGroups(String userQuery) { public Cursor searchForUsersOrGroups(String userQuery) { final SingleSignOnAccount ssoAcc; try { ssoAcc = SingleAccountHelper.getCurrentSingleSignOnAccount(context); final var names = repository.getSharees(ssoAcc, userQuery, REQUESTED_PAGE, RESULTS_PER_PAGE).blockingGet(); ShareesData data = new ShareesData(null,null,null ); MatrixCursor response = null; if (!names.isEmpty()) { MatrixCursor response = new MatrixCursor(COLUMNS); response = new MatrixCursor(COLUMNS); Uri userBaseUri = new Uri.Builder().scheme(CONTENT).authority(DATA_USER).build(); Uri groupBaseUri = new Uri.Builder().scheme(CONTENT).authority(DATA_GROUP).build(); Loading Loading @@ -254,13 +248,10 @@ public class UsersAndGroupsSearchProvider { .add(dataUri); } data.setDisplayName(displayName); data.setDataUri(dataUri); data.setIcon(icon); } } return data; return response; } catch (Exception e) { Log_OC.e(TAG, "Exception while searching", e); } Loading Loading
app/src/main/java/it/niedermann/owncloud/notes/persistence/ShareRepository.kt +1 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ class ShareRepository private constructor(private val applicationContext: Contex ): Single<ArrayList<JSONObject>> { return Single.fromCallable { val shareAPI = apiProvider.getShareAPI(applicationContext, account) val call2 = shareAPI.getSharees2(search = searchString, page = page, perPage = perPage) val call2 = shareAPI.getSharees(search = searchString, page = page, perPage = perPage) val response2 = call2.execute() val respJSON = JSONObject(response2.body().toString()) Loading
app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/ShareAPI.kt +1 −12 Original line number Diff line number Diff line Loading @@ -3,7 +3,6 @@ package it.niedermann.owncloud.notes.persistence.sync import com.nextcloud.android.sso.api.EmptyResponse import com.owncloud.android.lib.resources.shares.OCShare import com.owncloud.android.lib.resources.shares.ShareType import it.niedermann.owncloud.notes.share.model.ShareesData import it.niedermann.owncloud.notes.shared.model.OcsResponse import retrofit2.Call import retrofit2.http.DELETE Loading @@ -13,16 +12,6 @@ import retrofit2.http.POST import retrofit2.http.Query interface ShareAPI { @GET("sharees") fun getSharees2( @Query("format") format: String = "json", @Query("itemType") itemType: String = "file", @Query("search") search: String, @Query("page") page: Int, @Query("perPage") perPage: Int, @Query("lookup") lookup: Boolean = true, ): Call<Any> @GET("sharees") fun getSharees( @Query("format") format: String = "json", Loading @@ -31,7 +20,7 @@ interface ShareAPI { @Query("page") page: Int, @Query("perPage") perPage: Int, @Query("lookup") lookup: Boolean = true, ): Call<OcsResponse<ShareesData>> ): Call<Any> @GET("shares") fun getShares(remoteId: Long): Call<OcsResponse<List<OCShare>>> Loading
app/src/main/java/it/niedermann/owncloud/notes/share/NoteShareActivity.java +24 −3 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ import it.niedermann.owncloud.notes.persistence.ShareRepository; import it.niedermann.owncloud.notes.persistence.entity.Account; import it.niedermann.owncloud.notes.persistence.entity.Note; import it.niedermann.owncloud.notes.share.adapter.ShareeListAdapter; import it.niedermann.owncloud.notes.share.adapter.SuggestionAdapter; import it.niedermann.owncloud.notes.share.dialog.FileDetailSharingMenuBottomSheetDialog; import it.niedermann.owncloud.notes.share.dialog.QuickSharingPermissionsBottomSheetDialog; import it.niedermann.owncloud.notes.share.dialog.ShareLinkToDialog; Loading @@ -57,7 +58,6 @@ import it.niedermann.owncloud.notes.share.dialog.SharePasswordDialogFragment; import it.niedermann.owncloud.notes.share.helper.UsersAndGroupsSearchProvider; import it.niedermann.owncloud.notes.share.listener.FileDetailsSharingMenuBottomSheetActions; import it.niedermann.owncloud.notes.share.listener.ShareeListAdapterListener; import it.niedermann.owncloud.notes.share.model.ShareesData; import it.niedermann.owncloud.notes.share.model.UsersAndGroupsSearchConfig; import it.niedermann.owncloud.notes.share.operations.ClientFactoryImpl; import it.niedermann.owncloud.notes.share.operations.RetrieveHoverCardAsyncTask; Loading Loading @@ -154,6 +154,9 @@ public class NoteShareActivity extends BrandedActivity implements ShareeListAdap return; } SuggestionAdapter suggestionAdapter = new SuggestionAdapter(this, null); binding.searchView.setSuggestionsAdapter(suggestionAdapter); // assumes parent activity is the searchable activity binding.searchView.setSearchableInfo(searchManager.getSearchableInfo(componentName)); Loading @@ -176,12 +179,30 @@ public class NoteShareActivity extends BrandedActivity implements ShareeListAdap @Override public boolean onQueryTextChange(String newText) { new Thread(() -> {{ ShareesData data = provider.searchForUsersOrGroups(newText); Log_OC.e(NoteShareActivity.class.getSimpleName(), "Fetched" + newText); try (Cursor cursor = provider.searchForUsersOrGroups(newText)) { runOnUiThread(() -> suggestionAdapter.changeCursor(cursor)); } }}).start(); return false; } }); binding.searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() { @Override public boolean onSuggestionSelect(int position) { return false; } @Override public boolean onSuggestionClick(int position) { Cursor cursor = suggestionAdapter.getCursor(); if (cursor.moveToPosition(position)) { String suggestion = cursor.getString(cursor.getColumnIndexOrThrow(SearchManager.SUGGEST_COLUMN_TEXT_1)); binding.searchView.setQuery(suggestion, false); } return true; } }); } private void disableSearchView(View view) { Loading
app/src/main/java/it/niedermann/owncloud/notes/share/adapter/SuggestionAdapter.java 0 → 100644 +31 −0 Original line number Diff line number Diff line package it.niedermann.owncloud.notes.share.adapter; import android.app.SearchManager; import android.content.Context; import android.database.Cursor; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import androidx.cursoradapter.widget.CursorAdapter; public class SuggestionAdapter extends CursorAdapter { public SuggestionAdapter(Context context, Cursor cursor) { super(context, cursor, false); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(context); return inflater.inflate(android.R.layout.simple_list_item_1, parent, false); } @Override public void bindView(View view, Context context, Cursor cursor) { TextView textView = view.findViewById(android.R.id.text1); String suggestion = cursor.getString(cursor.getColumnIndexOrThrow(SearchManager.SUGGEST_COLUMN_TEXT_1)); textView.setText(suggestion); } }
app/src/main/java/it/niedermann/owncloud/notes/share/helper/UsersAndGroupsSearchProvider.java +15 −24 Original line number Diff line number Diff line Loading @@ -29,7 +29,6 @@ import com.owncloud.android.lib.resources.shares.ShareType; import com.owncloud.android.lib.resources.users.Status; import com.owncloud.android.lib.resources.users.StatusType; import org.json.JSONException; import org.json.JSONObject; import java.io.ByteArrayOutputStream; Loading @@ -38,19 +37,14 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.concurrent.ExecutionException; import io.reactivex.Scheduler; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; import it.niedermann.nextcloud.sso.glide.SingleSignOnUrl; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.persistence.ShareRepository; import it.niedermann.owncloud.notes.persistence.entity.Account; import it.niedermann.owncloud.notes.share.model.ShareesData; import it.niedermann.owncloud.notes.share.model.UsersAndGroupsSearchConfig; /** Loading @@ -77,19 +71,19 @@ public class UsersAndGroupsSearchProvider { public static final String CONTENT = "content"; private String AUTHORITY; private String DATA_USER; private String DATA_GROUP; private String DATA_ROOM; private String DATA_REMOTE; private String DATA_EMAIL; private String DATA_CIRCLE; private final String AUTHORITY; private final String DATA_USER; private final String DATA_GROUP; private final String DATA_ROOM; private final String DATA_REMOTE; private final String DATA_EMAIL; private final String DATA_CIRCLE; private UriMatcher mUriMatcher; private final UriMatcher mUriMatcher; private ShareRepository repository; private Account account; private Context context; private final ShareRepository repository; private final Account account; private final Context context; public UsersAndGroupsSearchProvider(Context context, Account account, ShareRepository repository) { this.context = context; Loading Loading @@ -126,14 +120,14 @@ public class UsersAndGroupsSearchProvider { ACTION_SHARE_WITH = context.getString(R.string.users_and_groups_share_with); } public ShareesData searchForUsersOrGroups(String userQuery) { public Cursor searchForUsersOrGroups(String userQuery) { final SingleSignOnAccount ssoAcc; try { ssoAcc = SingleAccountHelper.getCurrentSingleSignOnAccount(context); final var names = repository.getSharees(ssoAcc, userQuery, REQUESTED_PAGE, RESULTS_PER_PAGE).blockingGet(); ShareesData data = new ShareesData(null,null,null ); MatrixCursor response = null; if (!names.isEmpty()) { MatrixCursor response = new MatrixCursor(COLUMNS); response = new MatrixCursor(COLUMNS); Uri userBaseUri = new Uri.Builder().scheme(CONTENT).authority(DATA_USER).build(); Uri groupBaseUri = new Uri.Builder().scheme(CONTENT).authority(DATA_GROUP).build(); Loading Loading @@ -254,13 +248,10 @@ public class UsersAndGroupsSearchProvider { .add(dataUri); } data.setDisplayName(displayName); data.setDataUri(dataUri); data.setIcon(icon); } } return data; return response; } catch (Exception e) { Log_OC.e(TAG, "Exception while searching", e); } Loading