diff --git a/app/src/main/java/com/fastaccess/github/di/components/AppComponent.kt b/app/src/main/java/com/fastaccess/github/di/components/AppComponent.kt index 798a160f..b440815f 100644 --- a/app/src/main/java/com/fastaccess/github/di/components/AppComponent.kt +++ b/app/src/main/java/com/fastaccess/github/di/components/AppComponent.kt @@ -9,7 +9,6 @@ import com.fastaccess.github.platform.workmanager.DaggerWorkerFactory import dagger.BindsInstance import dagger.Component import dagger.android.AndroidInjector -import dagger.android.support.AndroidSupportInjectionModule import dagger.android.support.DaggerApplication import javax.inject.Singleton @@ -24,10 +23,7 @@ import javax.inject.Singleton NetworkModule::class, RepositoryModule::class, ActivityBindingModule::class, - FragmentBindingModule::class, - DialogFragmentBindingModule::class, - RepositoryModule::class, - AndroidSupportInjectionModule::class] + RepositoryModule::class ] ) interface AppComponent : AndroidInjector { diff --git a/app/src/main/java/com/fastaccess/github/di/modules/ActivityBindingModule.kt b/app/src/main/java/com/fastaccess/github/di/modules/ActivityBindingModule.kt index 36d2af17..f51e29e6 100644 --- a/app/src/main/java/com/fastaccess/github/di/modules/ActivityBindingModule.kt +++ b/app/src/main/java/com/fastaccess/github/di/modules/ActivityBindingModule.kt @@ -11,12 +11,18 @@ import com.fastaccess.github.ui.modules.profile.ProfileActivity import com.fastaccess.github.ui.modules.trending.TrendingActivity import dagger.Module import dagger.android.ContributesAndroidInjector +import dagger.android.support.AndroidSupportInjectionModule /** * Created by Kosh on 12.05.18. */ @Suppress("unused") -@Module +@Module( + includes = [ + AndroidSupportInjectionModule::class, + FragmentBindingModule::class, + DialogFragmentBindingModule::class] +) abstract class ActivityBindingModule { @PerActivity @ContributesAndroidInjector abstract fun mainActivity(): MainActivity @PerActivity @ContributesAndroidInjector abstract fun loginChooser(): LoginChooserActivity diff --git a/app/src/main/java/com/fastaccess/github/di/modules/DialogFragmentBindingModule.kt b/app/src/main/java/com/fastaccess/github/di/modules/DialogFragmentBindingModule.kt index 6eb00664..6ef1cd25 100644 --- a/app/src/main/java/com/fastaccess/github/di/modules/DialogFragmentBindingModule.kt +++ b/app/src/main/java/com/fastaccess/github/di/modules/DialogFragmentBindingModule.kt @@ -1,6 +1,7 @@ package com.fastaccess.github.di.modules import com.fastaccess.github.di.scopes.PerFragment +import com.fastaccess.github.ui.modules.editor.dialog.CreateLinkDialogFragment import com.fastaccess.github.ui.modules.issuesprs.edit.labels.create.CreateLabelFragment import com.fastaccess.github.ui.modules.issuesprs.edit.milestone.CreateMilestoneDialogFragment import com.fastaccess.github.ui.modules.issuesprs.filter.FilterIssuesPrsBottomSheet @@ -24,4 +25,5 @@ abstract class DialogFragmentBindingModule { @PerFragment @ContributesAndroidInjector abstract fun provideFilterIssuesPrsBottomSheet(): FilterIssuesPrsBottomSheet @PerFragment @ContributesAndroidInjector abstract fun provideFilterSearchBottomSheet(): FilterSearchBottomSheet @PerFragment @ContributesAndroidInjector abstract fun provideFilterTrendingBottomSheet(): FilterTrendingBottomSheet + @PerFragment @ContributesAndroidInjector abstract fun provideCreateLinkDialogFragment(): CreateLinkDialogFragment } \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/github/di/modules/NetworkModule.kt b/app/src/main/java/com/fastaccess/github/di/modules/NetworkModule.kt index 098ff0f7..dba3f7e3 100644 --- a/app/src/main/java/com/fastaccess/github/di/modules/NetworkModule.kt +++ b/app/src/main/java/com/fastaccess/github/di/modules/NetworkModule.kt @@ -64,6 +64,24 @@ class NetworkModule { .addInterceptor(httpLoggingInterceptor) .build() + @Named("imgurClient") @Singleton @Provides fun provideHttpClientForImgur( + httpLoggingInterceptor: HttpLoggingInterceptor + ): OkHttpClient = OkHttpClient + .Builder() + .addInterceptor(Pandora.get().interceptor) + .addInterceptor(httpLoggingInterceptor) + .addInterceptor(object : Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + val original = chain.request() + val requestBuilder = original.newBuilder() + requestBuilder.header("Authorization", "Client-ID " + BuildConfig.IMGUR_CLIENT_ID) + requestBuilder.method(original.method, original.body) + val request = requestBuilder.build() + return chain.proceed(request) + } + }) + .build() + @Named("apolloClient") @Singleton @Provides fun provideHttpClientForApollo( auth: AuthenticationInterceptor, httpLoggingInterceptor: HttpLoggingInterceptor @@ -108,6 +126,14 @@ class NetworkModule { @Singleton @Provides fun provideOrganizationService(retrofit: Retrofit): OrganizationService = retrofit.create(OrganizationService::class.java) @Singleton @Provides fun provideIssueService(retrofit: Retrofit): IssuePrService = retrofit.create(IssuePrService::class.java) @Singleton @Provides fun provideRepoService(retrofit: Retrofit): RepoService = retrofit.create(RepoService::class.java) + @Singleton @Provides fun provideImgurService( + retrofit: Retrofit.Builder, + @Named("imgurClient") okHttpClient: OkHttpClient + ): ImgurService = retrofit + .baseUrl(BuildConfig.IMGUR_URL) + .client(okHttpClient) + .build() + .create(ImgurService::class.java) } class AuthenticationInterceptor( diff --git a/app/src/main/java/com/fastaccess/github/di/modules/ViewModelModule.kt b/app/src/main/java/com/fastaccess/github/di/modules/ViewModelModule.kt index 5e17b92f..3713db9f 100644 --- a/app/src/main/java/com/fastaccess/github/di/modules/ViewModelModule.kt +++ b/app/src/main/java/com/fastaccess/github/di/modules/ViewModelModule.kt @@ -6,6 +6,7 @@ import com.fastaccess.github.di.annotations.ViewModelKey import com.fastaccess.github.platform.viewmodel.FastHubViewModelFactory import com.fastaccess.github.ui.modules.auth.LoginChooserViewModel import com.fastaccess.github.ui.modules.auth.login.LoginViewModel +import com.fastaccess.github.ui.modules.editor.dialog.UploadPictureViewModel import com.fastaccess.github.ui.modules.feed.fragment.viewmodel.FeedsViewModel import com.fastaccess.github.ui.modules.issue.fragment.viewmodel.IssueTimelineViewModel import com.fastaccess.github.ui.modules.issuesprs.edit.assignees.viewmodel.AssigneesViewModel @@ -96,4 +97,7 @@ abstract class ViewModelModule { @Binds @IntoMap @ViewModelKey(MilestoneViewModel::class) abstract fun bindMilestoneViewModel(viewModel: MilestoneViewModel): ViewModel + + @Binds @IntoMap @ViewModelKey(UploadPictureViewModel::class) + abstract fun bindUploadPictureViewModel(viewModel: UploadPictureViewModel): ViewModel } \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/github/ui/modules/editor/EditorFragment.kt b/app/src/main/java/com/fastaccess/github/ui/modules/editor/EditorFragment.kt index 73aac09f..d533773d 100644 --- a/app/src/main/java/com/fastaccess/github/ui/modules/editor/EditorFragment.kt +++ b/app/src/main/java/com/fastaccess/github/ui/modules/editor/EditorFragment.kt @@ -5,17 +5,23 @@ import android.content.Intent import android.os.Bundle import android.text.Editable import android.view.View +import android.widget.EditText +import androidx.core.view.isVisible import com.fastaccess.data.storage.FastHubSharedPreference import com.fastaccess.github.R import com.fastaccess.github.base.BaseFragment import com.fastaccess.github.base.BaseViewModel import com.fastaccess.github.extensions.getDrawableCompat import com.fastaccess.github.extensions.isTrue +import com.fastaccess.github.extensions.show import com.fastaccess.github.platform.mentions.MentionsPresenter +import com.fastaccess.github.ui.modules.editor.dialog.CreateLinkDialogFragment import com.fastaccess.github.ui.widget.dialog.IconDialogFragment import com.fastaccess.github.utils.EXTRA import com.fastaccess.github.utils.extensions.asString +import com.fastaccess.github.utils.extensions.showKeyboard import com.fastaccess.markdown.MarkdownProvider +import com.fastaccess.markdown.widget.MarkdownLayout import com.otaliastudios.autocomplete.Autocomplete import com.otaliastudios.autocomplete.AutocompleteCallback import com.otaliastudios.autocomplete.CharPolicy @@ -27,12 +33,15 @@ import javax.inject.Inject /** * Created by Kosh on 2019-07-20. */ -class EditorFragment : BaseFragment(), IconDialogFragment.IconDialogClickListener { +class EditorFragment : BaseFragment(), IconDialogFragment.IconDialogClickListener, + MarkdownLayout.MarkdownLayoutCallback, + CreateLinkDialogFragment.OnLinkSelected { @Inject lateinit var markwon: Markwon @Inject lateinit var preference: FastHubSharedPreference @Inject lateinit var mentionsPresenter: MentionsPresenter @Inject lateinit var markwonAdapterBuilder: MarkwonAdapter.Builder + override fun viewModel(): BaseViewModel? = null override fun layoutRes(): Int = R.layout.editor_fragment_layout @@ -44,6 +53,8 @@ class EditorFragment : BaseFragment(), IconDialogFragment.IconDialogClickListene if (savedInstanceState == null) { editText.setText(arguments?.getString(EXTRA) ?: "") } + editText.showKeyboard() + editText.setSelection(editText.asString().length) setupToolbar(R.string.markdown, R.menu.submit_menu) { item -> val intent = Intent().apply { putExtra(EXTRA, editText.asString()) @@ -53,7 +64,8 @@ class EditorFragment : BaseFragment(), IconDialogFragment.IconDialogClickListene } mentionsPresenter.isMatchParent = true setToolbarNavigationIcon(R.drawable.ic_clear) - markdownLayout.init(editText) + markdownLayout.layoutCallback = this + markdownLayout.init() initEditText() } @@ -78,6 +90,28 @@ class EditorFragment : BaseFragment(), IconDialogFragment.IconDialogClickListene positive.isTrue { activity?.finish() } } + override fun provideEditText(): EditText = editText + override fun provideReview(isReview: Boolean) { + if (isReview) { + preview.isVisible = true + markwon.setMarkdown(preview, editText.asString()) + } else { + preview.setText("") + preview.isVisible = false + } + } + + override fun openLinkDialog(isImage: Boolean) = CreateLinkDialogFragment.newInstance(isImage).show(childFragmentManager) + + override fun onLinkSelected( + title: String, + link: String, + isImage: Boolean + ) { + //TODO upload pic and get URL + markdownLayout.onLinkSelected(title, link, isImage) + } + private fun initEditText() { Autocomplete.on(editText) .with(CharPolicy('@')) diff --git a/app/src/main/java/com/fastaccess/github/ui/modules/editor/dialog/CreateLinkDialogFragment.kt b/app/src/main/java/com/fastaccess/github/ui/modules/editor/dialog/CreateLinkDialogFragment.kt new file mode 100644 index 00000000..b2c49c60 --- /dev/null +++ b/app/src/main/java/com/fastaccess/github/ui/modules/editor/dialog/CreateLinkDialogFragment.kt @@ -0,0 +1,115 @@ +package com.fastaccess.github.ui.modules.editor.dialog + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.View +import android.widget.Toast +import androidx.core.os.bundleOf +import androidx.core.view.isVisible +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.ViewModelProviders +import com.fastaccess.github.R +import com.fastaccess.github.base.BaseDialogFragment +import com.fastaccess.github.extensions.isTrue +import com.fastaccess.github.extensions.observeNotNull +import com.fastaccess.github.utils.EXTRA +import com.fastaccess.github.utils.extensions.asString +import com.github.dhaval2404.imagepicker.ImagePicker +import kotlinx.android.synthetic.main.create_link_dialog_layout.* +import javax.inject.Inject + +/** + * Created by Kosh on 2019-07-29. + */ +class CreateLinkDialogFragment : BaseDialogFragment() { + + @Inject lateinit var viewModelFactory: ViewModelProvider.Factory + private val viewModel by lazy { ViewModelProviders.of(this, viewModelFactory).get(UploadPictureViewModel::class.java) } + + private val isImage by lazy { arguments?.getBoolean(EXTRA) ?: false } + private var callback: OnLinkSelected? = null + + override fun onAttach(context: Context) { + super.onAttach(context) + callback = parentFragment as OnLinkSelected // crash if it isn't ;) + } + + override fun onDetach() { + callback = null + super.onDetach() + } + + override fun layoutRes(): Int = R.layout.create_link_dialog_layout + + override fun onViewCreated( + view: View, + savedInstanceState: Bundle? + ) { + super.onViewCreated(view, savedInstanceState) + + isImage.isTrue { + selectImage.isVisible = true + selectImage.setOnClickListener { + ImagePicker.with(this) + .start() + } + } + cancel.setOnClickListener { dismiss() } + submit.setOnClickListener { + val title = titleEditText.asString() + val link = linkEditText.asString() + if (title.isNotBlank() && link.isNotBlank()) { + if (isImage) { + viewModel.upload(title, link) + } else { + callback?.onLinkSelected(title, link, false) + dismiss() + } + } + } + observeData() + } + + private fun observeData() { + viewModel.progress.observeNotNull(this) { + buttonsLayout.isVisible = !it + progress.isVisible = it + } + viewModel.error.observeNotNull(this) { + Toast.makeText(requireContext().applicationContext, it.message, Toast.LENGTH_LONG).show() + } + viewModel.uploadedFileLiveData.observeNotNull(this) { + val title = titleEditText.asString() + callback?.onLinkSelected(title, it, isImage) + dismiss() + } + } + + override fun onActivityResult( + requestCode: Int, + resultCode: Int, + data: Intent? + ) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + val file = ImagePicker.getFilePath(data) ?: return + linkEditText.setText(file) + } + } + + companion object { + fun newInstance(isImage: Boolean = false) = CreateLinkDialogFragment().apply { + arguments = bundleOf(EXTRA to isImage) + } + } + + interface OnLinkSelected { + fun onLinkSelected( + title: String, + link: String, + isImage: Boolean + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/github/ui/modules/editor/dialog/UploadPictureViewModel.kt b/app/src/main/java/com/fastaccess/github/ui/modules/editor/dialog/UploadPictureViewModel.kt new file mode 100644 index 00000000..e1999005 --- /dev/null +++ b/app/src/main/java/com/fastaccess/github/ui/modules/editor/dialog/UploadPictureViewModel.kt @@ -0,0 +1,42 @@ +package com.fastaccess.github.ui.modules.editor.dialog + +import androidx.lifecycle.MutableLiveData +import com.fastaccess.data.model.FastHubErrors +import com.fastaccess.data.repository.SchedulerProvider +import com.fastaccess.domain.repository.services.ImgurService +import com.fastaccess.github.base.BaseViewModel +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.RequestBody.Companion.asRequestBody +import java.io.File +import javax.inject.Inject + +/** + * Created by Kosh on 2019-07-29. + */ +class UploadPictureViewModel @Inject constructor( + private val service: ImgurService, + private val scheduler: SchedulerProvider +) : BaseViewModel() { + + val uploadedFileLiveData = MutableLiveData() + + fun upload( + title: String, + path: String + ) { + val image = File(path).asRequestBody("image/*".toMediaTypeOrNull()) + justSubscribe( + service.postImage(title, image) + .subscribeOn(scheduler.ioThread()) + .observeOn(scheduler.uiThread()) + .doOnNext { + val link = it.data?.link + if (!link.isNullOrEmpty()) { + uploadedFileLiveData.postValue(link) + } else { + error.postValue(FastHubErrors(FastHubErrors.ErrorType.OTHER)) + } + } + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/github/ui/modules/issue/fragment/IssueFragment.kt b/app/src/main/java/com/fastaccess/github/ui/modules/issue/fragment/IssueFragment.kt index 018f1976..bd496f61 100644 --- a/app/src/main/java/com/fastaccess/github/ui/modules/issue/fragment/IssueFragment.kt +++ b/app/src/main/java/com/fastaccess/github/ui/modules/issue/fragment/IssueFragment.kt @@ -263,7 +263,9 @@ class IssueFragment : BaseFragment(), LockUnlockFragment.OnLockReasonSelected, opener.text = SpannableBuilder.builder() .bold(model.author?.login) + .space() .append(getString(R.string.opened_this_issue)) + .space() .append(model.createdAt?.timeAgo()) userIcon.loadAvatar(model.author?.avatarUrl, model.author?.url ?: "") diff --git a/app/src/main/java/com/fastaccess/github/ui/modules/issuesprs/edit/EditIssuePrFragment.kt b/app/src/main/java/com/fastaccess/github/ui/modules/issuesprs/edit/EditIssuePrFragment.kt index bbfb6441..baa06869 100644 --- a/app/src/main/java/com/fastaccess/github/ui/modules/issuesprs/edit/EditIssuePrFragment.kt +++ b/app/src/main/java/com/fastaccess/github/ui/modules/issuesprs/edit/EditIssuePrFragment.kt @@ -46,6 +46,7 @@ class EditIssuePrFragment : BaseFragment() { toolbar.subtitle = "${model.login}/${model.repo}/${getString(R.string.issue)}${if (model.isCreate) "" else "#${model.number}"}" setToolbarNavigationIcon(R.drawable.ic_clear) toolbar.inflateMenu(R.menu.submit_menu) + toolbar.setNavigationOnClickListener { activity?.onBackPressed() } if (savedInstanceState == null) { titleEditText.setText(model.title) diff --git a/app/src/main/res/layouts/main_layouts/layout/create_link_dialog_layout.xml b/app/src/main/res/layouts/main_layouts/layout/create_link_dialog_layout.xml new file mode 100644 index 00000000..291cffc4 --- /dev/null +++ b/app/src/main/res/layouts/main_layouts/layout/create_link_dialog_layout.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build-dependecies/fasthub-dependencies.gradle b/build-dependecies/fasthub-dependencies.gradle index a1c321be..2aacdeed 100644 --- a/build-dependecies/fasthub-dependencies.gradle +++ b/build-dependecies/fasthub-dependencies.gradle @@ -57,14 +57,15 @@ ext { ] extrasLibraries = [ + "com.airbnb:deeplinkdispatch:$deepLinkDispatch", + "com.evernote:android-state:$androidState", 'com.github.daniel-stoneuk:material-about-library:2.1.0', 'com.scottyab:secure-preferences-lib:0.1.7', - "com.airbnb:deeplinkdispatch:$deepLinkDispatch", 'com.airbnb.android:lottie:3.0.7', - "com.evernote:android-state:$androidState", 'org.jsoup:jsoup:1.12.1', 'com.github.k0shk0sh:RetainedDateTimePickers:1.0.2', - 'com.otaliastudios:autocomplete:1.1.0' + 'com.otaliastudios:autocomplete:1.1.0', + 'com.github.dhaval2404:imagepicker:1.3' ] networking = [ diff --git a/domain/src/main/java/com/fastaccess/domain/repository/services/ImgurService.kt b/domain/src/main/java/com/fastaccess/domain/repository/services/ImgurService.kt new file mode 100644 index 00000000..2b301d49 --- /dev/null +++ b/domain/src/main/java/com/fastaccess/domain/repository/services/ImgurService.kt @@ -0,0 +1,18 @@ +package com.fastaccess.domain.repository.services + +import com.fastaccess.domain.response.ImgureResponseModel +import io.reactivex.Observable +import okhttp3.RequestBody +import retrofit2.http.Body +import retrofit2.http.POST +import retrofit2.http.Query + + +/** + * Created by Kosh on 2019-07-29. + */ +interface ImgurService { + @POST("image") + fun postImage(@Query("title") title: String, @Body body: RequestBody): Observable + +} \ No newline at end of file diff --git a/domain/src/main/java/com/fastaccess/domain/response/ImgureResponseModel.kt b/domain/src/main/java/com/fastaccess/domain/response/ImgureResponseModel.kt new file mode 100644 index 00000000..c06002ee --- /dev/null +++ b/domain/src/main/java/com/fastaccess/domain/response/ImgureResponseModel.kt @@ -0,0 +1,18 @@ +package com.fastaccess.domain.response + +import com.google.gson.annotations.SerializedName + +/** + * Created by Kosh on 2019-07-29. + */ +data class ImgureResponseModel( + @SerializedName("success") var isSuccess: Boolean? = null, + @SerializedName("status") var status: Int? = null, + @SerializedName("data") var data: ImgurImage? = null +) + +data class ImgurImage( + @SerializedName("title") var title: String? = null, + @SerializedName("description") var description: String? = null, + @SerializedName("link") var link: String? = null +) \ No newline at end of file diff --git a/markdown/src/main/java/com/fastaccess/markdown/widget/MarkdownLayout.kt b/markdown/src/main/java/com/fastaccess/markdown/widget/MarkdownLayout.kt index e5c042f6..0e929e60 100644 --- a/markdown/src/main/java/com/fastaccess/markdown/widget/MarkdownLayout.kt +++ b/markdown/src/main/java/com/fastaccess/markdown/widget/MarkdownLayout.kt @@ -5,6 +5,7 @@ import android.util.AttributeSet import android.view.View import android.widget.EditText import android.widget.LinearLayout +import androidx.core.view.isVisible import com.fastaccess.markdown.MarkdownProvider import com.fastaccess.markdown.R import kotlinx.android.synthetic.main.markdown_buttons_layout.view.* @@ -14,7 +15,8 @@ import kotlinx.android.synthetic.main.markdown_buttons_layout.view.* */ class MarkdownLayout : LinearLayout, View.OnClickListener { - private lateinit var editText: EditText + lateinit var layoutCallback: MarkdownLayoutCallback + constructor(context: Context?) : super(context) constructor( @@ -35,8 +37,7 @@ class MarkdownLayout : LinearLayout, View.OnClickListener { if (isInEditMode) return } - fun init(editText: EditText) { - this.editText = editText + fun init() { headerOne.setOnClickListener(this) headerTwo.setOnClickListener(this) headerThree.setOnClickListener(this) @@ -55,10 +56,12 @@ class MarkdownLayout : LinearLayout, View.OnClickListener { inlineCode.setOnClickListener(this) addEmoji.setOnClickListener(this) signature.setOnClickListener(this) + view.setOnClickListener(this) } override fun onClick(v: View?) { + val editText = layoutCallback.provideEditText() if (editText.selectionEnd == -1 || editText.selectionStart == -1) { return } @@ -75,12 +78,36 @@ class MarkdownLayout : LinearLayout, View.OnClickListener { R.id.code -> MarkdownProvider.addCode(editText) R.id.numbered -> MarkdownProvider.addList(editText, "1") R.id.quote -> MarkdownProvider.addQuote(editText) - R.id.link -> MarkdownProvider.addLink(editText, "", "") - R.id.image -> MarkdownProvider.addPhoto(editText, "", "") + R.id.link -> layoutCallback.openLinkDialog() + R.id.image -> layoutCallback.openLinkDialog(true) R.id.unCheckbox -> MarkdownProvider.addList(editText, "- [x]") R.id.checkbox -> MarkdownProvider.addList(editText, "- [ ]") R.id.inlineCode -> MarkdownProvider.addInlinleCode(editText) + R.id.view -> { + val isPreview = editText.isVisible + editText.isVisible = !isPreview + layoutCallback.provideReview(isPreview) + } } } } + + fun onLinkSelected( + title: String, + link: String, + isImage: Boolean + ) { + val editText = layoutCallback.provideEditText() + if (isImage) { + MarkdownProvider.addPhoto(editText, title, link) + } else { + MarkdownProvider.addLink(editText, title, link) + } + } + + interface MarkdownLayoutCallback { + fun provideEditText(): EditText + fun provideReview(isReview: Boolean) + fun openLinkDialog(isImage: Boolean = false) + } } \ No newline at end of file