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

news2025/7/9 5:46:36

网络请求

点击这里就出来一个弹框

 

更新Actions

关注这个

  <actions>
        <action id="TrelloAction"
                class="com.anguomob.anguo.actions.trello.TrelloAction"
                text="TrelloAction"
                description="Move a trello card from to do to the next list"/>

        <group id="MyPlugin.TopMnu" text="安果" description="安果专用组件">

            <reference id="TrelloAction"/>

            <action id="Demo Action"
                    class="com.anguomob.anguo.actions.HelloWordAction"
                    text="测试标题"
                    description="测试通知标题"
            >
                <keyboard-shortcut first-keystroke="ctrl alt p" keymap="$default"/>
            </action>
            <add-to-group group-id="MainMenu" anchor="last"/>


        </group>
        <group id="SecondGroup" text="_My Second Group" popup="true">
            <add-to-group group-id="MyPlugin.TopMnu" anchor="first"/>
            <reference id="TrelloAction"/>
        </group>
    </actions>

程序底部导入网络请求api

dependencies {
    //导入 retrofit 和rxjava
    implementation("com.squareup.retrofit2:retrofit:2.9.0")
    implementation("com.squareup.retrofit2:converter-gson:2.9.0")
    implementation("com.squareup.retrofit2:adapter-rxjava2:2.9.0")
    implementation("io.reactivex.rxjava2:rxjava:2.2.21")
    implementation("io.reactivex.rxjava2:rxandroid:2.1.1")
    //导入swing 0.3.0
    implementation("com.github.akarnokd:rxjava2-swing:0.3.0")
}

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

直接从头开始写吧

package com.anguomob.anguo.actions.trello

import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent

class TrelloAction :AnAction() {
    override fun actionPerformed(event: AnActionEvent) {
       val dialog=TrelloForm(event.project!!,TrelloInjectorImp())
        dialog.show()
    }
}

创建一个dialog 并且展示布局

采用了mvp模式 

package com.anguomob.anguo.actions.trello

import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory

interface TrelloInjector {
    val trelloRepository: TrelloRepository
    val trelloServiceApi: TrelloServiceApi
    fun trelloActionPresenter(view: TrelloFromView): TrelloActionPresenter
}

class TrelloInjectorImp : TrelloInjector {
    override val trelloRepository: TrelloRepository by lazy {
        TrelloRepositoryImp(trelloServiceApi)
    }
    override val trelloServiceApi: TrelloServiceApi by lazy {
        Retrofit.Builder().addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create()).baseUrl("https://api.trello.com/").build()
            .create(TrelloServiceApi::class.java)
    }

    override fun trelloActionPresenter(view: TrelloFromView): TrelloActionPresenter {
        return TrelloActionPresenterImp(view, trelloRepository)
    }
}

仓库api

package com.anguomob.anguo.actions.trello

import hu.akarnokd.rxjava2.swing.SwingSchedulers
import io.reactivex.Completable
import io.reactivex.Single
import io.reactivex.schedulers.Schedulers

interface TrelloRepository {
    fun getCards(formListId: String, key: String, token: String): Single<List<Card>>
    fun moveCard(cardId: String, toListId: String, key: String, token: String): Completable
}

class TrelloRepositoryImp(private val trelloServiceApi: TrelloServiceApi) : TrelloRepository {
    override fun getCards(formListId: String, key: String, token: String): Single<List<Card>> {
        return trelloServiceApi.getCards(formListId, key, token).subscribeOn(Schedulers.io())
            .observeOn(SwingSchedulers.edt())
    }

    override fun moveCard(cardId: String, toListId: String, key: String, token: String): Completable {
        return trelloServiceApi.moveCardToList(cardId, toListId, key, token)
            .subscribeOn(Schedulers.io())
            .observeOn(SwingSchedulers.edt())
    }

}

servicesApi

package com.anguomob.anguo.actions.trello

import io.reactivex.Completable
import io.reactivex.Single
import retrofit2.http.GET
import retrofit2.http.PUT
import retrofit2.http.Path
import retrofit2.http.Query

