diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..5e83f2d --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,86 @@ +version: 2.1 +jobs: + build: + working_directory: ~/code + docker: + - image: circleci/android:api-29 + environment: + JVM_OPTS: -Xmx3200m + steps: + - checkout + - restore_cache: + key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }} + - run: + name: Download Dependencies + command: ./gradlew androidDependencies + - save_cache: + paths: + - ~/.gradle + key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }} + + tests: + working_directory: ~/code + docker: + - image: circleci/android:api-29 + environment: + JVM_OPTS: -Xmx3200m + steps: + - checkout + - restore_cache: + key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }} + - store_artifacts: + path: app/build/reports + destination: reports + - run: + name: Run Lint Test + command: ./gradlew lint + - run: + name: Run Tests + command: ./gradlew lint test + - store_artifacts: + path: app/build/reports + destination: reports + - store_test_results: + path: app/build/test-results + + deploy: + working_directory: ~/code + docker: + - image: circleci/android:api-29 + environment: + JVM_OPTS: -Xmx3200m + steps: + - checkout + - restore_cache: + key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }} + - run: + name: Build Library + command: ./gradlew :expandable-recyclerview:assembleRelease + - run: + name: Export key + command: | + mkdir treedatastructure/maven + echo ${GPG_KEY_CONTENTS} | base64 -d --ignore-garbage > treedatastructure/maven/secret.gpg + - run: + name: Staging + command: ./gradlew :expandable-recyclerview:publishReleasePublicationToSonatypeRepository + - run: + name: Release Library + command: ./gradlew closeAndReleaseRepository + +workflows: + version: 2.1 + build-and-deploy: + jobs: + - build: + filters: # required since `deploy` has tag filters AND requires `build` + tags: + only: /.*/ + - deploy: + requires: + - build + filters: + tags: + only: /v[0-9]{1,3}\.[0-9]{1,3}\.?[0-9]{0,3}/ + branches: + ignore: /.*/ \ No newline at end of file diff --git a/expandable-recyclerview/build.gradle b/expandable-recyclerview/build.gradle index 2720554..44749ad 100644 --- a/expandable-recyclerview/build.gradle +++ b/expandable-recyclerview/build.gradle @@ -15,7 +15,7 @@ android { minSdkVersion 23 targetSdkVersion 29 versionCode 1 - versionName "0.0.1-alpha01" + versionName "0.0.1-alpha02" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles 'consumer-rules.pro' @@ -35,7 +35,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.core:core-ktx:1.1.0' implementation "androidx.recyclerview:recyclerview:1.1.0" - implementation "com.github.adriankuta:tree-structure:1.1.0" + implementation "com.github.adriankuta:tree-structure:1.2.0" testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' diff --git a/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/ExpandableGroup.kt b/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/ExpandableGroup.kt deleted file mode 100644 index 2868799..0000000 --- a/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/ExpandableGroup.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.adriankuta.expandable_recyclerview - -import com.github.adriankuta.datastructure.tree.TreeNode - -open class ExpandableGroup(value: T) : TreeNode(value) { - - private var _isExpanded = false - val isExpanded: Boolean - get() = _isExpanded - - - open fun expand() { - _isExpanded = true - } - - open fun collapse() { - _isExpanded = false - } -} \ No newline at end of file diff --git a/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/ExpandableRecyclerView.kt b/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/ExpandableRecyclerView.kt deleted file mode 100644 index 1d58455..0000000 --- a/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/ExpandableRecyclerView.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.github.adriankuta.expandable_recyclerview - -import android.content.Context -import android.util.AttributeSet -import androidx.recyclerview.widget.RecyclerView - -class ExpandableRecyclerView @JvmOverloads constructor( - context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 -) : RecyclerView(context, attrs, defStyleAttr) { - - -} \ No newline at end of file diff --git a/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/ExpandableTreeNode.kt b/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/ExpandableTreeNode.kt new file mode 100644 index 0000000..e45ae54 --- /dev/null +++ b/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/ExpandableTreeNode.kt @@ -0,0 +1,38 @@ +package com.github.adriankuta.expandable_recyclerview + +import com.github.adriankuta.datastructure.tree.ChildDeclaration +import com.github.adriankuta.datastructure.tree.TreeNode + +class ExpandableTreeNode(value: T) : TreeNode(value) { + + var expanded: Boolean = true + set(value) { + field = value + children.forEach { + (it as ExpandableTreeNode).expanded = value + } + } + + override fun child(value: T, childDeclaration: ChildDeclaration?) { + val newChild = ExpandableTreeNode(value) + if (childDeclaration != null) + newChild.childDeclaration() + addChild(newChild) + } + + fun getVisibleNodeCount(): Int { + return onlyVisibleItems() + .size + } + + fun getVisibleNode(position: Int): ExpandableTreeNode { + return onlyVisibleItems()[position] + } + + private fun onlyVisibleItems(): List> { + //Visible if parent of node is expanded. + return map { it as ExpandableTreeNode } + .filter { (it.parent as? ExpandableTreeNode)?.expanded ?: true } + } + +} \ No newline at end of file diff --git a/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/ExpandableTreeNodeExt.kt b/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/ExpandableTreeNodeExt.kt new file mode 100644 index 0000000..ec48d7a --- /dev/null +++ b/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/ExpandableTreeNodeExt.kt @@ -0,0 +1,14 @@ +package com.github.adriankuta.expandable_recyclerview + +import com.github.adriankuta.datastructure.tree.ChildDeclaration + + +@JvmSynthetic +inline fun expandableTree( + value: T, + childDeclaration: ChildDeclaration +): ExpandableTreeNode { + val treeNode = ExpandableTreeNode(value) + treeNode.childDeclaration() + return treeNode +} \ No newline at end of file diff --git a/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/MultilevelRecyclerViewAdapter.kt b/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/MultilevelRecyclerViewAdapter.kt index db89541..9a37046 100644 --- a/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/MultilevelRecyclerViewAdapter.kt +++ b/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/MultilevelRecyclerViewAdapter.kt @@ -3,24 +3,34 @@ package com.github.adriankuta.expandable_recyclerview import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -abstract class MultilevelRecyclerViewAdapter: RecyclerView.Adapter() { +abstract class MultilevelRecyclerViewAdapter : + RecyclerView.Adapter() { - abstract fun getExpandableGroups(): ExpandableGroup + private lateinit var treeNodes: ExpandableTreeNode - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + + abstract override fun onCreateViewHolder(parent: ViewGroup, nestLevel: Int): VH + + final override fun onBindViewHolder(holder: VH, position: Int) { + onBindViewHolder(holder, treeNodes.getVisibleNode(position)) } - override fun getItemCount(): Int { - getExpandableGroups().toList() - return getExpandableGroups().nodeCount() + abstract fun onBindViewHolder(holder: VH, treeNode: ExpandableTreeNode) + + abstract fun getTreeNodes(): ExpandableTreeNode + + final override fun getItemCount(): Int { + treeNodes = getTreeNodes() + return treeNodes.getVisibleNodeCount() } - override fun onBindViewHolder(holder: VH, position: Int) { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + final override fun getItemViewType(position: Int): Int { + + return treeNodes.getVisibleNode(position).depth() } - override fun getItemViewType(position: Int): Int { - return super.getItemViewType(position) + fun toggleGroup(expandableTreeNode: ExpandableTreeNode) { + expandableTreeNode.expanded = !expandableTreeNode.expanded + notifyDataSetChanged() } } \ No newline at end of file diff --git a/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/Temp.java b/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/Temp.java deleted file mode 100644 index b37f623..0000000 --- a/expandable-recyclerview/src/main/java/com/github/adriankuta/expandable_recyclerview/Temp.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.github.adriankuta.expandable_recyclerview; - -public class Temp { - - public static void main(String[] args) { - ExpandableGroup group = new ExpandableGroup<>(""); - - } -}