• Android Studio 插件开发2、网络请求、创建dialog、trello获取cardId等


    网络请求

    点击这里就出来一个弹框

     

    更新Actions

    关注这个

    1. <actions>
    2. <action id="TrelloAction"
    3. class="com.anguomob.anguo.actions.trello.TrelloAction"
    4. text="TrelloAction"
    5. description="Move a trello card from to do to the next list"/>
    6. <group id="MyPlugin.TopMnu" text="安果" description="安果专用组件">
    7. <reference id="TrelloAction"/>
    8. <action id="Demo Action"
    9. class="com.anguomob.anguo.actions.HelloWordAction"
    10. text="测试标题"
    11. description="测试通知标题"
    12. >
    13. <keyboard-shortcut first-keystroke="ctrl alt p" keymap="$default"/>
    14. </action>
    15. <add-to-group group-id="MainMenu" anchor="last"/>
    16. </group>
    17. <group id="SecondGroup" text="_My Second Group" popup="true">
    18. <add-to-group group-id="MyPlugin.TopMnu" anchor="first"/>
    19. <reference id="TrelloAction"/>
    20. </group>
    21. </actions>

    程序底部导入网络请求api

    1. dependencies {
    2. //导入 retrofit 和rxjava
    3. implementation("com.squareup.retrofit2:retrofit:2.9.0")
    4. implementation("com.squareup.retrofit2:converter-gson:2.9.0")
    5. implementation("com.squareup.retrofit2:adapter-rxjava2:2.9.0")
    6. implementation("io.reactivex.rxjava2:rxjava:2.2.21")
    7. implementation("io.reactivex.rxjava2:rxandroid:2.1.1")
    8. //导入swing 0.3.0
    9. implementation("com.github.akarnokd:rxjava2-swing:0.3.0")
    10. }

     出来弹框我们先看到的就是布局

    直接从头开始写吧

    1. package com.anguomob.anguo.actions.trello
    2. import com.intellij.openapi.actionSystem.AnAction
    3. import com.intellij.openapi.actionSystem.AnActionEvent
    4. class TrelloAction :AnAction() {
    5. override fun actionPerformed(event: AnActionEvent) {
    6. val dialog=TrelloForm(event.project!!,TrelloInjectorImp())
    7. dialog.show()
    8. }
    9. }

    创建一个dialog 并且展示布局

    采用了mvp模式 

    1. package com.anguomob.anguo.actions.trello
    2. import retrofit2.Retrofit
    3. import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
    4. import retrofit2.converter.gson.GsonConverterFactory
    5. interface TrelloInjector {
    6. val trelloRepository: TrelloRepository
    7. val trelloServiceApi: TrelloServiceApi
    8. fun trelloActionPresenter(view: TrelloFromView): TrelloActionPresenter
    9. }
    10. class TrelloInjectorImp : TrelloInjector {
    11. override val trelloRepository: TrelloRepository by lazy {
    12. TrelloRepositoryImp(trelloServiceApi)
    13. }
    14. override val trelloServiceApi: TrelloServiceApi by lazy {
    15. Retrofit.Builder().addCallAdapterFactory(RxJava2CallAdapterFactory.create())
    16. .addConverterFactory(GsonConverterFactory.create()).baseUrl("https://api.trello.com/").build()
    17. .create(TrelloServiceApi::class.java)
    18. }
    19. override fun trelloActionPresenter(view: TrelloFromView): TrelloActionPresenter {
    20. return TrelloActionPresenterImp(view, trelloRepository)
    21. }
    22. }

    仓库api

    1. package com.anguomob.anguo.actions.trello
    2. import hu.akarnokd.rxjava2.swing.SwingSchedulers
    3. import io.reactivex.Completable
    4. import io.reactivex.Single
    5. import io.reactivex.schedulers.Schedulers
    6. interface TrelloRepository {
    7. fun getCards(formListId: String, key: String, token: String): Single>
    8. fun moveCard(cardId: String, toListId: String, key: String, token: String): Completable
    9. }
    10. class TrelloRepositoryImp(private val trelloServiceApi: TrelloServiceApi) : TrelloRepository {
    11. override fun getCards(formListId: String, key: String, token: String): Single> {
    12. return trelloServiceApi.getCards(formListId, key, token).subscribeOn(Schedulers.io())
    13. .observeOn(SwingSchedulers.edt())
    14. }
    15. override fun moveCard(cardId: String, toListId: String, key: String, token: String): Completable {
    16. return trelloServiceApi.moveCardToList(cardId, toListId, key, token)
    17. .subscribeOn(Schedulers.io())
    18. .observeOn(SwingSchedulers.edt())
    19. }
    20. }

    servicesApi

    1. package com.anguomob.anguo.actions.trello
    2. import io.reactivex.Completable
    3. import io.reactivex.Single
    4. import retrofit2.http.GET
    5. import retrofit2.http.PUT
    6. import retrofit2.http.Path
    7. import retrofit2.http.Query
    8. interface TrelloServiceApi {
    9. @GET("1/boards/{listId}/cards")
    10. fun getCards(
    11. @Path("listId") listId: String, @Query("key") key: String, @Query("token") token: String
    12. ): Single>
    13. @PUT("1/cards/{cardId}")
    14. fun moveCardToList(
    15. @Path("cardId") cardId: String,
    16. @Query("idList") idList: String,
    17. @Query("key") key: String,
    18. @Query("token") token: String
    19. ): Completable
    20. }

    数据bean

    1. package com.anguomob.anguo.actions.trello
    2. data class Card(val id: String, val name: String, val desc: String)

    view点击产生的回调

    1. package com.anguomob.anguo.actions.trello
    2. interface TrelloFromView {
    3. fun showCards(cards:List<Card>)
    4. fun success(card: Card)
    5. fun error(error: Throwable)
    6. }

    布局内容

    1. package com.anguomob.anguo.actions.trello
    2. import com.intellij.notification.NotificationDisplayType
    3. import com.intellij.notification.NotificationGroup
    4. import com.intellij.notification.NotificationType
    5. import com.intellij.openapi.application.ApplicationManager
    6. import com.intellij.openapi.project.Project
    7. import com.intellij.openapi.ui.ComboBox
    8. import com.intellij.openapi.ui.DialogWrapper
    9. import com.intellij.ui.layout.panel
    10. import java.awt.Dimension
    11. import javax.swing.*
    12. class TrelloForm(
    13. val project: Project, trelloInjector: TrelloInjector
    14. ) : DialogWrapper(project), TrelloFromView {
    15. private var nameCombo: ComboBox = ComboBox().apply {
    16. name = "nameCombo"
    17. }
    18. private var descriptionTextPanel: JTextPane = JTextPane().apply {
    19. name = "descriptionTextPanel"
    20. text = "test"
    21. isEnabled = false
    22. }
    23. private val presenter: TrelloActionPresenter by lazy {
    24. trelloInjector.trelloActionPresenter(this)
    25. }
    26. init {
    27. init()
    28. nameCombo.addActionListener {
    29. val card = nameCombo.selectedItem as Card?
    30. card?.let {
    31. descriptionTextPanel.text = it.desc
    32. }
    33. }
    34. presenter.loadCards()
    35. }
    36. override fun createCenterPanel(): JComponent = panel {
    37. row("Name: ") {
    38. nameCombo(grow)
    39. }
    40. row("Description") {
    41. descriptionTextPanel()
    42. }
    43. }.apply {
    44. minimumSize = Dimension(500, 340)
    45. preferredSize = Dimension(500, 340)
    46. }
    47. override fun showCards(cards: List<Card>) {
    48. cards.map {
    49. nameCombo.addItem(it)
    50. }
    51. if (cards.isNotEmpty()) {
    52. nameCombo.selectedIndex = 0
    53. }
    54. }
    55. override fun success(card: Card) {
    56. close(OK_EXIT_CODE)
    57. ApplicationManager.getApplication().invokeLater {
    58. //创建通知
    59. val notification = NotificationGroup("success", NotificationDisplayType.BALLOON, true).createNotification(
    60. "成功啦",
    61. "Move card to newList",
    62. NotificationType.INFORMATION,
    63. null
    64. )
    65. notification.notify(project)
    66. }
    67. }
    68. override fun error(error: Throwable) {
    69. ApplicationManager.getApplication().invokeLater {
    70. //创建通知
    71. val notification = NotificationGroup("error", NotificationDisplayType.BALLOON, true).createNotification(
    72. "error",
    73. error.localizedMessage,
    74. NotificationType.INFORMATION,
    75. null
    76. )
    77. notification.notify(project)
    78. }
    79. }
    80. }

    核心代码

    1. package com.anguomob.anguo.actions.trello
    2. interface TrelloActionPresenter {
    3. fun loadCards()
    4. fun moveCard(card: Card)
    5. }
    6. class TrelloActionPresenterImp(private val view: TrelloFromView, private val repository: TrelloRepository) :
    7. TrelloActionPresenter {
    8. val fromListId="xxx"
    9. val toListId="xxx"
    10. val apiKey="xx"
    11. val token="xxxxx"
    12. override fun loadCards() {
    13. repository.getCards(fromListId, apiKey, token)
    14. .subscribe({ cards -> view.showCards(cards) }, { error -> view.error(error) })
    15. }
    16. override fun moveCard(card: Card) {
    17. repository.moveCard(card.id, toListId, apiKey, token)
    18. .subscribe({ view.success(card) }, { error -> view.error(error) })
    19. }
    20. }

    moveCard 还没用到。

    这个loadCards用到了

    这个用的是 fromListId

    这个id可获取有点费劲

    来我教你们

    GET获取看板列表

    https://api.trello.com/1/members/me/boards?key={{APIKey}}&token={{APIToken}}
    1. var jsonData = pm.response.json();
    2. var boardCardId= jsonData['0']['id']
    3. pm.environment.set("BoardCardId", boardCardId);

    然后取出来第一个参数 那么这个参数就是看板咯

    看板的cards的 列表id就是这个。

    稍微一等 布局就会加载列表

     

    并且选了以后可以把描述打出来

    这个插件功能先到这里咯。更多精彩我还在学习。。

  • 相关阅读:
    Codeforces Round 895 div3 | JorbanS
    自定义hooks之useLastState、useSafeState
    【✨十五天搞定电工基础】正弦交流电路的分析
    Photoshop 2024(ps ai beta) v25.0
    Unity基于C#事件委托机制
    tomcat注册为服务
    HTTPS详解
    Selinux
    【深入理解C++】vector
    Visopsys 0.92 发布
  • 原文地址:https://blog.csdn.net/mp624183768/article/details/127939606