{"id":28756954,"url":"https://github.com/furkanakdemir/noticeboard","last_synced_at":"2025-10-12T02:04:04.077Z","repository":{"id":293930594,"uuid":"208130041","full_name":"furkanakdemir/noticeboard","owner":"furkanakdemir","description":"Change Log library for Android API 21+","archived":false,"fork":false,"pushed_at":"2019-12-20T20:57:29.000Z","size":1512,"stargazers_count":45,"open_issues_count":8,"forks_count":9,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-07-22T11:50:15.467Z","etag":null,"topics":["android","android-library","changelog","kotlin","noticeboard","release-notes","whatsnew"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/furkanakdemir.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-09-12T19:27:02.000Z","updated_at":"2025-05-16T23:31:40.000Z","dependencies_parsed_at":null,"dependency_job_id":"57be5deb-524e-4127-80c4-a95a1c369e12","html_url":"https://github.com/furkanakdemir/noticeboard","commit_stats":null,"previous_names":["furkanakdemir/noticeboard"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/furkanakdemir/noticeboard","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/furkanakdemir%2Fnoticeboard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/furkanakdemir%2Fnoticeboard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/furkanakdemir%2Fnoticeboard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/furkanakdemir%2Fnoticeboard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/furkanakdemir","download_url":"https://codeload.github.com/furkanakdemir/noticeboard/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/furkanakdemir%2Fnoticeboard/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279009913,"owners_count":26084665,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-12T02:00:06.719Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","android-library","changelog","kotlin","noticeboard","release-notes","whatsnew"],"created_at":"2025-06-17T03:09:33.694Z","updated_at":"2025-10-12T02:04:04.071Z","avatar_url":"https://github.com/furkanakdemir.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"![NoticeBoard](art/noticeboard_banner.png)\n\nNoticeBoard\n-------\n\n![GitHub](https://img.shields.io/github/license/furkanakdemir/noticeboard) \n![Bintray](https://img.shields.io/bintray/v/furkanakdemir/noticeboard/net.furkanakdemir.noticeboard)\n![Codacy](https://img.shields.io/codacy/grade/656e09fc4d2645b4a4966858e539eada)\n![CircleCI](https://img.shields.io/circleci/build/github/furkanakdemir/noticeboard/master)\n![MinAPI](https://img.shields.io/badge/API-21%2B-blue)  \n[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-NoticeBoard-orange.svg?style=flat)](https://android-arsenal.com/details/1/7938)\n\n\nNoticeBoard is a changelog library for Android API 21+. It helps developers display the history of changes in their applications.\n\nIt shows a list of `Release` or `UnRelease` which contains a list of `Change`. \n\nIt receives a source of changes and config. \n\nYou can find a sample code of NoticeBoard in this repository.  \n\n`NoticeBoardSample` app is now available on Google Play.\n\n\u003ca href=\"https://play.google.com/store/apps/details?id=net.furkanakdemir.noticeboardsample\"\u003e\u003cimg src=\"art/google-play-badge.png\" width=\"323\"\u003e\u003c/a\u003e\n \n\n\nScreenshot\n-------\n\n\n|ACTIVITY|DIALOG|\n|----------|---------|\n|![ACTIVITY](art/noticeboard_activity.png)|![DIALOG](art/noticeboard_dialog.png)|\n\n\n\nDownload\n-------\n\n```\ndependencies {\n    implementation \"net.furkanakdemir:noticeboard:1.1.0\"\n}\n\n```\n\nUsage\n-------\n\nThe `pin` function is used to show a change log list. It receives a lambda to make clients config their noticeboards.\n\nDefault configs are the following:  \nTITLE: NoticeBoard  \nDISPLAY_IN: Activity  \nSOURCE_TYPE: Dynamic with empty list  \n\n\n```java\nNoticeBoard(this).pin {\n    // configs\n    title(...)\n    displayIn(...)\n    colorProvider(...)\n    source(...)\n}\n```\n`this` can be `Fragment` or `Activity`\n\n### Title\n\nThe title of a noticeboard can be set by `title` function.\n\n```java\nNoticeBoard(this).pin {\n    title(\"Release Notes\")\n}\n```\n\n### Tag\n\nThe tag of a noticeboard can be set by `tag` function.  \nIt can be used to reset the number of noticeboard display after an update.\n\n```java\nNoticeBoard(this).pin {\n    tag(versionCode)\n}\n```\n\n### Display Options\n\nNoticeBoard can be displayed in two ways.\n\nDisplay Options  |\n-----------------|\nACTIVITY         |\nDIALOG           |\n\n```java\nNoticeBoard(this).pin {\n    displayIn(ACTIVITY)\n}\n```\n\n### Show Rules\n\nThe show rule of a noticeboard can be set by `showRule` function.\n\nShow Rules |\n-----------|\nOnce       |\nAlways     |\nLimited    |\n\n```java\nNoticeBoard(this).pin {\n    showRule(Once)\n    showRule(Always)\n    showRule(Limited(3))\n}\n```\n\n### Color Provider\n\nA color provider can be passed to provide the change type backgrounds.\n\nOverride the default color provider\n\n\n``` java\nclass CustomColorProvider(private val context: Context) : NoticeBoardColorProvider(context) {\n    override var colorAdded: Int = R.color.colorAccent\n    override var colorChanged: Int = R.color.colorAccent\n    override var colorDeprecated: Int = R.color.colorPrimary\n    override var colorRemoved: Int = R.color.colorPrimary\n    override var colorFixed: Int = R.color.colorPrimaryDark\n    override var colorSecurity: Int = R.color.colorPrimaryDark\n    override var colorDescriptionText = R.color.colorDescriptionCustom\n    override var colorBackground: Int = R.color.colorBackgroundCustom\n    override var colorTitleDialog: Int = R.color.colorTitleCustom\n    override var colorTitleActivity: Int = R.color.colorTitleCustom\n}\n```\n\nOr Implement `ColorProvider` interface\n\n```java\nclass CustomColorProvider : ColorProvider {\n    override fun getChangeTypeBackgroundColor(changeType: ChangeType): Int {\n\n    }\n\n    override fun getBackgroundColor(): Int {\n\n    }\n\n    override fun getDescriptionColor(): Int {\n\n    }\n\n    override fun getTitleColor(displayOptions: DisplayOptions): Int {\n\n    }\n}\n\n```\n\nFinally, a custom color provider can be set by `colorProvider` function.\n\n```java\nval customColorProvider = CustomColorProvider(this)\n\nNoticeBoard(this).pin {\n    colorProvider(customColorProvider)\n}\n\n```\n\n### Unreleased Section  \n\nAn unreleased section can be added to a noticeboard.  \n\n`UnRelease` can be created dynamically  \n\nor  \n\n`released` field can be set to false in JSON or XML file. (default: true)\n\nThe position of the unreleased section can be configured. (default: TOP)  \n\nPosition  |\n----------|\nTOP       |\nBOTTOM    |\nNONE      |\n\nIf `TOP` or `BOTTOM` is selected, all of the unreleased items are merged into one list.  \nIf `NONE` is selected, the items remains as it is.  \n\n\n```java\nNoticeBoard(this).pin {\n    unreleasedPosition(BOTTOM)\n}\n\n```\n\n### Change Types\n\nThere are currently 6 built-in change types.\n\nChange Type | Enum\n------------|------------\nADDED       |0\nCHANGED     |1\nDEPRECATED  |2\nREMOVED     |3\nFIXED       |4\nSECURITY    |5\n\n### Source Types\n\nThere are currently 3 data source types.\n\nSource  |\n--------|\nDynamic |\nJson    |\nXml     |\n\n#### Dynamic\n\nSave releases by creating dynamically\n\n```java\nval changes = listOf(\n            Release(\"30 Sep 2019\", \"1.0.0\",\n                listOf(\n                    Change(\"New Login Page\", ADDED),\n                    Change(\"Toolbar in Checkout\", CHANGED),\n                    Change(\"Old theme will be removed\", DEPRECATED),\n                    Change(\"Tutorial page is removed\", REMOVED),\n                    Change(\"Crash in Payment\", FIXED),\n                    Change(\"HTTPS only requests\", SECURITY)\n                )\n            )\n        )\n\nNoticeBoard(this).pin {\n    source(Dynamic(changes))\n}\n```\n\n\n\n#### Json\n\nStore releases by creating a json file to the `/assets` folder.\n\nHere is an example of JSON file\n```json\n[\n  {\n    \"date\": \"30 Sep 2019\",\n    \"version\": \"1.0.0\",\n    \"released\": true,\n    \"changes\": [\n      {\n        \"type\": 0,\n        \"description\": \"New Login Page\"\n      },\n      {\n        \"type\": 1,\n        \"description\": \"Toolbar in Checkout\"\n      },\n      {\n        \"type\": 2,\n        \"description\": \"Old theme will be removed\"\n      },\n      {\n        \"type\": 3,\n        \"description\": \"Tutorial page is removed\"\n      },\n      {\n        \"type\": 4,\n        \"description\": \"Crash in Payment\"\n      },\n      {\n        \"type\": 5,\n        \"description\": \"HTTPS only requests\"\n      }\n    ]\n  }\n]\n```\n\n\n```java\nval filepath = \"sample.json\"\n\nNoticeBoard(this).pin {\n    source(Json(filepath))\n}\n```\n\n#### Xml\n\nStore releases by creating a xml file to the `/assets` folder.\n\nHere is an example of XML file\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\" ?\u003e\n\u003creleases\u003e\n    \u003crelease\u003e\n        \u003cdate\u003e30 Sep 2019\u003c/date\u003e\n        \u003cversion\u003e1.0.0\u003c/version\u003e\n        \u003creleased\u003etrue\u003c/released\u003e\n        \u003cchange\u003e\n            \u003cdescription\u003eNew Login Page\u003c/description\u003e\n            \u003ctype\u003e0\u003c/type\u003e\n        \u003c/change\u003e\n        \u003cchange\u003e\n            \u003cdescription\u003eToolbar in Checkout\u003c/description\u003e\n            \u003ctype\u003e1\u003c/type\u003e\n        \u003c/change\u003e\n        \u003cchange\u003e\n            \u003cdescription\u003eOld theme will be removed\u003c/description\u003e\n            \u003ctype\u003e2\u003c/type\u003e\n        \u003c/change\u003e\n        \u003cchange\u003e\n            \u003cdescription\u003eTutorial page is removed\u003c/description\u003e\n            \u003ctype\u003e3\u003c/type\u003e\n        \u003c/change\u003e\n        \u003cchange\u003e\n            \u003cdescription\u003eCrash in Payment\u003c/description\u003e\n            \u003ctype\u003e4\u003c/type\u003e\n        \u003c/change\u003e\n        \u003cchange\u003e\n            \u003cdescription\u003eHTTPS only requests\u003c/description\u003e\n            \u003ctype\u003e5\u003c/type\u003e\n        \u003c/change\u003e\n    \u003c/release\u003e\n\u003c/releases\u003e\n\n```\n\n```java\nval filepath = \"sample.xml\"\n\nNoticeBoard(this).pin {\n    source(Xml(filepath))\n}\n```\n\nUpcoming\n-------\n1. Add `Known Issues` section support\n2. Add a custom change types\n3. Add `MarkdownDataSource` support\n4. Add remote data support\n5. Add a GOTO button\n6. New Date formats\n\nContribution\n-------\nIf you've found an error in the library or sample, please file an issue.\n\nPatches are encouraged, and may be submitted by forking this project and submitting a pull request.\n\nIf you contributed to `noticeboard` but your name is not in the list, please feel free to add yourself to it!\n\n- [Furkan Akdemir](https://github.com/furkanakdemir) - Maintainer\n- [Nuh Koca](https://github.com/nuhkoca) - Collaborator, CI Improvements\n\n\nLicense\n-------\n\n    Copyright 2019 Furkan Akdemir\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffurkanakdemir%2Fnoticeboard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffurkanakdemir%2Fnoticeboard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffurkanakdemir%2Fnoticeboard/lists"}