diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fb41372d..adefae35 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -26,7 +26,7 @@ kotlinx-datetime = "0.6.1" ktor = "3.0.1" android-svg = "1.4" logbackClassic = "1.5.6" -markdown = "0.26.0" +markdown = "0.29.0" postgresql = "42.7.3" androidx-navigation = "2.8.0-alpha10" @@ -58,7 +58,7 @@ components-ui-tooling-preview = { module = "org.jetbrains.compose.components:com compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "compose-android" } compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "compose-android" } -multiplatform-markdown-renderer-m3 = { module = "com.mikepenz:multiplatform-markdown-renderer-m3", version.ref = "markdown" } +multiplatform-markdown-renderer = { module = "com.mikepenz:multiplatform-markdown-renderer", version.ref = "markdown" } # ktor ktor-client-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" } diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 2be9739b..5d0205d8 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -70,7 +70,6 @@ kotlin { implementation(libs.kotlinx.datetime) implementation(libs.androidx.navigation.compose) - implementation(libs.multiplatform.markdown.renderer.m3) implementation(libs.ktor.client.core) } diff --git a/shared/src/commonMain/composeResources/files/app-privacy-policy.md b/shared/src/commonMain/composeResources/files/app-privacy-policy.md new file mode 100644 index 00000000..65123061 --- /dev/null +++ b/shared/src/commonMain/composeResources/files/app-privacy-policy.md @@ -0,0 +1,301 @@ +**KotlinConf App Privacy Policy** + +Version 1.1, effective from February 28, 2024 + +In this KotlinConf App Privacy Policy (“Privacy Policy”), we describe +the types of data, including Personal Data (collectively, "data"), that +we and our associated companies collect from you when you use the +KotlinConf app and the functionalities and services it offers +(collectively, the "App"), how we and our associated companies use and +disclose that data, and your options to access or update your data. + +The data controllers are JetBrains Expo B.V. with its business address +at Huidekoperstraat 26, 1017 ZM, the Netherlands, and [its associated +companies](https://www.jetbrains.com/company/contacts/#headquarters-international-sales): +JetBrains N.V., JetBrains s.r.o. and JetBrains GmbH. + +JetBrains and its associated companies act as joint data controllers, +who are jointly responsible for compliance with data protection +legislation. JetBrains Expo B.V. is primarily +responsible for exercising the rights of data subjects and providing +information about data processing. + +**Definitions** + +The following definitions are used throughout this Privacy Policy: + +**JetBrains Website**. The website of JetBrains which can be found on +[https://www.jetbrains.com/](https://www.jetbrains.com/). + +**KotlinConf**. The official event by +[JetBrains](https://www.jetbrains.com/) under the name KotlinConf +of which more information can be directly found on the website +[https://kotlinconf.com/](https://kotlinconf.com/). + +**Personal Data** means any data relating to an identified or +identifiable natural person. + +All other capitalized terms used in this Privacy Policy shall have the +same meaning as defined in article 4 GDPR (such as personal data, +controller, processor, data subject, and others), unless defined +otherwise in this definition clause. + +**Why We Collect Data and What We Collect** + +We collect data for various reasons as reflected in our [general +Privacy +Policy](https://www.jetbrains.com/legal/docs/privacy/privacy/) which +can be found on the JetBrains Website, but for this App specifically we +collect data for only the following reasons: + +a) **To provide you with the basic functionalities of the App.** Upon +your (re-)installation of the App we generate and collect a random ID, +which is required to provide you with the basic functionalities of this +App, such as in any case the account management (used for the setup or +management of a user’s account) and other processing connected with the +use of this App. Please note that we do not collect, store or process +any Personal Data, such as your Device ID, so we can’t trace the random +ID back to any device or person. We use [Google +Cloud](https://cloud.google.com/terms/cloud-privacy-notice) +Platform, as third party service provider, acting as a data +processor, to assist us in hosting and providing the App to you or in +our operations. The legal basis for this data processing is the +performance of a contract between you and us. + +b) **To improve the App and KotlinConf.** We may collect anonymous data +based on your use of the App and we may use feedback that you provide +voluntarily through the App, in particular on the talks during +KotlinConf, as applicable. We use such data to better understand the +usage patterns of the App, the options it provides and the behavior, +preferences and feedback of our KoltinConf audience. Collection of data +based on your use of the App and feedback that you provide voluntarily +through the App is done anonymously but if you decide to share any +Personal Data in your feedback the legal basis for this data processing +shall be your consent. + +Categories of data involved in data processing include: + +- generated random ID, + +- data about usage of the App and services, + +- votes, comments, voluntarily provided feedback, and any data provided + in survey responses, + +Where appropriate, we will prompt you to give us your consent to the +collection and processing of your data as described above. This will in +any case happen within the App upon your first use of it, in a clear and +conspicuous manner. You can manage your Personal Data and opt-outs as +described in the Transparency section below. + +**Your Privacy Choices And Rights** + +Your Privacy Choices. The privacy choices you may have about your +Personal Data are determined by applicable law and are described below. + +● Mobile Devices. We may send push notifications through the App. You +may opt out from receiving these push notifications by changing the +settings on your mobile device. + +Please note you must separately opt out in each browser and on each +device. + +**Children** + +This App is not designed for and is not offered to children under the +age of 16. If we discover that a person under the age of 16 has +submitted information directly to us, we will endeavor to delete the +information from our systems. + +**Transparency** + +To respect your privacy, before using your Personal Data we will inform +you about the categories of Personal Data we collect and the purposes we +use them for. We will also inform you about the data management options +that you may have. For this purpose, we use this Privacy Policy and the +Terms of Use found in the App. In this case, the App does not collect, +store or process any Personal Data. Should you wish to get more detailed +information on this topic, please do not hesitate to contact us. + +**Sharing** + +Collected Personal Data are shared based on this Privacy Policy. +Additionally, we share collected Personal Data within the JetBrains +group of companies described above, which act as joint data controllers +and process Personal Data for the purposes described above. + +We may share your Personal Data with [Google Cloud Platform which +third party hosts and helps us provide you with this +App.](https://cloud.google.com/terms/cloud-privacy-notice) + +We may also share your Personal Data with certain third parties if we +are obliged to do so under applicable legislation (especially with tax +authorities or with other government bodies exercising their statutory +powers) or if such sharing is necessary to achieve the purposes defined +above (especially with government bodies or with parties harmed as a +result of violations of applicable laws). + +To adhere to the requirements of the California Consumer Privacy Act +(CCPA), we hereby notify you that JetBrains will not a) retain, use, +sell, or otherwise disclose any Personal Data for any purpose other than +to provide the App; or b) retain, use, sell, or disclose such Personal +Data outside of the direct relationship between you and JetBrains; or c) +use Personal Data other than as described within this Privacy Policy. + +**Security** + +We take steps to ensure that your information is treated securely and in +accordance with this Privacy Policy. To secure your Personal Data, this +App is designed with security and privacy in mind. Unfortunately, no +system is 100% secure, and we cannot ensure or warrant the security of +any information you provide to us. To the fullest extent permitted by +applicable law, we do not accept liability for unauthorized access, +acquisition, use, disclosure, or loss of personal information. + +We encrypt your data in transfer and at rest where it is technically +feasible. External web resources are protected by SSL encryption. + +We review the processes of Personal Data usage before implementing them. +This is done to minimize data usage and to make sure that you as the +data owner are informed about the processing. When the reason for data +storage expires, we remove your Personal Data from our servers or +anonymize it for further usage. By the nature of the activity within +which your data is collected, in particular when using the App to +provide feedback. it may appear in our internal datasets used for +researching the results of the voting. Before using the datasets for +research or other purposes you are not informed of, we remove or +anonymize your Personal Data in the datasets. + +We are using [Google +Cloud](https://cloud.google.com/terms/cloud-privacy-notice) +Platform as a third party to host the App and to process your +data in accordance with this Privacy Policy. While choosing the +partners, we ascertain their compliance with legal regulations and +security standards to make sure your data are stored in a secure +location with appropriate security measures in place. + +**Location of Your Information** + +Any servers or services of the App that contain Personal Data are +located within the EU. At times, JetBrains may process or transfer some +of your Personal Data to our affiliate companies outside of the EU. Any +such transfer will be made in accordance with the applicable laws on +data protection and this Privacy Policy and will be based on a relevant +adequacy decision of the European Commission, especially on standard +data protection clauses. + +**Third-Party Links** + +The App may contain links to other websites/applications and other +websites/applications may reference or link to our App. These +third-party services are not controlled by us. We encourage our users to +read the privacy policies of each website and application with which +they interact. We do not endorse, screen, or approve, and are not +responsible for, the privacy practices or content of such other websites +or applications. Providing personal information to third-party websites +or applications is at your own risk. + +**Data Retention, Withdrawal of Approval, Access to Data and Your +Rights** + +As the App does not collect, store or process any Personal Data, there +is no Personal Data that needs to be removed from our servers if you +choose to cease using this App at any time. Generally, we retain your +Personal Data as long as we need to in order to achieve the purpose for +which it was collected. We may retain your information if it is required +to comply with legal obligations and/or defense in case of violation of +any JetBrains terms of use and/or Privacy Policies. We may also have +copies of your information in application logs, weblogs, and/or backups +made for security and support purposes or consent text accepted before +the Personal Data collection. These backups will not be accessible as +separately delineated information. We may store Personal Data as +reflected above for as long as you are using the App and/or for as long +as you have it installed on your device. Further, we may keep the data +to protect ourselves from damage in case of litigation in accordance +with the current legislation. Please note, however, that you must retain +a copy of all data that you have placed on our servers in the case of +any loss; further, if you cease using our software and/or services, we +will not be responsible for the retention of any of your data. + +If applicable, you are responsible for the correctness of the Personal +Data you provide to us. We expect you to check the Personal Data you +provide to us and if any inconsistency takes place, update your Personal +Data or report the inconsistency to JetBrains. + +As permitted by applicable law, EU residents may request a copy of the +information that we hold about them. As we do not collect, store or +process any Personal Data with the App we do not hold any information +about you. + +Moreover, as set out in locally applicable Personal Data protection law, +you may have the right to: (i) request access to your Personal Data; +(ii) request rectification of your Personal Data; (iii) request erasure +of your Personal Data; (iv) request a restriction on the processing of +your Personal Data; (v) request Personal Data portability; or (vi) +object to the processing of your Personal Data. Please note that as we +do not collect, store or process any Personal Data with the App, some of +the rights can’t be exercised. + +- **Right of Access.** You may have the right to obtain from us a + confirmation as to whether or not Personal Data concerning you are + being processed, and, where that is the case, to request access to + your Personal Data. The information about Personal Data processing + includes the purposes of the processing, the categories of Personal + Data concerned, and the recipients or categories of recipients to whom + your Personal Data have been or will be disclosed, etc. However, this + is not an absolute right and the interests of other individuals may + restrict your right of access. Further, you may have the right to + obtain a copy of your Personal Data undergoing processing. For + additional copies requested, we may charge a reasonable fee based on + administrative costs. + +- **Right to Rectification.** You may have the right to obtain from us + the rectification of inaccurate Personal Data. Depending on the + purposes of the processing, you may have the right to have incomplete + Personal Data made complete, in particular by providing a + supplementary statement. + +- **Right to Erasure (Right to Be Forgotten).** Under certain + circumstances, you may have the right to require us to delete your + Personal Data. + +- **Right to a Restriction of Processing.** Under certain circumstances, + you may have the right to require us to restrict the processing of + your Personal Data. In this case, the respective Personal Data will be + marked and may only be processed by us for certain purposes. + +- **Right to Personal Data portability.** Under certain circumstances, + you may have the right to receive the Personal Data concerning you, + which you have provided to us, in a structured, commonly used, and + machine-readable format, and to transmit these Personal Data to + another entity. + +- **Right to Object.** Under certain circumstances, you may have the + right to object, on grounds relating to their particular situation, at + any time to the processing of your Personal Data by us and we can be + required to no longer process your Personal Data. + +Where applicable, these rights can be exercised via the email +address [privacy@jetbrains.com](privacy@jetbrains.com). + +You may also contact JetBrains to get up-to-date information about your +Personal Data processing and any Personal Data recipients. + +You may lodge a complaint related to the processing of your personal data with the competent data protection supervisory authority, i.e. in the Netherlands the Authority Personal Data (*Autoriteit Persoonsgegevens*), with its visiting address at Hoge Nieuwstraat 8, 2514 EL Den Haag. For more information, please visit [https://autoriteitpersoonsgegevens.nl](https://autoriteitpersoonsgegevens.nl). + +**Changes to this Policy** + +This Privacy Policy is current as of the Effective Date set forth above. +We may change this Privacy Policy from time to time, so please be sure +to check back periodically. We will post any changes to this Privacy +Policy in the App. If we make any changes to this Privacy Policy that +materially affect our practices with regard to the Personal Data we have +previously collected from you, we will endeavor to provide you with an +advance notice of such change by highlighting the change upon your +subsequent use of the App. + +**Reaching out** + +If you have any questions or concerns, or you feel that this Privacy +Policy has been violated in any way, please let us know immediately by +contacting [privacy@jetbrains.com](privacy@jetbrains.com). diff --git a/shared/src/commonMain/composeResources/files/visitors-privacy-policy.md b/shared/src/commonMain/composeResources/files/visitors-privacy-policy.md new file mode 100644 index 00000000..acbc6d94 --- /dev/null +++ b/shared/src/commonMain/composeResources/files/visitors-privacy-policy.md @@ -0,0 +1,130 @@ +Dear Visitors, We at JetBrains Expo B.V. and our associated companies, +which can be found listed on: +[https://www.jetbrains.com/company/contacts/](https://www.jetbrains.com/company/contacts/) +(collectively referred to as “JetBrains” or “our” or “we”), respect you +and are committed to honoring and safeguarding your privacy. This +Privacy Policy describes our privacy practices regarding the collection +and use of your personal data when you visit our event KotlinConf 2024 +which takes place in the Bella Center Copenhagen, Copenhagen, Denmark +(“premises”) between the dates of May 22th and 24th, 2023. + +This Privacy Policy may be amended from time to time. The respective +latest version of the Privacy Policy at the point of time of your visit +shall apply. The data controllers are JetBrains Expo B.V., +Huidekoperstraat 26, 1017 ZM Amsterdam, the Netherlands, and the +[associated companies, JetBrains](https://www.jetbrains.com/company/contacts/) N.V., JetBrains +GmbH and JetBrains s.r.o. + +JetBrains and its associated companies act as joint data controllers, +who are jointly responsible for compliance with data protection +legislation. JetBrains Expo B.V. is primarily responsible for exercising +the rights of data subjects and providing information about data +processing. + +### Following instructions + +Each Visitor to the premises shall always follow the instructions of our +staff. + +### Regular visits + +In case of a regular visit, we shall obtain certain limited personal +information from you as described hereunder. + +Video surveillance +Please be informed that Bella Center Copenhagen operates video +surveillance in the premises where KotlinConf 2024 will be held and the +rest of their premises. For more information we refer to their +[Privacy Policy](https://www.bellagroup.dk/en/privacy) and +further information which can be found on their website: +[https://www.bellacenter.dk/en](https://www.bellacenter.dk/en). + +Photos and records +Please note that during KotlinConf we usually take illustrative or +documentary photos and/or audio/visual records, which can include your +images and capture your appearance. These records may serve for the +adequate public use within our marketing and promotional activities on +our social networks or in selected public media. In accordance with the +GDPR we shall ask for your consent where required before making and +sharing, as applicable, such photos or records on our social networks or +in selected public media. We will not take nor publish any photos or +records displaying you in a degrading way. + +Badge printing at registration +We use pretix to provide badge printing services for those attending +KotlinConf 2024. Your information will be shared with pretix for the +purpose of printing on your name badge the contact information as +provided during your registration for KotlinConf 2024 (such as your full +name and company name). Pretix will only process your name for the +purposes described above in compliance with applicable laws. A name +badge is required to gain access to KotlinConf 2024. + +Badge scanning +Furthermore, please note that during KotlinConf 2024 we use pretix to +provide badge scanning services, also called lead retrieval or scanning, +to certain exhibitors and/or sponsors. On the name badge there shall be +a QR-code which holds certain personal data as provided by you during +your registration for KotlinConf 2024 (such as your full name, contact +details such as e-mail, job title and company name). Exhibitors and/or +sponsors at KotlinConf 2024 may wish to scan your badge so they can +contact you with more information. By allowing your badge to be scanned, +you are consenting to have pretix provide the above-mentioned +information to the exhibitor and/or sponsor for the purposes of further +(marketing) communication and to contact you with more information +post-event. As the scanning is based on your consent to the exhibitor +and/or sponsor, if you do not wish to be contacted by the party in +question, please communicate this directly to them at the event or +thereafter. + +For more information about pretix we refer to their [privacy +page](https://pretix.eu/about/en/privacy). + +**Purpose for processing personal data** + +The legal basis for data processing is our legitimate interest in the +organization of our events, in promoting and marketing our products and +services, crime prevention and ensuring safety for our visitors, staff +and ourselves. + +**Specific collection and processing of personal data** + +Please note that we will obtain your specific consent for any other +purpose or occasion of your personal data collection and processing not +mentioned explicitly in this Privacy Policy. + +### Use, security and retention of personal data + +Your personal data is maintained in a secure manner. Only authorized +employees and security personnel have access to them. We will only keep +your personal data for as long as is reasonably necessary for the +purposes outlined above or to comply with legal requirements under +applicable law(s). + +We do NOT transfer or share your personal data with other persons or +organizations unless required or permitted by law except for sharing +within the JetBrains group of companies described above, which act as +joint data controllers and process personal data for the purposes +described above. We may share your data with certain [third +parties](https://www.jetbrains.com/legal/privacy/third-parties.html) +which help us to run our business such as for badge printing, badge +scanning, catering services or t-shirt supplies. + +### Your rights + +You have the following rights under the law regarding your personal +data: Right of access, right to rectification, right to erasure, right +to restriction of processing, right to personal data portability, and +right to object. Should you wish to (i) exercise them, (ii) to revoke +any consent given to us, or (iii) if you have any concerns as to how +your data is processed you can contact us at +[privacy@jetbrains.com](mailto:privacy@jetbrains.com). + +You may also contact JetBrains to get up-to-date information about your +personal data processing and any personal data recipients. + +For more details and further information on your rights, please visit +the pertinent segment in our Privacy Policy accessible at +[https://www.jetbrains.com/legal/docs/privacy/privacy/](https://www.jetbrains.com/legal/docs/privacy/privacy/). + +You may lodge a complaint related to the processing of your personal data with the competent data protection supervisory authority, i.e. in the Netherlands the Authority Personal Data (*Autoriteit Persoonsgegevens*), with its visiting address at Hoge Nieuwstraat 8, 2514 EL Den Haag. For more information, please visit [https://autoriteitpersoonsgegevens.nl](https://autoriteitpersoonsgegevens.nl). + diff --git a/shared/src/commonMain/composeResources/files/visitors-terms.md b/shared/src/commonMain/composeResources/files/visitors-terms.md new file mode 100644 index 00000000..b8581892 --- /dev/null +++ b/shared/src/commonMain/composeResources/files/visitors-terms.md @@ -0,0 +1,205 @@ +These General Terms and Conditions for Visitors apply for every visit to +KotlinConf 2024 (“KotlinConf”, “event”). The KotlinConf of 2024 takes +place in the Bella Center Copenhagen, Copenhagen, Denmark (“premises”) +between May 22 - 24, 2024. Please read these General Terms and +Conditions for Visitors carefully before visiting and entering the +premises of KotlinConf. By visiting KotlinConf and entering the +premises, you are entering into a legal agreement with JetBrains Expo +B.V., with its registered address at Huidekoperstraat 26, 1017 ZM +Amsterdam, the Netherlands, registered with the Dutch Chamber of +Commerce under the number: 74098896, VAT ID number: NL 85977129 +("JetBrains", "we"), and you hereby agree to abide by these Terms. +Nothing in these Terms limits any rights a consumer might have under +applicable consumer protection laws. + +If you do not agree to all of the terms and conditions set forth in +these General Terms and Conditions for Visitors, please do not visit +KotlinConf or enter the premises. The General Terms and Conditions for +Visitors are a binding agreement between JetBrains and you. + +**Definitions** + +In addition to the definitions specified above, the following +definitions are used throughout these General Terms and Conditions for +Visitors: + +**Ticket**. Any entrance or activity ticket that provides access to +KotlinConf. Tickets are divided into: Conference Ticket(s), which +only provide regular admission to the conference and Workshop +Ticket(s), which provide access to one pre-selected workshop and the +regular admission to the conference. + +**Visitor**. Any person who enters the premises at which KotlinConf is +held and participates in the event. + +**Group** and **Group Visit**. A group of visitors who visit KotlinConf +as a group. + +**Organizer**. An individual, company, or institution who/which +organized or organizes Group Visits. + +**Website**. Any website that is the property of JetBrains s.r.o., +including but not limited to everything hosted under the domains listed +at +[https://www.jetbrains.com/legal/websites/](https://www.jetbrains.com/legal/websites/) + +These General Terms and Conditions for Visitors shall apply to any visit +to and all Visitors to KotlinConf. + +The applicability of these General Terms and Conditions for Visitors +shall be without prejudice to the potential applicability of other +contractual terms and conditions and/or regulations applied by +JetBrains, such as the Terms of Use, and other terms published on the +Website from time to time. + +**Entrance admission** + +Visitors are given access to KoltinConf upon the presentation of a valid +Ticket or valid ID at the entrance and upon the condition that they take +into account our [Code of +Conduct](https://kotlinconf.com/code-of-conduct). Furthermore, if a +Student Discount was used during the purchase of the Ticket the Visitor +will need to provide a valid academic ID together with the valid Ticket +or valid ID. You can print your Ticket or present it on a mobile device +at the entrance. + +For the avoidance of doubt, please be aware that on May 22, 2024 the +workshops shall be held while the conference shall be held on May 23 - +24, 2024. If you have purchased a Workshop Ticket this gives you access +to attend your pre-selected workshop on May 22, 2024 and provides +regular admission to the conference, if you have purchased the +Conference Ticket this means you can’t attend the workshops but shall +only receive regular admission to the conference. + +JetBrains reserves the right to refuse admission to Visitors if it +determines, in its sole discretion, that the Visitor poses a threat to +the health and/or safety of other Visitors or the staff of KotlinConf +and/or the safety of the premises, our partners and the event in +general. + +**Your visit to KotlinConf** + +You visit KotlinConf at your own risk. As a Visitor, you are obliged to +comply with these General Terms and Conditions for Visitors and follow +directions and instructions given by our staff. If you violate these +General Terms and Conditions for Visitors and/or act in violation of +directions and instructions given by our staff (to you), in any way, we +may, in our sole discretion, decide to refuse subsequent admission to +KotlinConf. In such an event, we will not be obligated to compensate for +any damages or to refund the Ticket. + +As Visitor you shall be liable for any damage you inflict to JetBrains +and to any of our property during your visit to KotlinConf. + +*Privacy* + +Please be informed that Bella Center Copenhagen operates video +surveillance in the premises where KotlinConf 2024 will be held and the +rest of their premises. For more information we refer to their +[Privacy Policy](https://www.bellagroup.dk/en/privacy) and +further information which can be found on their website: +[https://www.bellacenter.dk/en](https://www.bellacenter.dk/en). + +For more information about the collection and use of your personal data +by JetBrains when you visit KotlinConf, you can refer to our Privacy +Policy for Visitors, hard copies of which are also available from our +staff. + +We regularly grant permission or ask our staff or third parties to make +audiovisual material, such as photographs or videos, during KotlinConf. +Such content is usually made for marketing purposes or to use on our +Website or other social media. Before making and using any such content +in which our Visitors will be recognizable, we always try to ask for +consent in advance. We ask you to make any objections to the recording +or publication of visual material in which you are recognizable known to +us at [privacy@jetbrains.com](mailto:privacy@jetbrains.com) or by +informing one of our staff members. In the event of an objection, +JetBrains shall undertake to prevent the further recording and/or +publication of the material. You may withdraw the consent given or +request us to stop using, or request us to remove, a specific photo(s) +and/or video(s) from our social media and/or Website at any time. If you +want to make use of these rights, please send the relevant request to +[privacy@jetbrains.com](mailto:privacy@jetbrains.com). + +Further information on data processing, including your rights, such as +the right of access, is available in our Privacy Policy available at +[https://www.jetbrains.com/legal/docs/privacy/privacy/](https://www.jetbrains.com/legal/docs/privacy/privacy/). + +**Rules** + +To make sure that everyone’s visit is safe and pleasant, we have rules +that our Visitors must follow. Our rules, and other information can be +found at +[https://kotlinconf.com/code-of-conduct/](https://kotlinconf.com/code-of-conduct/). +The code of conduct of the premises at which KotlinConf shall be held +can be found at +LINK. We ask our Visitors to always follow the instructions given +by our staff. + +During your visit to KotlinConf, you, as a Visitor, shall not: + +- possess, use or trade in drugs; + +- possess weapons or any objects that can be used as weapons; + +- commit theft or vandalism; + +- use violence or threaten violence; + +- make discriminatory remarks; + +- engage in any form of sexual intimidation; + +- bring anyone into disrepute; + +- consume your own food or drinks; + +- take service items (plates, glasses etc.) outside the building; + +- drink excessively; + +- cause excessive noise in the immediate vicinity; + +- use the internet network of the premises for illegal purposes; + +- use the internet network of the premises to download or visit illegal + or offensive content; + +- enter or cross areas that are not meant for Visitors or that have been + barricaded; + +- interact with exhibits or use those in the manner contradicting the + guidance provided by staff members; + +- smoke; + +- bring any animals (including pets) along, with the exception of + service animals. + +**Liability of JetBrains** + +JetBrains shall only be liable for direct damage sustained by a Visitor +which is the direct consequence of intent (*opzet*) or gross negligence +(*grove nalatigheid*) on the part of JetBrains. JetBrains shall not be +liable for indirect damage, such as consequential damage, lost profits, +etc. + +The liability of JetBrains shall be limited to the lower of the +following two sums: + +1) the sum paid out to JetBrains by its insurance company with respect + to that individual claim; or + +2) the reimbursement made to JetBrains by a third party for the damage + with respect to that individual claim. + +**Terms for Group Visits** + +This section shall apply in cases in which an Organizer wants to +organize or has organized a Group Visit. In such cases all agreements +are concluded between the Organizer and JetBrains. + +It is the responsibility of the Organizer to ensure that the members of +the Group comply with the [Code of +Conduct](https://kotlinconf.com/code-of-conduct) and these General +Terms and Conditions for Visitors. diff --git a/shared/src/commonMain/composeResources/values/strings.xml b/shared/src/commonMain/composeResources/values/strings.xml index 22a0e010..1cd8c455 100644 --- a/shared/src/commonMain/composeResources/values/strings.xml +++ b/shared/src/commonMain/composeResources/values/strings.xml @@ -17,4 +17,13 @@ We will process your data in accordance with the App Privacy Policy. You can adj JetBrains News Get news about JetBrains products. Let’s get started! + + General Terms and Conditions + KotlinConf 2024 General Terms and Conditions for Visitors + Version 1.0 of May 1, 2024 + + Privacy Policy + KotlinConf 2024 Privacy Policy for Visitors + Version 1.0 of May 1, 2024 + diff --git a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/App.kt b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/App.kt index 7c9f8b71..066197b0 100644 --- a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/App.kt +++ b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/App.kt @@ -38,6 +38,7 @@ import org.jetbrains.kotlinconf.ui.components.StyledText import org.jetbrains.kotlinconf.ui.theme.KotlinConfTheme import kotlin.reflect.typeOf import org.jetbrains.compose.reload.DevelopmentEntryPoint +import org.jetbrains.kotlinconf.screens.PrivacyPolicyForVisitors import org.jetbrains.kotlinconf.screens.StartNotificationsScreen const val apiEndpoint = "https://kotlinconf-app-prod.labs.jb.gg" @@ -81,6 +82,10 @@ fun App(context: ApplicationContext) { Modifier.clickable { navController.navigate(CodeOfConductScreen) } ) StyledText("Settings", Modifier.clickable { navController.navigate(SettingsScreen) }) + StyledText( + "Privacy policy for visitors", + Modifier.clickable { navController.navigate(PrivacyPolicyForVisitorsScreen) } + ) StyledText( "Terms of use", Modifier.clickable { navController.navigate(TermsOfUseScreen) } @@ -116,8 +121,11 @@ fun App(context: ApplicationContext) { composable { Settings() } + composable { + PrivacyPolicyForVisitors(onBack = navController::popBackStack) + } composable { - TermsOfUse() + TermsOfUse(onBack = navController::popBackStack) } composable { Partners() diff --git a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/BaseScreens.kt b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/BaseScreens.kt new file mode 100644 index 00000000..4b292afa --- /dev/null +++ b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/BaseScreens.kt @@ -0,0 +1,81 @@ +package org.jetbrains.kotlinconf + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import kotlinconfapp.ui_components.generated.resources.Res +import kotlinconfapp.ui_components.generated.resources.arrow_left_24 +import kotlinconfapp.ui_components.generated.resources.main_header_back +import org.jetbrains.compose.resources.stringResource +import org.jetbrains.kotlinconf.ui.components.Divider +import org.jetbrains.kotlinconf.ui.components.MainHeaderTitleBar +import org.jetbrains.kotlinconf.ui.components.MarkdownView +import org.jetbrains.kotlinconf.ui.components.StyledText +import org.jetbrains.kotlinconf.ui.components.TopMenuButton +import org.jetbrains.kotlinconf.ui.theme.KotlinConfTheme + +@Composable +fun ScreenWithTitle( + title: String, + onBack: () -> Unit, + content: @Composable () -> Unit, +) { + Column(Modifier.fillMaxSize()) { + MainHeaderTitleBar( + title = title, + startContent = { + TopMenuButton( + icon = Res.drawable.arrow_left_24, + contentDescription = stringResource(Res.string.main_header_back), + onClick = onBack, + ) + } + ) + + Divider(thickness = 1.dp, color = KotlinConfTheme.colors.strokePale) + + Column( + Modifier + .fillMaxSize() + .background(color = KotlinConfTheme.colors.mainBackground) + .padding(horizontal = 12.dp) + .verticalScroll(rememberScrollState()) + ) { + content() + } + } +} + +@Composable +fun MarkdownScreenWithTitle( + title: String, + header: String, + subheader: String, + loadText: suspend () -> ByteArray, + onBack: () -> Unit, + endContent: @Composable () -> Unit = {}, +) { + ScreenWithTitle(title, onBack) { + if (header.isNotEmpty()) { + StyledText(header, style = KotlinConfTheme.typography.h1, modifier = Modifier.padding(vertical = 12.dp)) + } + + if (subheader.isNotEmpty()) { + StyledText( + subheader, + style = KotlinConfTheme.typography.text2, + color = KotlinConfTheme.colors.noteText, + ) + } + + MarkdownView(loadText, modifier = Modifier.padding(vertical = 12.dp)) + + endContent() + } +} diff --git a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/navigation.kt b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/navigation.kt index 01b33c4e..691cc444 100644 --- a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/navigation.kt +++ b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/navigation.kt @@ -32,6 +32,9 @@ data object StartNotificationsScreen @Serializable data object SettingsScreen +@Serializable +data object PrivacyPolicyForVisitorsScreen + @Serializable data object TermsOfUseScreen diff --git a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/PrivacyPolicyForVisitors.kt b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/PrivacyPolicyForVisitors.kt new file mode 100644 index 00000000..95510220 --- /dev/null +++ b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/PrivacyPolicyForVisitors.kt @@ -0,0 +1,22 @@ +package org.jetbrains.kotlinconf.screens + +import androidx.compose.runtime.Composable +import kotlinconfapp.shared.generated.resources.Res +import kotlinconfapp.shared.generated.resources.privacy_policy_for_visitors +import kotlinconfapp.shared.generated.resources.privacy_policy_for_visitors_title +import kotlinconfapp.shared.generated.resources.privacy_policy_for_visitors_version +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.stringResource +import org.jetbrains.kotlinconf.MarkdownScreenWithTitle + +@OptIn(ExperimentalResourceApi::class) +@Composable +fun PrivacyPolicyForVisitors(onBack: () -> Unit) { + MarkdownScreenWithTitle( + title = stringResource(Res.string.privacy_policy_for_visitors), + header = stringResource(Res.string.privacy_policy_for_visitors_title), + subheader = stringResource(Res.string.privacy_policy_for_visitors_version), + loadText = { Res.readBytes("files/visitors-privacy-policy.md") }, + onBack = onBack + ) +} diff --git a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/StartScreens.kt b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/StartScreens.kt index 65094d1a..0d224a84 100644 --- a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/StartScreens.kt +++ b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/StartScreens.kt @@ -44,6 +44,7 @@ import kotlinconfapp.shared.generated.resources.privacy_policy_title import kotlinconfapp.ui_components.generated.resources.Res import kotlinconfapp.ui_components.generated.resources.arrow_left_24 import kotlinconfapp.ui_components.generated.resources.arrow_right_24 +import org.jetbrains.compose.resources.ExperimentalResourceApi import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.vectorResource import org.jetbrains.kotlinconf.ui.components.Action @@ -51,6 +52,7 @@ import org.jetbrains.kotlinconf.ui.components.ActionSize import org.jetbrains.kotlinconf.ui.components.Button import org.jetbrains.kotlinconf.ui.components.Divider import org.jetbrains.kotlinconf.ui.components.MainHeaderTitleBar +import org.jetbrains.kotlinconf.ui.components.MarkdownView import org.jetbrains.kotlinconf.ui.components.SettingsItem import org.jetbrains.kotlinconf.ui.components.StyledText import org.jetbrains.kotlinconf.ui.components.TopMenuButton @@ -92,8 +94,13 @@ fun StartPrivacyPolicyScreen( thickness = 1.dp, color = KotlinConfTheme.colors.strokePale, ) - // TODO add actual text of the privacy policy - StyledText("Privacy policy text goes here") + MarkdownView( + loadText = { + @OptIn(ExperimentalResourceApi::class) + AppRes.readBytes("files/app-privacy-policy.md") + }, + modifier = Modifier.padding(horizontal = 12.dp).verticalScroll(rememberScrollState()) + ) Spacer(Modifier.weight(1f)) Divider( thickness = 1.dp, diff --git a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/TermsOfUse.kt b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/TermsOfUse.kt index df2fa407..163cd48f 100644 --- a/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/TermsOfUse.kt +++ b/shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/TermsOfUse.kt @@ -1,21 +1,24 @@ package org.jetbrains.kotlinconf.screens -import androidx.compose.foundation.Image -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier import kotlinconfapp.shared.generated.resources.Res -import kotlinconfapp.shared.generated.resources.arrow_left_24 -import org.jetbrains.compose.resources.painterResource -import org.jetbrains.kotlinconf.LocalNavController -import org.jetbrains.kotlinconf.ui.components.StyledText +import kotlinconfapp.shared.generated.resources.general_terms +import kotlinconfapp.shared.generated.resources.visitors_terms_title +import kotlinconfapp.shared.generated.resources.visitors_terms_version +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.stringResource +import org.jetbrains.kotlinconf.MarkdownScreenWithTitle @Composable -fun TermsOfUse() { - val navController = LocalNavController.current - Column { - Image(painterResource(Res.drawable.arrow_left_24), "back", modifier = Modifier.clickable { navController.popBackStack() }) - StyledText("Terms of Use") - } -} \ No newline at end of file +fun TermsOfUse(onBack: () -> Unit) { + MarkdownScreenWithTitle( + title = stringResource(Res.string.general_terms), + header = stringResource(Res.string.visitors_terms_title), + subheader = stringResource(Res.string.visitors_terms_version), + loadText = { + @OptIn(ExperimentalResourceApi::class) + Res.readBytes("files/visitors-terms.md") + }, + onBack = onBack + ) +} diff --git a/ui-components/build.gradle.kts b/ui-components/build.gradle.kts index 8d55a052..c2a060cd 100644 --- a/ui-components/build.gradle.kts +++ b/ui-components/build.gradle.kts @@ -35,6 +35,8 @@ kotlin { implementation(libs.coil.compose) implementation(libs.coil.network.ktor3) + + implementation(libs.multiplatform.markdown.renderer) } jvmMain.dependencies { implementation(libs.ktor.client.okhttp) diff --git a/ui-components/src/commonMain/kotlin/org/jetbrains/kotlinconf/ui/components/MarkdownView.kt b/ui-components/src/commonMain/kotlin/org/jetbrains/kotlinconf/ui/components/MarkdownView.kt new file mode 100644 index 00000000..3a0993c7 --- /dev/null +++ b/ui-components/src/commonMain/kotlin/org/jetbrains/kotlinconf/ui/components/MarkdownView.kt @@ -0,0 +1,57 @@ +package org.jetbrains.kotlinconf.ui.components + +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.mikepenz.markdown.compose.Markdown +import com.mikepenz.markdown.model.DefaultMarkdownColors +import com.mikepenz.markdown.model.DefaultMarkdownTypography +import org.jetbrains.kotlinconf.ui.theme.KotlinConfTheme + +@Composable +fun MarkdownView( + loadText: suspend () -> ByteArray, + modifier: Modifier = Modifier, +) { + var text by remember { mutableStateOf("") } + LaunchedEffect(loadText) { + text = loadText().decodeToString() + } + + Markdown( + text, DefaultMarkdownColors( + text = KotlinConfTheme.colors.longText, + codeText = KotlinConfTheme.colors.secondaryText, + linkText = KotlinConfTheme.colors.primaryText, + codeBackground = KotlinConfTheme.colors.mainBackground, + inlineCodeText = KotlinConfTheme.colors.secondaryText, + inlineCodeBackground = KotlinConfTheme.colors.mainBackground, + dividerColor = KotlinConfTheme.colors.strokePale, + tableText = KotlinConfTheme.colors.longText, + tableBackground = KotlinConfTheme.colors.mainBackground, + ), typography = DefaultMarkdownTypography( + text = KotlinConfTheme.typography.text1, + code = KotlinConfTheme.typography.text1, + h1 = KotlinConfTheme.typography.h1, + h2 = KotlinConfTheme.typography.h2, + h3 = KotlinConfTheme.typography.h3, + h4 = KotlinConfTheme.typography.h4, + h5 = KotlinConfTheme.typography.h4, + h6 = KotlinConfTheme.typography.h4, + quote = KotlinConfTheme.typography.text2, + paragraph = KotlinConfTheme.typography.text1, + ordered = KotlinConfTheme.typography.text1, + bullet = KotlinConfTheme.typography.text1, + list = KotlinConfTheme.typography.text1, + link = KotlinConfTheme.typography.text1, + inlineCode = KotlinConfTheme.typography.text1, + ), + modifier = modifier + ) +}