interface TrelloServiceApi {
    @GET("1/boards/{listId}/cards")
    fun getCards(
        @Path("listId") listId: String, @Query("key") key: String, @Query("token") token: String
    ): Single<List<Card>>

    @PUT("1/cards/{cardId}")
    fun moveCardToList(
        @Path("cardId") cardId: String,
        @Query("idList") idList: String,
        @Query("key") key: String,
        @Query("token") token: String
    ): Completable

}

数据bean

package com.anguomob.anguo.actions.trello

data class Card(val id: String, val name: String, val desc: String)

view点击产生的回调

package com.anguomob.anguo.actions.trello


interface TrelloFromView {
    fun showCards(cards:List<Card>)
    fun success(card: Card)
    fun error(error: Throwable)
}

布局内容

package com.anguomob.anguo.actions.trello


import com.intellij.notification.NotificationDisplayType
import com.intellij.notification.NotificationGroup
import com.intellij.notification.NotificationType
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.ComboBox
import com.intellij.openapi.ui.DialogWrapper
import com.intellij.ui.layout.panel
import java.awt.Dimension
import javax.swing.*

class TrelloForm(
    val project: Project, trelloInjector: TrelloInjector
) : DialogWrapper(project), TrelloFromView {

    private var nameCombo: ComboBox<Card> = ComboBox<Card>().apply {
        name = "nameCombo"
    }
    private var descriptionTextPanel: JTextPane = JTextPane().apply {
        name = "descriptionTextPanel"
        text = "test"
        isEnabled = false
    }

    private val presenter: TrelloActionPresenter by lazy {
        trelloInjector.trelloActionPresenter(this)
    }

    init {
        init()

        nameCombo.addActionListener {
            val card = nameCombo.selectedItem as Card?
            card?.let {
                descriptionTextPanel.text = it.desc
            }
        }
        presenter.loadCards()
    }

    override fun createCenterPanel(): JComponent = panel {
        row("Name: ") {
            nameCombo(grow)
        }
        row("Description") {
            descriptionTextPanel()
        }
    }.apply {
        minimumSize = Dimension(500, 340)
        preferredSize = Dimension(500, 340)

    }

    override fun showCards(cards: List<Card>) {
        cards.map {
            nameCombo.addItem(it)
        }
        if (cards.isNotEmpty()) {
            nameCombo.selectedIndex = 0
        }
    }


    override fun success(card: Card) {
        close(OK_EXIT_CODE)
        ApplicationManager.getApplication().invokeLater {
            //创建通知
            val notification = NotificationGroup("success", NotificationDisplayType.BALLOON, true).createNotification(
                    "成功啦",
                    "Move card to newList",
                    NotificationType.INFORMATION,
                    null
                )
            notification.notify(project)
        }
    }

    override fun error(error: Throwable) {
        ApplicationManager.getApplication().invokeLater {
            //创建通知
            val notification = NotificationGroup("error", NotificationDisplayType.BALLOON, true).createNotification(
                    "error",
                    error.localizedMessage,
                    NotificationType.INFORMATION,
                    null
                )
            notification.notify(project)
        }
    }
}

核心代码

package com.anguomob.anguo.actions.trello

interface TrelloActionPresenter {
    fun loadCards()
    fun moveCard(card: Card)
}

class TrelloActionPresenterImp(private val view: TrelloFromView, private val repository: TrelloRepository) :
    TrelloActionPresenter {

    val fromListId="xxx"
    val toListId="xxx"
    val apiKey="xx"
    val token="xxxxx"


    override fun loadCards() {
        repository.getCards(fromListId, apiKey, token)
            .subscribe({ cards -> view.showCards(cards) }, { error -> view.error(error) })
    }

    override fun moveCard(card: Card) {
        repository.moveCard(card.id, toListId, apiKey, token)
            .subscribe({ view.success(card) }, { error -> view.error(error) })
    }
}

moveCard 还没用到。

这个loadCards用到了

这个用的是 fromListId

这个id可获取有点费劲

来我教你们

GET获取看板列表

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

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

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

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

 

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/18266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大神带你玩转异步编程,理论与实践齐飞,敢说是目前最全的讲解了

