Loading app/src/main/java/it/niedermann/owncloud/notes/persistence/ApiProvider.java +2 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonDeserializer; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializer; import com.google.gson.Strictness; import com.nextcloud.android.sso.api.NextcloudAPI; import com.nextcloud.android.sso.model.SingleSignOnAccount; Loading Loading @@ -115,6 +116,7 @@ public class ApiProvider { Log.v(TAG, "NextcloudRequest account: " + ssoAccount.name); final var nextcloudAPI = new NextcloudAPI(context.getApplicationContext(), ssoAccount, new GsonBuilder() .setStrictness(Strictness.LENIENT) .excludeFieldsWithoutExposeAnnotation() .registerTypeHierarchyAdapter(Calendar.class, (JsonSerializer<Calendar>) (src, typeOfSrc, ctx) -> new JsonPrimitive(src.getTimeInMillis() / 1_000)) .registerTypeHierarchyAdapter(Calendar.class, (JsonDeserializer<Calendar>) (src, typeOfSrc, ctx) -> { Loading app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NotesAPI_0_2.java +1 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import retrofit2.http.Path; import retrofit2.http.Query; /** * * @link <a href="https://github.com/nextcloud/notes/wiki/API-0.2">Notes API v0.2</a> */ public interface NotesAPI_0_2 { Loading app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/ShareAPI.kt +4 −14 Original line number Diff line number Diff line Loading @@ -2,12 +2,12 @@ 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.CreateShareRequest import it.niedermann.owncloud.notes.share.model.CreateShareResponse import it.niedermann.owncloud.notes.shared.model.OcsResponse import retrofit2.Call import retrofit2.http.Body import retrofit2.http.DELETE import retrofit2.http.Field import retrofit2.http.FormUrlEncoded import retrofit2.http.GET import retrofit2.http.PATCH import retrofit2.http.POST Loading Loading @@ -40,16 +40,6 @@ interface ShareAPI { @PATCH("shares") fun updateShare(remoteShareId: Long): Call<OcsResponse<List<OCShare>>> @FormUrlEncoded @POST("shares") fun addShare( @Field("remoteFilePath") remoteFilePath: String, @Field("shareType") shareType: ShareType, @Field("shareWith") shareWith: String, @Field("publicUpload") publicUpload: Boolean, @Field("password") password: String, @Field("permissions") permissions: Int, @Field("getShareDetails") getShareDetails: Boolean, @Field("note") note: String ): Call<OcsResponse<List<OCShare>>> fun addShare(@Body request: CreateShareRequest): Call<OcsResponse<CreateShareResponse>> } app/src/main/java/it/niedermann/owncloud/notes/share/NoteShareActivity.java +4 −7 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ import it.niedermann.owncloud.notes.branding.BrandedActivity; import it.niedermann.owncloud.notes.branding.BrandedSnackbar; import it.niedermann.owncloud.notes.branding.BrandingUtil; import it.niedermann.owncloud.notes.databinding.ActivityNoteShareBinding; import it.niedermann.owncloud.notes.persistence.ShareRepository; import it.niedermann.owncloud.notes.share.repository.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; Loading Loading @@ -160,7 +160,7 @@ public class NoteShareActivity extends BrandedActivity implements ShareeListAdap // avoid fullscreen with softkeyboard binding.searchView.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); ShareRepository repository = ShareRepository.getInstance(getApplicationContext()); ShareRepository repository = new ShareRepository(this); UsersAndGroupsSearchProvider provider = new UsersAndGroupsSearchProvider(this, repository); binding.searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override Loading @@ -174,12 +174,9 @@ public class NoteShareActivity extends BrandedActivity implements ShareeListAdap public boolean onQueryTextChange(String newText) { new Thread(() -> {{ try (Cursor cursor = provider.searchForUsersOrGroups(newText)) { if (cursor == null) { Log_OC.d(TAG,"searchForUsersOrGroups returned null"); return; } if (cursor != null) { runOnUiThread(() -> suggestionAdapter.changeCursor(cursor)); } } catch (Exception e) { Log_OC.d(TAG,"Exception setupSearchView.onQueryTextChange: " + e); } Loading app/src/main/java/it/niedermann/owncloud/notes/share/NoteShareDetailActivity.kt +38 −4 Original line number Diff line number Diff line Loading @@ -4,6 +4,9 @@ import android.content.res.Configuration import android.os.Bundle import android.text.TextUtils import android.view.View import androidx.lifecycle.lifecycleScope import com.nextcloud.android.sso.helper.SingleAccountHelper import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.lib.resources.shares.OCShare import com.owncloud.android.lib.resources.shares.SharePermissionsBuilder import com.owncloud.android.lib.resources.shares.ShareType Loading @@ -14,9 +17,12 @@ import it.niedermann.owncloud.notes.databinding.ActivityNoteShareDetailBinding import it.niedermann.owncloud.notes.persistence.entity.Note import it.niedermann.owncloud.notes.share.dialog.ExpirationDatePickerDialogFragment import it.niedermann.owncloud.notes.share.helper.SharingMenuHelper import it.niedermann.owncloud.notes.share.repository.ShareRepository import it.niedermann.owncloud.notes.shared.util.DisplayUtils import it.niedermann.owncloud.notes.shared.util.extensions.getParcelableArgument import it.niedermann.owncloud.notes.shared.util.extensions.getSerializableArgument import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.text.SimpleDateFormat import java.util.Date Loading Loading @@ -91,7 +97,7 @@ class NoteShareDetailActivity : BrandedActivity(), ExpirationDatePickerDialogFra } private lateinit var binding: ActivityNoteShareDetailBinding private var file: Note? = null // file to be share private var note: Note? = null // note to be share private var shareeName: String? = null private lateinit var shareType: ShareType private var shareProcessStep = SCREEN_TYPE_PERMISSION // default screen type Loading @@ -104,7 +110,7 @@ class NoteShareDetailActivity : BrandedActivity(), ExpirationDatePickerDialogFra private var isSecureShare: Boolean = false private var expirationDatePickerFragment: ExpirationDatePickerDialogFragment? = null private lateinit var repository: ShareRepository override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Loading @@ -114,7 +120,7 @@ class NoteShareDetailActivity : BrandedActivity(), ExpirationDatePickerDialogFra val arguments = intent.extras arguments?.let { file = it.getSerializableArgument(ARG_NOTE, Note::class.java) note = it.getSerializableArgument(ARG_NOTE, Note::class.java) shareeName = it.getString(ARG_SHAREE_NAME) share = it.getParcelableArgument(ARG_OCSHARE, OCShare::class.java) Loading @@ -132,6 +138,7 @@ class NoteShareDetailActivity : BrandedActivity(), ExpirationDatePickerDialogFra // capabilities = CapabilityUtils.getCapability(context) repository = ShareRepository(this) if (shareProcessStep == SCREEN_TYPE_PERMISSION) { showShareProcessFirst() } else { Loading Loading @@ -237,7 +244,7 @@ class NoteShareDetailActivity : BrandedActivity(), ExpirationDatePickerDialogFra private fun setupUpdateUI() { binding.shareProcessBtnNext.text = getString(R.string.note_share_detail_activity_common_next) file.let { note.let { updateViewForFile() updateViewForShareType() } Loading Loading @@ -544,6 +551,33 @@ class NoteShareDetailActivity : BrandedActivity(), ExpirationDatePickerDialogFra onShareProcessClosed() */ val noteText = binding.noteText.text.toString().trim() lifecycleScope.launch(Dispatchers.IO) { val ssoAcc = SingleAccountHelper.getCurrentSingleSignOnAccount(this@NoteShareDetailActivity) // if modifying existing share then directly update the note and send email if (share != null && share?.note != noteText) { // repository.updateShare(ssoAcc,share, noteText) } else { if (note == null || shareeName == null) { Log_OC.d(TAG, "validateShareProcessSecond cancelled") return@launch } // else create new share repository.addShare( ssoAcc, note!!, shareType, shareeName!!, "false", // TODO: Check how to determine it binding.shareProcessEnterPassword.text.toString().trim(), permission, noteText ) } } } override fun onDateSet(year: Int, monthOfYear: Int, dayOfMonth: Int, chosenDateInMillis: Long) { Loading Loading
app/src/main/java/it/niedermann/owncloud/notes/persistence/ApiProvider.java +2 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonDeserializer; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializer; import com.google.gson.Strictness; import com.nextcloud.android.sso.api.NextcloudAPI; import com.nextcloud.android.sso.model.SingleSignOnAccount; Loading Loading @@ -115,6 +116,7 @@ public class ApiProvider { Log.v(TAG, "NextcloudRequest account: " + ssoAccount.name); final var nextcloudAPI = new NextcloudAPI(context.getApplicationContext(), ssoAccount, new GsonBuilder() .setStrictness(Strictness.LENIENT) .excludeFieldsWithoutExposeAnnotation() .registerTypeHierarchyAdapter(Calendar.class, (JsonSerializer<Calendar>) (src, typeOfSrc, ctx) -> new JsonPrimitive(src.getTimeInMillis() / 1_000)) .registerTypeHierarchyAdapter(Calendar.class, (JsonDeserializer<Calendar>) (src, typeOfSrc, ctx) -> { Loading
app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NotesAPI_0_2.java +1 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import retrofit2.http.Path; import retrofit2.http.Query; /** * * @link <a href="https://github.com/nextcloud/notes/wiki/API-0.2">Notes API v0.2</a> */ public interface NotesAPI_0_2 { Loading
app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/ShareAPI.kt +4 −14 Original line number Diff line number Diff line Loading @@ -2,12 +2,12 @@ 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.CreateShareRequest import it.niedermann.owncloud.notes.share.model.CreateShareResponse import it.niedermann.owncloud.notes.shared.model.OcsResponse import retrofit2.Call import retrofit2.http.Body import retrofit2.http.DELETE import retrofit2.http.Field import retrofit2.http.FormUrlEncoded import retrofit2.http.GET import retrofit2.http.PATCH import retrofit2.http.POST Loading Loading @@ -40,16 +40,6 @@ interface ShareAPI { @PATCH("shares") fun updateShare(remoteShareId: Long): Call<OcsResponse<List<OCShare>>> @FormUrlEncoded @POST("shares") fun addShare( @Field("remoteFilePath") remoteFilePath: String, @Field("shareType") shareType: ShareType, @Field("shareWith") shareWith: String, @Field("publicUpload") publicUpload: Boolean, @Field("password") password: String, @Field("permissions") permissions: Int, @Field("getShareDetails") getShareDetails: Boolean, @Field("note") note: String ): Call<OcsResponse<List<OCShare>>> fun addShare(@Body request: CreateShareRequest): Call<OcsResponse<CreateShareResponse>> }
app/src/main/java/it/niedermann/owncloud/notes/share/NoteShareActivity.java +4 −7 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ import it.niedermann.owncloud.notes.branding.BrandedActivity; import it.niedermann.owncloud.notes.branding.BrandedSnackbar; import it.niedermann.owncloud.notes.branding.BrandingUtil; import it.niedermann.owncloud.notes.databinding.ActivityNoteShareBinding; import it.niedermann.owncloud.notes.persistence.ShareRepository; import it.niedermann.owncloud.notes.share.repository.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; Loading Loading @@ -160,7 +160,7 @@ public class NoteShareActivity extends BrandedActivity implements ShareeListAdap // avoid fullscreen with softkeyboard binding.searchView.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); ShareRepository repository = ShareRepository.getInstance(getApplicationContext()); ShareRepository repository = new ShareRepository(this); UsersAndGroupsSearchProvider provider = new UsersAndGroupsSearchProvider(this, repository); binding.searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override Loading @@ -174,12 +174,9 @@ public class NoteShareActivity extends BrandedActivity implements ShareeListAdap public boolean onQueryTextChange(String newText) { new Thread(() -> {{ try (Cursor cursor = provider.searchForUsersOrGroups(newText)) { if (cursor == null) { Log_OC.d(TAG,"searchForUsersOrGroups returned null"); return; } if (cursor != null) { runOnUiThread(() -> suggestionAdapter.changeCursor(cursor)); } } catch (Exception e) { Log_OC.d(TAG,"Exception setupSearchView.onQueryTextChange: " + e); } Loading
app/src/main/java/it/niedermann/owncloud/notes/share/NoteShareDetailActivity.kt +38 −4 Original line number Diff line number Diff line Loading @@ -4,6 +4,9 @@ import android.content.res.Configuration import android.os.Bundle import android.text.TextUtils import android.view.View import androidx.lifecycle.lifecycleScope import com.nextcloud.android.sso.helper.SingleAccountHelper import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.lib.resources.shares.OCShare import com.owncloud.android.lib.resources.shares.SharePermissionsBuilder import com.owncloud.android.lib.resources.shares.ShareType Loading @@ -14,9 +17,12 @@ import it.niedermann.owncloud.notes.databinding.ActivityNoteShareDetailBinding import it.niedermann.owncloud.notes.persistence.entity.Note import it.niedermann.owncloud.notes.share.dialog.ExpirationDatePickerDialogFragment import it.niedermann.owncloud.notes.share.helper.SharingMenuHelper import it.niedermann.owncloud.notes.share.repository.ShareRepository import it.niedermann.owncloud.notes.shared.util.DisplayUtils import it.niedermann.owncloud.notes.shared.util.extensions.getParcelableArgument import it.niedermann.owncloud.notes.shared.util.extensions.getSerializableArgument import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.text.SimpleDateFormat import java.util.Date Loading Loading @@ -91,7 +97,7 @@ class NoteShareDetailActivity : BrandedActivity(), ExpirationDatePickerDialogFra } private lateinit var binding: ActivityNoteShareDetailBinding private var file: Note? = null // file to be share private var note: Note? = null // note to be share private var shareeName: String? = null private lateinit var shareType: ShareType private var shareProcessStep = SCREEN_TYPE_PERMISSION // default screen type Loading @@ -104,7 +110,7 @@ class NoteShareDetailActivity : BrandedActivity(), ExpirationDatePickerDialogFra private var isSecureShare: Boolean = false private var expirationDatePickerFragment: ExpirationDatePickerDialogFragment? = null private lateinit var repository: ShareRepository override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Loading @@ -114,7 +120,7 @@ class NoteShareDetailActivity : BrandedActivity(), ExpirationDatePickerDialogFra val arguments = intent.extras arguments?.let { file = it.getSerializableArgument(ARG_NOTE, Note::class.java) note = it.getSerializableArgument(ARG_NOTE, Note::class.java) shareeName = it.getString(ARG_SHAREE_NAME) share = it.getParcelableArgument(ARG_OCSHARE, OCShare::class.java) Loading @@ -132,6 +138,7 @@ class NoteShareDetailActivity : BrandedActivity(), ExpirationDatePickerDialogFra // capabilities = CapabilityUtils.getCapability(context) repository = ShareRepository(this) if (shareProcessStep == SCREEN_TYPE_PERMISSION) { showShareProcessFirst() } else { Loading Loading @@ -237,7 +244,7 @@ class NoteShareDetailActivity : BrandedActivity(), ExpirationDatePickerDialogFra private fun setupUpdateUI() { binding.shareProcessBtnNext.text = getString(R.string.note_share_detail_activity_common_next) file.let { note.let { updateViewForFile() updateViewForShareType() } Loading Loading @@ -544,6 +551,33 @@ class NoteShareDetailActivity : BrandedActivity(), ExpirationDatePickerDialogFra onShareProcessClosed() */ val noteText = binding.noteText.text.toString().trim() lifecycleScope.launch(Dispatchers.IO) { val ssoAcc = SingleAccountHelper.getCurrentSingleSignOnAccount(this@NoteShareDetailActivity) // if modifying existing share then directly update the note and send email if (share != null && share?.note != noteText) { // repository.updateShare(ssoAcc,share, noteText) } else { if (note == null || shareeName == null) { Log_OC.d(TAG, "validateShareProcessSecond cancelled") return@launch } // else create new share repository.addShare( ssoAcc, note!!, shareType, shareeName!!, "false", // TODO: Check how to determine it binding.shareProcessEnterPassword.text.toString().trim(), permission, noteText ) } } } override fun onDateSet(year: Int, monthOfYear: Int, dayOfMonth: Int, chosenDateInMillis: Long) { Loading