作者 zhangji

修改状态栏

<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<JetCodeStyleSettings>
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
<value>
<package name="java.util" alias="false" withSubpackages="false" />
<package name="kotlinx.android.synthetic" alias="false" withSubpackages="true" />
<package name="io.ktor" alias="false" withSubpackages="true" />
</value>
</option>
<option name="PACKAGES_IMPORT_LAYOUT">
<value>
<package name="" alias="false" withSubpackages="true" />
<package name="java" alias="false" withSubpackages="true" />
<package name="javax" alias="false" withSubpackages="true" />
<package name="kotlin" alias="false" withSubpackages="true" />
<package name="" alias="true" withSubpackages="true" />
</value>
</option>
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<codeStyleSettings language="XML">
... ...
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
... ...
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
</set>
</option>
</component>
</project>
\ No newline at end of file
... ...
... ... @@ -72,6 +72,7 @@
<activity android:name=".ui.home.activity.WebViewActivity" />
<activity android:name=".ui.home.activity.TextCourseActivity" />
<activity android:name=".ui.home.activity.TextDetailActivity" />
<activity android:name=".ui.home.activity.OnlineActivity" />
</application>
... ...
package com.wjx.android.wanandroidmvvm.base.view
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.text.TextUtils
import android.view.LayoutInflater
... ... @@ -27,7 +29,8 @@ import com.wjx.android.wanandroidmvvm.common.callback.LoadingCallBack
* Time: 16:36
*/
abstract class BaseLifeCycleFragment<VM : BaseViewModel<*>,VB : ViewBinding>(private val inflate: (LayoutInflater, ViewGroup?, Boolean) -> VB
abstract class BaseLifeCycleFragment<VM : BaseViewModel<*>, VB : ViewBinding>(
private val inflate: (LayoutInflater, ViewGroup?, Boolean) -> VB
) : BaseFragment() {
protected lateinit var mViewModel: VM
private var _binding: VB? = null
... ... @@ -114,4 +117,15 @@ abstract class BaseLifeCycleFragment<VM : BaseViewModel<*>,VB : ViewBinding>(pri
_binding = null
}
protected fun startActivity(cls: Class<out Activity>) {
startActivity(cls, null)
}
private fun startActivity(cls: Class<out Activity>, bundle: Bundle?) {
val intent = Intent(requireActivity(), cls)
if (bundle != null) {
intent.putExtras(bundle)
}
startActivity(intent)
}
}
\ No newline at end of file
... ...
... ... @@ -27,6 +27,13 @@ fun View.screenWidth(): Int {
manager.defaultDisplay.getRealSize(point)
return point.x
}
fun View.screenHeight(): Int {
val manager: WindowManager =
this.context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
val point = Point()
manager.defaultDisplay.getRealSize(point)
return point.y
}
fun RecyclerView.addItemDecoration(spanCount: Int, spacing: Int) {
this.addItemDecoration(object : RecyclerView.ItemDecoration() {
... ...
package com.br_technology.securitytrain_master.ui.home.activity
import android.os.Bundle
import com.br_technology.securitytrain_master.R
import com.br_technology.securitytrain_master.databinding.ActivityOnlineBinding
import com.br_technology.securitytrain_master.ui.home.adapter.VideoCourseAdapter
import com.br_technology.securitytrain_master.ui.home.pojo.VideoCourse
import com.br_technology.securitytrain_master.ui.home.viewmodel.OnlineViewModel
import com.wjx.android.wanandroidmvvm.base.view.BaseLifeCycleActivity
/**
* createTime:2021/7/30 8:53
* auth:张继
* des:在线课程
*/
class OnlineActivity :
BaseLifeCycleActivity<OnlineViewModel, ActivityOnlineBinding>(ActivityOnlineBinding::inflate) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding.apply {
val videoCourseAdapter = VideoCourseAdapter()
val list = mutableListOf(
VideoCourse(R.mipmap.banner, "10课时", "自动化制作课程", "", "张钧-三岗职位培训班"),
VideoCourse(R.mipmap.banner, "10课时", "自动化制作课程", "", "张钧-三岗职位培训班"),
VideoCourse(R.mipmap.banner, "10课时", "自动化制作课程", "", "张钧-三岗职位培训班"),
VideoCourse(R.mipmap.banner, "10课时", "自动化制作课程", "", "张钧-三岗职位培训班"),
VideoCourse(R.mipmap.banner, "10课时", "自动化制作课程", "", "张钧-三岗职位培训班"),
VideoCourse(R.mipmap.banner, "10课时", "自动化制作课程", "", "张钧-三岗职位培训班"),
VideoCourse(R.mipmap.banner, "10课时", "自动化制作课程", "", "张钧-三岗职位培训班"),
VideoCourse(R.mipmap.banner, "10课时", "自动化制作课程", "", "张钧-三岗职位培训班"),
VideoCourse(R.mipmap.banner, "10课时", "自动化制作课程", "", "张钧-三岗职位培训班"),
VideoCourse(R.mipmap.banner, "10课时", "自动化制作课程", "", "张钧-三岗职位培训班"),
)
onlineRecycler.adapter = videoCourseAdapter
videoCourseAdapter.addList(list)
}
}
override fun initDataObserver() {
}
}
\ No newline at end of file
... ...
... ... @@ -13,6 +13,7 @@ import com.br_technology.securitytrain_master.ui.home.adapter.ResultAdapter
import com.br_technology.securitytrain_master.ui.home.adapter.TextCourseTypeAdapter
import com.br_technology.securitytrain_master.ui.home.pojo.RecommendData
import com.br_technology.securitytrain_master.ui.home.viewmodel.TextCourseViewModel
import com.br_technology.securitytrain_master.view.ClassifyPop
import com.br_technology.securitytrain_master.view.listener.OnItemClickListener
import com.br_technology.securitytrain_master.view.listener.ToolBarClickListener
import com.wjx.android.wanandroidmvvm.base.view.BaseLifeCycleActivity
... ... @@ -24,6 +25,13 @@ import com.wjx.android.wanandroidmvvm.base.view.BaseLifeCycleActivity
*/
class TextCourseActivity :
BaseLifeCycleActivity<TextCourseViewModel, ActivityTextCourseBinding>(ActivityTextCourseBinding::inflate) {
private val classifyPop by lazy {
ClassifyPop(this)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding.apply {
... ... @@ -36,7 +44,10 @@ class TextCourseActivity :
)
toolBar.addRightListener(object : ToolBarClickListener {
override fun onClick(view: View) {
courseTypeGroup.visibility = View.VISIBLE
// courseTypeGroup.visibility = View.VISIBLE
if (!classifyPop.isShowing) {
classifyPop.showAsDropDown(view)
}
}
})
... ...
... ... @@ -13,6 +13,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.br_technology.securitytrain_master.R
import com.br_technology.securitytrain_master.databinding.FragmentHomeBinding
import com.br_technology.securitytrain_master.ui.home.activity.DatabaseActivity
import com.br_technology.securitytrain_master.ui.home.activity.OnlineActivity
import com.br_technology.securitytrain_master.ui.home.activity.SearchActivity
import com.br_technology.securitytrain_master.ui.home.activity.TextCourseActivity
import com.br_technology.securitytrain_master.ui.home.adapter.RecommendDataAdapter
... ... @@ -36,126 +37,149 @@ import com.youth.banner.indicator.CircleIndicator
* auth:张继
* des:
*/
class HomeFragment : BaseLifeCycleFragment<MineViewModel,FragmentHomeBinding>(FragmentHomeBinding::inflate) {
class HomeFragment :
BaseLifeCycleFragment<MineViewModel, FragmentHomeBinding>(FragmentHomeBinding::inflate) {
override fun initDataObserver() {
}
override fun initData() {
super.initData()
binding.apply {
//搜索
search.setOnClickListener {
startActivity(SearchActivity::class.java)
}
banner.setAdapter(object : BannerImageAdapter<Int>(
mutableListOf(
R.mipmap.banner,
R.mipmap.banner,
R.mipmap.banner
)
) {
override fun onBindView(
holder: BannerImageHolder,
data: Int,
position: Int,
size: Int
) {
Glide.with(requireActivity())
.load(data)
.apply(RequestOptions.bitmapTransform(RoundedCorners(8)))
.into(holder.imageView)
}
}).addBannerLifecycleObserver(requireActivity())
.indicator = CircleIndicator(requireContext())
// 共享资料库
database.setOnClickListener {
startActivity(DatabaseActivity::class.java)
}
// 共享资料库
txtCourse.setOnClickListener {
startActivity(TextCourseActivity::class.java)
}
// 在线课程
onlineCourse.setOnClickListener {
startActivity(OnlineActivity::class.java)
}
// 视频课程
videoCourse.addItemDecoration(object : RecyclerView.ItemDecoration() {
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
super.getItemOffsets(outRect, view, parent, state)
if (parent.getChildAdapterPosition(view) % 2 == 0) {
outRect.top = 24
outRect.right = 15
} else {
outRect.top = 24
outRect.left = 15
}
}
})
val videoCourseAdapter = VideoCourseAdapter()
val list = mutableListOf(
VideoCourse(R.mipmap.banner, "10课时", "自动化制作课程", "", "张钧-三岗职位培训班"),
VideoCourse(R.mipmap.banner, "10课时", "自动化制作课程", "", "张钧-三岗职位培训班"),
VideoCourse(R.mipmap.banner, "10课时", "自动化制作课程", "", "张钧-三岗职位培训班"),
VideoCourse(R.mipmap.banner, "10课时", "自动化制作课程", "", "张钧-三岗职位培训班"),
)
videoCourse.adapter = videoCourseAdapter
videoCourseAdapter.addList(list)
val recommendDataAdapter = RecommendDataAdapter()
val recommendList = mutableListOf(
RecommendData(
R.mipmap.banner,
"思维导图高分作文法(高中)议论",
"从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"
),
RecommendData(
R.mipmap.banner,
"思维导图高分作文法(高中)议论",
"从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"
),
RecommendData(
R.mipmap.banner,
"思维导图高分作文法(高中)议论",
"从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"
),
RecommendData(
R.mipmap.banner,
"思维导图高分作文法(高中)议论",
"从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"
),
RecommendData(
R.mipmap.banner,
"思维导图高分作文法(高中)议论",
"从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"
),
RecommendData(
R.mipmap.banner,
"思维导图高分作文法(高中)议论",
"从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"
),
RecommendData(
R.mipmap.banner,
"思维导图高分作文法(高中)议论",
"从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"
),
RecommendData(
R.mipmap.banner,
"思维导图高分作文法(高中)议论",
"从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"
),
RecommendData(
R.mipmap.banner,
"思维导图高分作文法(高中)议论",
"从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"
),
RecommendData(
R.mipmap.banner,
"思维导图高分作文法(高中)议论",
"从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"
),
RecommendData(
R.mipmap.banner,
"思维导图高分作文法(高中)议论",
"从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"
),
)
recommendedData.adapter = recommendDataAdapter
recommendDataAdapter.addList(recommendList)
}
}
}
\ No newline at end of file
//class HomeFragment : Fragment() {
// override fun onCreateView(
// inflater: LayoutInflater,
// container: ViewGroup?,
// savedInstanceState: Bundle?
// ): View? {
// return inflater.inflate(R.layout.fragment_home, container, false)
// }
//
// override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
// super.onViewCreated(view, savedInstanceState)
//
//
// val banner: Banner<Int, BannerImageAdapter<Int>> = view.findViewById(R.id.banner)
// banner.setAdapter(object : BannerImageAdapter<Int>(
// mutableListOf(
// R.mipmap.banner,
// R.mipmap.banner,
// R.mipmap.banner
// )
// ) {
// override fun onBindView(
// holder: BannerImageHolder,
// data: Int,
// position: Int,
// size: Int
// ) {
// Glide.with(requireActivity())
// .load(data)
// .apply(RequestOptions.bitmapTransform(RoundedCorners(8)))
// .into(holder.imageView)
//
// }
// }).addBannerLifecycleObserver(this)
// .indicator = CircleIndicator(requireContext())
//
// // 共享资料库
// view.findViewById<TextView>(R.id.database).setOnClickListener {
// startActivity(DatabaseActivity::class.java)
// }
//
// // 共享资料库
// view.findViewById<TextView>(R.id.txt_course).setOnClickListener {
// startActivity(TextCourseActivity::class.java)
// }
// // 在线课程
// view.findViewById<TextView>(R.id.online_course).setOnClickListener {
//// startActivity()
// }
//
// // 视频课程
// val videoCourse: RecyclerView = view.findViewById(R.id.video_course)
// videoCourse.addItemDecoration(object : RecyclerView.ItemDecoration() {
// override fun getItemOffsets(
// outRect: Rect,
// view: View,
// parent: RecyclerView,
// state: RecyclerView.State
// ) {
// super.getItemOffsets(outRect, view, parent, state)
// if (parent.getChildAdapterPosition(view) % 2 == 0) {
// outRect.top = 24
// outRect.right = 15
// } else {
// outRect.top = 24
// outRect.left = 15
// }
// }
// })
// val videoCourseAdapter = VideoCourseAdapter()
// val list = mutableListOf(
// VideoCourse(R.mipmap.banner, "10课时", "自动化制作课程", "", "张钧-三岗职位培训班"),
// VideoCourse(R.mipmap.banner, "10课时", "自动化制作课程", "", "张钧-三岗职位培训班"),
// VideoCourse(R.mipmap.banner, "10课时", "自动化制作课程", "", "张钧-三岗职位培训班"),
// VideoCourse(R.mipmap.banner, "10课时", "自动化制作课程", "", "张钧-三岗职位培训班"),
// )
// videoCourse.adapter = videoCourseAdapter
// videoCourseAdapter.addList(list)
//
// val recommendData: RecyclerView = view.findViewById(R.id.recommended_data)
// val recommendDataAdapter = RecommendDataAdapter()
// val recommendList = mutableListOf(
// RecommendData(R.mipmap.banner, "思维导图高分作文法(高中)议论", "从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"),
// RecommendData(R.mipmap.banner, "思维导图高分作文法(高中)议论", "从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"),
// RecommendData(R.mipmap.banner, "思维导图高分作文法(高中)议论", "从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"),
// RecommendData(R.mipmap.banner, "思维导图高分作文法(高中)议论", "从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"),
// RecommendData(R.mipmap.banner, "思维导图高分作文法(高中)议论", "从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"),
// RecommendData(R.mipmap.banner, "思维导图高分作文法(高中)议论", "从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"),
// RecommendData(R.mipmap.banner, "思维导图高分作文法(高中)议论", "从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"),
// RecommendData(R.mipmap.banner, "思维导图高分作文法(高中)议论", "从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"),
// RecommendData(R.mipmap.banner, "思维导图高分作文法(高中)议论", "从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"),
// RecommendData(R.mipmap.banner, "思维导图高分作文法(高中)议论", "从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"),
// RecommendData(R.mipmap.banner, "思维导图高分作文法(高中)议论", "从这个角度看,康得在不经意间这样说过,既然我已踏上了这条道路,那么"),
// )
// recommendData.adapter = recommendDataAdapter
// recommendDataAdapter.addList(recommendList)
//
//
// view.findViewById<View>(R.id.search).setOnClickListener {
// val intent = Intent(requireActivity(), SearchActivity::class.java)
// startActivity(intent)
// }
// }
//
//
// private fun startActivity(cls: Class<out Activity>) {
// startActivity(cls, null)
// }
//
// private fun startActivity(cls: Class<out Activity>, bundle: Bundle?) {
// val intent = Intent(requireActivity(), cls)
// if (bundle != null) {
// intent.putExtras(bundle)
// }
// startActivity(intent)
// }
//}
\ No newline at end of file
... ...
package com.br_technology.securitytrain_master.ui.home.repository
import androidx.lifecycle.MutableLiveData
import com.br_technology.securitytrain_master.base.common.State
import com.wjx.android.wanandroidmvvm.base.repository.ApiRepository
/**
* createTime:2021/7/29 15:20
* auth:张继
* des:
*/
class OnlineRepository(val loadState: MutableLiveData<State>): ApiRepository() {
}
\ No newline at end of file
... ...
package com.br_technology.securitytrain_master.ui.home.viewmodel
import com.br_technology.securitytrain_master.ui.home.repository.OnlineRepository
import com.br_technology.securitytrain_master.ui.home.repository.TextDetailRepository
import com.wjx.android.wanandroidmvvm.base.viewmodel.BaseViewModel
/**
* createTime:2021/7/27 15:48
* auth:张继
* des:
*/
class OnlineViewModel:BaseViewModel<OnlineRepository>() {
}
\ No newline at end of file
... ...
... ... @@ -19,8 +19,6 @@ class MainActivity :
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ImmersionBar.with(this).statusBarColor(R.color.color_25).init()
val list = listOf(HomeFragment(), BankFragment(), MineFragment())
// 初始化适配器
... ... @@ -47,9 +45,6 @@ class MainActivity :
}
override fun initDataObserver() {
// mViewModel.liveData.observe(this) {
// mainAdapter.addData(it)
// }
}
}
\ No newline at end of file
... ...
package com.br_technology.securitytrain_master.view
import android.app.Activity
import android.content.Context
import android.view.LayoutInflater
import android.widget.PopupWindow
import androidx.core.content.ContextCompat
import com.br_technology.securitytrain_master.R
import com.br_technology.securitytrain_master.databinding.PopClassifyBinding
import com.br_technology.securitytrain_master.expand.addItemDecoration
import com.br_technology.securitytrain_master.expand.screenWidth
import com.br_technology.securitytrain_master.ui.home.adapter.TextCourseTypeAdapter
import com.br_technology.securitytrain_master.view.listener.OnItemClickListener
/**
* createTime:2021/7/30 9:25
* auth:张继
* des:
*/
class ClassifyPop(context: Activity) : PopupWindow(context) {
private val binding by lazy {
PopClassifyBinding.inflate(LayoutInflater.from(context))
}
init {
contentView = binding.root
width = contentView.screenWidth()
height = height
setBackgroundDrawable(ContextCompat.getDrawable(context, R.color.white))
binding.apply {
courseType.addItemDecoration(3, 14)
val list = listOf(
"测试",
"岗位1",
"岗位2",
"岗位3",
"gangw4",
"岗位5",
"岗位6",
"岗位8",
"岗位7",
"岗位9",
)
val textCourseTypeAdapter = TextCourseTypeAdapter()
textCourseTypeAdapter.addListener(object : OnItemClickListener<String> {
override fun onClick(position: Int, data: String) {
textCourseTypeAdapter.index = position
textCourseTypeAdapter.notifyDataSetChanged()
}
})
courseType.adapter = textCourseTypeAdapter
textCourseTypeAdapter.addList(list)
}
}
}
\ No newline at end of file
... ...
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/layout_tool_bar" />
<com.br_technology.securitytrain_master.view.ViewToolBar
android:id="@+id/tool_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/online_recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:overScrollMode="never"
android:paddingTop="16dp"
android:scrollbars="none"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="2" />
</LinearLayout>
\ No newline at end of file
... ...
... ... @@ -6,6 +6,7 @@
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/layout_tool_bar_theme" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
... ...
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/status_bar"
android:layout_width="match_parent"
android:layout_height="24dp"
android:background="@color/color_25" />
\ No newline at end of file
... ...
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/course_type"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginBottom="8dp"
android:layout_weight="1"
android:overScrollMode="never"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:scrollbars="none"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="3" />
<TextView
android:id="@+id/complete"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_margin="16dp"
android:background="@drawable/solid_25_4"
android:gravity="center"
android:text="完成"
android:textColor="@color/white"
android:textSize="15sp" />
</LinearLayout>
\ No newline at end of file
... ...
... ... @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
... ...