要完全理解异步编程需要先理解几个概念 任务 我给任务的定义是完成某项功能的单元模块&#xff0c;任务有大有小&#xff0c;站在操作系统的角度&#xff0c;一个程序就是一个任务&#xff0c;每当运行一个程序就会创建一个新的任务&#xff0c;它在操作系统中还有一个无人不…

软件需求分析——需求工程过程

如果有兴趣了解更多相关内容&#xff0c;可以来我的个人网站看看&#xff1a;瞳孔空间 一&#xff1a;相关概念 需求工程过程的目的&#xff1a;介绍为软件加强型系统中的复杂软件设计的需求工程过程&#xff0c;涉及 抽取需求分析需求验证需求管理需求 主要关注点&#xf…

Isaac-gym(7):物理模拟(actor生成、创建、控制等)

1. 创建actor 1.1 actor的创建与句柄 actor是GymAsset的实例。函数create_actor将一个参与者添加到环境中&#xff0c;并返回一个参与者句柄&#xff0c;该句柄可用于以后与该参与者交互。出于性能原因&#xff0c;最好在actor创建期间保存句柄&#xff0c;而不是在模拟运行时…

[同向双指针] 209. 长度最小的子数组 713. 乘积小于 K 的子数组 3. 无重复字符的最长子串

同向双指针 该文结合灵神讲解进行编码&#xff1a;https://www.bilibili.com/video/BV1hd4y1r7Gq 该类滑动窗口一般符合某种单调性。 当不满足条件时左指针后移&#xff0c;当满足条件时右指针后移。 假设数组长度为 n&#xff0c;左指针最多移动 n 次&#xff0c;右指针最…

【无人机】基于RRT算法实现四旋翼无人机的安全和最小能量轨迹规划附matlab代码和报告

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Linux安装RabbitMQ步骤分享

1、Erlnag安装 1.1、 安装Erlang版本要求 Erlang安装需要对应各自的版本 RabbitMQ Erlang Version Requirements — RabbitMQ 1.2、 Erlang安装 1、目录准备 cd /usr/local/src/ mkdir rabbitmq cd rabbitmq2、添加仓库地址 为了减少安装的错误 我们使用仓库安装 ,类似于m…

【算法篇-数论】快速幂

快速幂1. 利用快速幂优化的时间复杂度2. 快速幂方法及代码3.总结文章参考自 B站董晓算法 1. 利用快速幂优化的时间复杂度 所谓的快速幂就是快速计算底数的n次幂暴力求幂的话时间复杂度为O&#xff08;n&#xff09; 利用快速幂可以做到 时间复杂度为 O(log2n) 2. 快速幂方法…

操作系统4小时速成:I/O管理,spooling脱机技术,设备分配,分配数据结构,IO调度,IO子系统,IO控制方式,IO分类

操作系统4小时速成&#xff1a;I/O管理&#xff0c;spooling脱机技术&#xff0c;设备分配&#xff0c;分配数据结构&#xff0c;IO调度&#xff0c;IO子系统&#xff0c;IO控制方式&#xff0c;IO分类 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xf…

一、什么是 MQ

MQ的概念 MQ &#xff08;Message Queue&#xff09;消息队列&#xff0c;是在消息传输过程中存储消息的容器。多用于分布式系统之间的通信。 队列是基础数据结构中 “先进先出” 的一种数据结构。 消息对列&#xff0c;指把要传输的数据消息放在队列中&#xff0c;用队列机制…

SpringBoot:速成总结+实战——员工管理系统

这篇文章先是总结SpringBoot&#xff0c;当然我很多源码都没有仔细的去抠&#xff0c;而且这样一个成熟的框架想都不用想就知道源码很复杂&#xff0c;先学框架怎么用。接着就用SpringBoot完成一个较为简单的项目&#xff1a;员工管理系统。 目录端口号被占用怎么办什么是Sprin…

Hadoop总结——Hadoop基础

