diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/AnalyticsDialog.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/AnalyticsDialog.kt new file mode 100644 index 0000000000..51e7b9b279 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/AnalyticsDialog.kt @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +package org.dolphinemu.dolphinemu.dialogs + +import android.app.Dialog +import android.os.Bundle +import androidx.fragment.app.DialogFragment +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import org.dolphinemu.dolphinemu.R +import org.dolphinemu.dolphinemu.utils.Analytics + +class AnalyticsDialog : DialogFragment() { + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = MaterialAlertDialogBuilder(requireContext()) + .setTitle(requireContext().getString(R.string.analytics)) + .setMessage(requireContext().getString(R.string.analytics_desc)) + .setPositiveButton(R.string.yes) { _, _ -> + Analytics.firstAnalyticsAdd(true) + } + .setNegativeButton(R.string.no) { _, _ -> + Analytics.firstAnalyticsAdd(false) + } + return dialog.create() + } + + companion object { + const val TAG = "AnalyticsDialog" + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Analytics.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Analytics.java deleted file mode 100644 index 961620213a..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Analytics.java +++ /dev/null @@ -1,95 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -package org.dolphinemu.dolphinemu.utils; - -import android.content.Context; -import android.os.Build; - -import androidx.annotation.Keep; - -import com.android.volley.Request; -import com.android.volley.toolbox.StringRequest; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; - -import org.dolphinemu.dolphinemu.DolphinApplication; -import org.dolphinemu.dolphinemu.R; -import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting; -import org.dolphinemu.dolphinemu.features.settings.model.Settings; - -public class Analytics -{ - private static final String DEVICE_MANUFACTURER = "DEVICE_MANUFACTURER"; - private static final String DEVICE_OS = "DEVICE_OS"; - private static final String DEVICE_MODEL = "DEVICE_MODEL"; - private static final String DEVICE_TYPE = "DEVICE_TYPE"; - - public static void checkAnalyticsInit(Context context) - { - new AfterDirectoryInitializationRunner().runWithoutLifecycle(() -> - { - if (!BooleanSetting.MAIN_ANALYTICS_PERMISSION_ASKED.getBooleanGlobal()) - { - showMessage(context); - } - }); - } - - private static void showMessage(Context context) - { - new MaterialAlertDialogBuilder(context) - .setTitle(context.getString(R.string.analytics)) - .setMessage(context.getString(R.string.analytics_desc)) - .setPositiveButton(R.string.yes, (dialogInterface, i) -> firstAnalyticsAdd(true)) - .setNegativeButton(R.string.no, (dialogInterface, i) -> firstAnalyticsAdd(false)) - .show(); - } - - private static void firstAnalyticsAdd(boolean enabled) - { - try (Settings settings = new Settings()) - { - settings.loadSettings(); - - BooleanSetting.MAIN_ANALYTICS_ENABLED.setBoolean(settings, enabled); - BooleanSetting.MAIN_ANALYTICS_PERMISSION_ASKED.setBoolean(settings, true); - - // Context is set to null to avoid toasts - settings.saveSettings(null, null); - } - } - - @Keep - public static void sendReport(String endpoint, byte[] data) - { - StringRequest request = new StringRequest(Request.Method.POST, endpoint, - null, error -> Log.debug("Failed to send report")) - { - @Override - public byte[] getBody() - { - return data; - } - }; - - VolleyUtil.getQueue().add(request); - } - - @Keep - public static String getValue(String key) - { - switch (key) - { - case DEVICE_MODEL: - return Build.MODEL; - case DEVICE_MANUFACTURER: - return Build.MANUFACTURER; - case DEVICE_OS: - return String.valueOf(Build.VERSION.SDK_INT); - case DEVICE_TYPE: - return TvUtil.isLeanback(DolphinApplication.getAppContext()) ? "android-tv" : - "android-mobile"; - default: - return ""; - } - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Analytics.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Analytics.kt new file mode 100644 index 0000000000..83c0168bec --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Analytics.kt @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +package org.dolphinemu.dolphinemu.utils + +import android.os.Build +import androidx.annotation.Keep +import androidx.fragment.app.FragmentActivity +import com.android.volley.Response +import com.android.volley.toolbox.StringRequest +import org.dolphinemu.dolphinemu.DolphinApplication +import org.dolphinemu.dolphinemu.dialogs.AnalyticsDialog +import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting +import org.dolphinemu.dolphinemu.features.settings.model.Settings + +object Analytics { + private const val DEVICE_MANUFACTURER = "DEVICE_MANUFACTURER" + private const val DEVICE_OS = "DEVICE_OS" + private const val DEVICE_MODEL = "DEVICE_MODEL" + private const val DEVICE_TYPE = "DEVICE_TYPE" + + @JvmStatic + fun checkAnalyticsInit(activity: FragmentActivity) { + AfterDirectoryInitializationRunner().runWithoutLifecycle { + if (!BooleanSetting.MAIN_ANALYTICS_PERMISSION_ASKED.booleanGlobal) { + AnalyticsDialog().show(activity.supportFragmentManager, AnalyticsDialog.TAG) + } + } + } + + fun firstAnalyticsAdd(enabled: Boolean) { + Settings().use { settings -> + settings.loadSettings() + BooleanSetting.MAIN_ANALYTICS_ENABLED.setBoolean(settings, enabled) + BooleanSetting.MAIN_ANALYTICS_PERMISSION_ASKED.setBoolean(settings, true) + + // Context is set to null to avoid toasts + settings.saveSettings(null, null) + } + } + + @Keep + @JvmStatic + fun sendReport(endpoint: String, data: ByteArray) { + val request: StringRequest = object : StringRequest( + Method.POST, + endpoint, + null, + Response.ErrorListener { Log.debug("Failed to send report") }) { + override fun getBody(): ByteArray { + return data + } + } + VolleyUtil.getQueue().add(request) + } + + @Keep + @JvmStatic + fun getValue(key: String?): String { + return when (key) { + DEVICE_MODEL -> Build.MODEL + DEVICE_MANUFACTURER -> Build.MANUFACTURER + DEVICE_OS -> Build.VERSION.SDK_INT.toString() + DEVICE_TYPE -> if (TvUtil.isLeanback(DolphinApplication.getAppContext())) "android-tv" else "android-mobile" + else -> "" + } + } +}