Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,6 @@ fun TestContext<Unit>.handlePrivacyDisclosure() {
val d = device.uiDevice
val acceptText = targetContext.getString(ResourcesR.string.privacy_disclosure_accept)
val declineText = targetContext.getString(ResourcesR.string.privacy_disclosure_decline)
val learnMoreText =
targetContext.getString(ResourcesR.string.privacy_disclosure_learn_more)

assertTrue(
"Dialog title missing",
Expand All @@ -52,10 +50,6 @@ fun TestContext<Unit>.handlePrivacyDisclosure() {
"Keep offline button missing",
d.findObject(UiSelector().text(declineText)).exists(),
)
assertTrue(
"Learn more button missing",
d.findObject(UiSelector().text(learnMoreText)).exists(),
)

clickFirstAccessibilityNodeByText(acceptText)
d.waitForIdle()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@ import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.Animation
import android.view.animation.AnimationUtils
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import androidx.core.net.toUri
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
Expand All @@ -38,18 +38,19 @@ import androidx.recyclerview.widget.RecyclerView
import com.github.appintro.SlidePolicy
import com.github.appintro.SlideSelectionListener
import com.google.android.material.button.MaterialButton
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.itsaky.androidide.R
import com.itsaky.androidide.activities.OnboardingActivity
import com.itsaky.androidide.adapters.onboarding.OnboardingPermissionsAdapter
import com.itsaky.androidide.app.DeviceProtectedApplicationLoader
import com.itsaky.androidide.app.IDEApplication
import com.itsaky.androidide.buildinfo.BuildInfo
import com.itsaky.androidide.databinding.LayoutDialogPrivacyConsentBinding
import com.itsaky.androidide.databinding.LayoutOnboardingPermissionsBinding
import com.itsaky.androidide.events.InstallationEvent
import com.itsaky.androidide.preferences.internal.StatPreferences
import com.itsaky.androidide.preferences.internal.TelemetryConsent
import com.itsaky.androidide.tasks.doAsyncWithProgress
import com.itsaky.androidide.utils.DialogUtils
import com.itsaky.androidide.utils.OverlayPermissionGuide
import com.itsaky.androidide.utils.PermissionsHelper
import com.itsaky.androidide.utils.flashError
Expand Down Expand Up @@ -430,36 +431,33 @@ class PermissionsFragment :
}

private fun showPrivacyDialog() {
privacyDialog =
MaterialAlertDialogBuilder(requireContext())
val builder = DialogUtils.newMaterialDialogBuilder(requireContext())

// Inflate from the builder's themed context so the dialog-scoped attributes the
// layout refers to (body text style, preferred padding) resolve.
val binding = LayoutDialogPrivacyConsentBinding.inflate(LayoutInflater.from(builder.context))

val dialog =
builder
.setTitle(com.itsaky.androidide.resources.R.string.privacy_disclosure_title)
.setMessage(com.itsaky.androidide.resources.R.string.privacy_disclosure_message)
.setPositiveButton(com.itsaky.androidide.resources.R.string.privacy_disclosure_accept) { dialog, _ ->
StatPreferences.telemetryConsent = TelemetryConsent.GRANTED
DeviceProtectedApplicationLoader.onTelemetryConsentGranted(IDEApplication.instance)
dialog.dismiss()
}.setNegativeButton(com.itsaky.androidide.resources.R.string.privacy_disclosure_decline) { dialog, _ ->
StatPreferences.telemetryConsent = TelemetryConsent.DECLINED
Sentry.close()
dialog.dismiss()
}.setNeutralButton(com.itsaky.androidide.resources.R.string.privacy_disclosure_learn_more, null)
.setView(binding.root)
.setCancelable(false)
.show()
.also { dialog ->
dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener {
openPrivacyPolicy()
}
}
}
.create()

binding.privacyAccept.setOnClickListener {
StatPreferences.telemetryConsent = TelemetryConsent.GRANTED
DeviceProtectedApplicationLoader.onTelemetryConsentGranted(IDEApplication.instance)
dialog.dismiss()
}

private fun openPrivacyPolicy() {
try {
val privacyPolicyUrl = getString(R.string.privacy_policy_url)
val intent = Intent(Intent.ACTION_VIEW, privacyPolicyUrl.toUri())
startActivity(intent)
} catch (e: Exception) {
Sentry.captureException(e)
binding.privacyDecline.setOnClickListener {
StatPreferences.telemetryConsent = TelemetryConsent.DECLINED
Sentry.close()
dialog.dismiss()
}

privacyDialog = dialog
dialog.show()
}

private fun enableFinishButton() {
Expand Down
54 changes: 54 additions & 0 deletions app/src/main/res/layout/layout_dialog_privacy_consent.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Body and choices share one scroll container so they scroll together, and the dialog is given this as a custom view rather
than a message: Material only draws its scroll-indicator dividers around the message pane, so supplying no message removes
them. -->
<androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fadeScrollbars="false"
android:scrollbarStyle="outsideOverlay"
android:scrollbars="vertical">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
android:id="@+id/privacy_message"
style="?attr/materialAlertDialogBodyTextStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="?attr/dialogPreferredPadding"
android:paddingEnd="?attr/dialogPreferredPadding"
android:paddingBottom="24dp"
android:text="@string/privacy_disclosure_message" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorSurfaceVariant"
android:gravity="center_horizontal"
android:orientation="vertical"
android:paddingStart="?attr/dialogPreferredPadding"
android:paddingTop="16dp"
android:paddingEnd="?attr/dialogPreferredPadding"
android:paddingBottom="16dp">

<com.google.android.material.button.MaterialButton
android:id="@+id/privacy_accept"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/privacy_disclosure_accept" />

<com.google.android.material.button.MaterialButton
android:id="@+id/privacy_decline"
style="@style/Widget.Material3.Button.OutlinedButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/privacy_disclosure_decline" />
Comment thread
hal-eisen-adfa marked this conversation as resolved.
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
6 changes: 3 additions & 3 deletions resources/src/main/res/values-in-rID/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -599,9 +599,9 @@
<string name="title_privacy">Privasi</string>

<string name="privacy_disclosure_title">Privasi &amp; analitik</string>
<string name="privacy_disclosure_message">Code on the Go menggunakan Firebase Analytics dan GlitchTip untuk membantu kami meningkatkan aplikasi.\n\nFirebase Analytics mengumpulkan data penggunaan anonim untuk membantu kami memahami bagaimana aplikasi digunakan.\n\nGlitchTip membantu kami melacak dan memperbaiki masalah.\n\nTidak ada informasi pribadi yang dikumpulkan atau dibagikan. Semua data diproses sesuai dengan kebijakan privasi kami.</string>
<string name="privacy_disclosure_accept">Saya mengerti</string>
<string name="privacy_disclosure_learn_more">Pelajari lebih lanjut</string>
<string name="privacy_disclosure_message">Code on the Go mengumpulkan informasi penggunaan dan laporan kerusakan anonim untuk membantu kami memperbaiki bug dan meningkatkan aplikasi. Tidak ada informasi pribadi yang dikumpulkan atau dibagikan.\n\n<i>Bagikan data anonim</i> akan mengirim informasi ini. <i>Tetap offline</i> tidak mengirim apa pun.</string>
<string name="privacy_disclosure_accept">Bagikan data anonim</string>
<string name="privacy_disclosure_decline">Tetap offline</string>

<string name="title_unique_id">ID Unik</string>
<string name="title_device">Perangkat</string>
Expand Down
7 changes: 3 additions & 4 deletions resources/src/main/res/values-zh-rCN/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -659,9 +659,9 @@
<string name="title_privacy">隐私</string>

<string name="privacy_disclosure_title">隐私和分析</string>
<string name="privacy_disclosure_message">Code on the Go 使用 Firebase Analytics 和 GlitchTip 来帮助我们改进应用 \n\nFirebase Analytics 收集匿名使用数据,帮助我们了解应用的使用情况 \n\nGlitchTip 帮助我们跟踪和修复错误 \n\n不会收集或分享任何个人信息 所有数据均按照我们的隐私政策进行处理 </string>
<string name="privacy_disclosure_accept">我了解</string>
<string name="privacy_disclosure_learn_more">了解更多</string>
<string name="privacy_disclosure_message">Code on the Go 会收集匿名的使用情况和崩溃信息,以帮助我们修复缺陷并改进应用。我们不会收集或分享任何个人信息。\n\n选择“共享匿名数据”将发送这些信息;选择“保持离线”则不会发送任何内容。</string>
<string name="privacy_disclosure_accept">共享匿名数据</string>
<string name="privacy_disclosure_decline">保持离线</string>

<string name="title_unique_id">唯一 ID</string>
<string name="title_device">设备</string>
Expand Down Expand Up @@ -1184,7 +1184,6 @@
<string name="support_our_work">支持我们的工作</string>
<string name="github_sponsors_url">https://github.com/sponsors/appdevforall</string>
<string name="docs_url">http://localhost:6174/i/index.html</string>
<string name="privacy_policy_url">https://www.appdevforall.org/wp-content/uploads/2024/08/privacy_notice.pdf</string>
<string name="quickstart_url">http://localhost:6174/i/cogo-quickstart.html</string>
<string name="adfa_email">info@appdevforall.org</string>
<string name="mail_to_adfa">mailto:info@appdevforall.org</string>
Expand Down
4 changes: 1 addition & 3 deletions resources/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -664,10 +664,9 @@
<string name="title_privacy">Privacy</string>

<string name="privacy_disclosure_title">Privacy &amp; analytics</string>
<string name="privacy_disclosure_message">Code on the Go uses Firebase Analytics and GlitchTip to help us improve the app.\n\nFirebase Analytics collects anonymous usage data to help us understand how the app is used. \n\nGlitchTip helps us track and fix errors.\n\nNo personal information is collected or shared. All data is processed in accordance with our privacy policy.\n\nChoose whether to share this anonymous data. If you choose Keep offline, analytics and crash reports are never sent.</string>
<string name="privacy_disclosure_message">Code on the Go collects anonymous usage and crash information to help us fix bugs and improve the app. No personal information is collected or shared.\n\n<i>Share anonymous data</i> sends this information. <i>Keep offline</i> sends nothing at all.</string>
<string name="privacy_disclosure_accept">Share anonymous data</string>
<string name="privacy_disclosure_decline">Keep offline</string>
<string name="privacy_disclosure_learn_more">Learn more</string>

<string name="title_unique_id">Unique ID</string>
<string name="title_device">Device</string>
Expand Down Expand Up @@ -1216,7 +1215,6 @@
<string name="support_our_work">Support our work</string>
<string name="github_sponsors_url">https://github.com/sponsors/appdevforall</string>
<string name="docs_url">http://localhost:6174/i/index.html</string>
<string name="privacy_policy_url">https://www.appdevforall.org/wp-content/uploads/2024/08/privacy_notice.pdf</string>
<string name="quickstart_url">http://localhost:6174/i/cogo-quickstart.html</string>
<string name="adfa_email">info@appdevforall.org</string>
<string name="mail_to_adfa">mailto:info@appdevforall.org</string>
Expand Down
Loading