一、Hadoop是什么 Hadoop是一个由Apache基金会所开发的分布式系统基础架构 主要解决&#xff0c;海量数据的存储和海量数据的分析计算问题 广义上来说&#xff0c;Hadoop通常是指一个更广泛的概念——Hadoop生态圈 二、Hadoop发展历史 1&#xff09;Lucene--Doug Cutting开…

python中深拷贝和浅拷贝的区别

文章目录值的引用浅拷贝可变数据类型与不可变数据类型不可变数据类型可变数据类型深拷贝深拷贝浅拷贝总结若将需要注释若干行&#xff0c;则将这些行选中&#xff0c;然后按住 ctrl / 键就可以了&#xff0c;再按一次&#xff0c;即可取消多行注释若要批量缩进&#xff0c;那么…

磷脂酰丝氨酸 猪脑(phosphatidylserine,PS)试剂级;丝氨酸磷脂

磷脂酰丝氨酸&#xff08;phosphatidylserine&#xff0c;PS&#xff09;又称丝氨酸磷脂&#xff0c;二酰甘油酰磷酸丝氨酸&#xff0c;简称PS&#xff0c;是一类普遍存在的磷脂&#xff0c;通常位于细胞膜的内层&#xff0c;磷酯化合物中的磷酸甘油酯类&#xff0c;是细胞膜组…

QGIS创建要素与属性

QGIS之矢量操作——创建要素与属性 创建要素 打开常用的工具条&#xff1a;View—Toolbar 这样常用的工具条就加载进来了 新建矢量图层&#xff0c;并设置字段等等&#xff1a; 创建属性&#xff0c;选中你的矢量图层&#xff0c;右键选择Toggle_Editing&#xff08;或者点击…

SpringBoot项目上线运维

文章目录一.高级属性配置1.1 简介1.2 临时属性设置1.3 配置文件的四级分类1.4 自定义配置文件二.多环境开发2.2 多环境开发&#xff08;yaml版&#xff09;2.3 多环境开发多文件版&#xff08;yaml版&#xff09;2.4 多环境开发&#xff08;Properties版&#xff09;2.5 多环境…

这次把怎么做好一个PPT讲清-画图篇

文章目录概述布尔运算PPT幻灯片中如何设置形状对象格式每一个图形既是一个形状&#xff0c;又是一个文本框如何用PPT来实现三维3D效果&#xff0c;附参数设置详解怎么用ppt画三维立体图?**PPT做3D可动样机****PPT做3D[动态图标]****PPT做3D插画**如何使用[PPT绘图]&#xff1f…

图像处理:图像清晰度评价

目录 0、实现效果 1、概述 2、模糊度分类 1、运动模糊 2、压缩模糊 3、高斯模糊 3、清晰度量化指标 Brenner 能量梯度函数(Energy of Gradient) ​编辑 Roberts Laplace SMD&#xff08;灰度方差&#xff09;函数 SMD2 &#xff08;灰度方差乘积&#xff09;函数 …

JUC学习笔记——并发工具线程池

在本系列内容中我们会对JUC做一个系统的学习&#xff0c;本片将会介绍JUC的并发工具线程池 我们会分为以下几部分进行介绍&#xff1a; 线程池介绍自定义线程池模式之Worker ThreadJDK线程池Tomcat线程池Fork/Join 线程池介绍 我们在这一小节简单介绍一下线程池 线程池简介…

Linux基础教程:9、linux进程管理(2)

前面我们讲到fork创建子进程&#xff0c;那么这一期我们接着讲创建进程之后如何调试以及插入其他进程、特殊进程、和进程如何退出&#xff1b; 同样我们写了一个C语言程序&#xff0c;但是在这个程序中是有两个进程&#xff0c;我们调试的时候只会选择一个进程调试&#xff0c…

了解ixgbe网卡驱动— 驱动注册(纯代码分享)

1 ixgbe 网卡注册驱动 和大部分设备驱动一样&#xff0c;网卡驱动是作为一个 module 注册到 kernel 的 通过 module_init() -> ixgbe_init_module() -> pci_register_driver() 注册 ixgbe_driver 通过 module_exit() -> ixgbe_exit_module() -> pci_unregister_dr…