From 4a6925d9c2eddc2d3703ef6593a37cc0398ee722 Mon Sep 17 00:00:00 2001 From: brave-builds Date: Thu, 21 May 2020 13:12:22 +0000 Subject: [PATCH] Uplift of #5560 (squashed) to beta --- android/brave_java_sources.gni | 2 + .../chrome/browser/BraveActivity.java | 24 +++ .../settings/BravePreferenceFragment.java | 23 +++ .../developer/BraveQAPreferences.java | 137 ++++++++----- .../BraveRewardsDebugPreferences.java | 79 +++++++ .../chrome/browser/util/BraveDbUtil.java | 192 ++++++++++++++++++ .../xml/brave_rewards_debug_preferences.xml | 14 ++ .../java/res/xml/developer_preferences.xml | 4 + android/java/res/xml/qa_preferences.xml | 10 +- 9 files changed, 437 insertions(+), 48 deletions(-) create mode 100644 android/java/org/chromium/chrome/browser/settings/developer/BraveRewardsDebugPreferences.java create mode 100644 android/java/org/chromium/chrome/browser/util/BraveDbUtil.java create mode 100644 android/java/res/xml/brave_rewards_debug_preferences.xml diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index de999885cd5e..48589b271c83 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -105,6 +105,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/settings/BraveSyncScreensPreference.java", "../../brave/android/java/org/chromium/chrome/browser/settings/ClosingAllTabsClosesBravePreference.java", "../../brave/android/java/org/chromium/chrome/browser/settings/developer/BraveQAPreferences.java", + "../../brave/android/java/org/chromium/chrome/browser/settings/developer/BraveRewardsDebugPreferences.java", "../../brave/android/java/org/chromium/chrome/browser/settings/homepage/BraveHomepageSettings.java", "../../brave/android/java/org/chromium/chrome/browser/settings/privacy/BraveClearBrowsingDataPreferencesAdvanced.java", "../../brave/android/java/org/chromium/chrome/browser/settings/privacy/BravePrivacySettings.java", @@ -127,6 +128,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/toolbar/top/BraveToolbarLayout.java", "../../brave/android/java/org/chromium/chrome/browser/upgrade/BravePackageReplacedBroadcastReceiver.java", "../../brave/android/java/org/chromium/chrome/browser/upgrade/BraveUpgradeJobIntentService.java", + "../../brave/android/java/org/chromium/chrome/browser/util/BraveDbUtil.java", "../../brave/android/java/org/chromium/chrome/browser/util/BraveReferrer.java", "../../brave/android/java/org/chromium/chrome/browser/util/PackageUtils.java", "../../brave/android/java/org/chromium/chrome/browser/util/TabUtils.java", diff --git a/android/java/org/chromium/chrome/browser/BraveActivity.java b/android/java/org/chromium/chrome/browser/BraveActivity.java index 6bff24883c1b..f54c0505e33d 100644 --- a/android/java/org/chromium/chrome/browser/BraveActivity.java +++ b/android/java/org/chromium/chrome/browser/BraveActivity.java @@ -16,6 +16,7 @@ import android.net.Uri; import android.os.Build; import android.provider.Settings; +import android.support.v7.app.AlertDialog; import android.text.TextUtils; import android.view.Gravity; import android.view.LayoutInflater; @@ -48,6 +49,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelUtils; import org.chromium.chrome.browser.tab.TabSelectionType; import org.chromium.chrome.browser.toolbar.top.BraveToolbarLayout; +import org.chromium.chrome.browser.util.BraveDbUtil; import org.chromium.chrome.browser.util.BraveReferrer; import org.chromium.chrome.browser.util.UrlConstants; import org.chromium.chrome.browser.settings.BackgroundImagesPreferences; @@ -437,4 +439,26 @@ private void setBgBraveAdsDefaultOff() { sharedPreferencesEditor.apply(); } } + + @Override + public void performPreInflationStartup() { + BraveDbUtil dbUtil = BraveDbUtil.getInstance(); + if (dbUtil.dbOperationRequested()) { + AlertDialog dialog = new AlertDialog.Builder(this) + .setMessage(dbUtil.performDbExportOnStart() ? "Exporting database, please wait..." + : "Importing database, please wait...") + .setCancelable(false) + .create(); + dialog.setCanceledOnTouchOutside(false); + if (dbUtil.performDbExportOnStart()) { + dbUtil.setPerformDbExportOnStart(false); + dbUtil.ExportRewardsDb(dialog); + } else if (dbUtil.performDbImportOnStart() && !dbUtil.dbImportFile().isEmpty()) { + dbUtil.setPerformDbImportOnStart(false); + dbUtil.ImportRewardsDb(dialog, dbUtil.dbImportFile()); + } + dbUtil.cleanUpDbOperationRequest(); + } + super.performPreInflationStartup(); + } } diff --git a/android/java/org/chromium/chrome/browser/settings/BravePreferenceFragment.java b/android/java/org/chromium/chrome/browser/settings/BravePreferenceFragment.java index 517b9af0d412..bcdb1592c6df 100644 --- a/android/java/org/chromium/chrome/browser/settings/BravePreferenceFragment.java +++ b/android/java/org/chromium/chrome/browser/settings/BravePreferenceFragment.java @@ -5,17 +5,24 @@ package org.chromium.chrome.browser.settings; +import android.content.Context; +import android.content.pm.PackageManager; import android.os.Bundle; import android.support.v7.preference.PreferenceFragmentCompat; +import android.os.Build; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.content.Intent; import org.chromium.chrome.R; +import org.chromium.base.ContextUtils; import org.chromium.chrome.browser.ChromeTabbedActivity; public class BravePreferenceFragment extends PreferenceFragmentCompat { + protected static final int STORAGE_PERMISSION_EXPORT_REQUEST_CODE = 8000; + protected static final int STORAGE_PERMISSION_IMPORT_REQUEST_CODE = STORAGE_PERMISSION_EXPORT_REQUEST_CODE + 1; + @Override public void onActivityCreated(Bundle savedInstanceState) { setHasOptionsMenu(true); @@ -41,4 +48,20 @@ public boolean onOptionsItemSelected(MenuItem item) { @Override public void onCreatePreferences(Bundle bundle, String s) { } + + protected boolean isStoragePermissionGranted(boolean isExport) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + Context context = ContextUtils.getApplicationContext(); + if (context.checkSelfPermission( + android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { + return true; + } else { + requestPermissions( + new String[] { android.Manifest.permission.WRITE_EXTERNAL_STORAGE }, + isExport ? STORAGE_PERMISSION_EXPORT_REQUEST_CODE : STORAGE_PERMISSION_IMPORT_REQUEST_CODE); + return false; + } + } + return true; + } } diff --git a/android/java/org/chromium/chrome/browser/settings/developer/BraveQAPreferences.java b/android/java/org/chromium/chrome/browser/settings/developer/BraveQAPreferences.java index a589ebb45b79..da687973a870 100644 --- a/android/java/org/chromium/chrome/browser/settings/developer/BraveQAPreferences.java +++ b/android/java/org/chromium/chrome/browser/settings/developer/BraveQAPreferences.java @@ -5,9 +5,12 @@ package org.chromium.chrome.browser.settings.developer; +import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v7.app.AlertDialog; @@ -30,6 +33,7 @@ import org.chromium.chrome.browser.settings.BravePreferenceFragment; import org.chromium.chrome.browser.settings.ChromeSwitchPreference; import org.chromium.chrome.browser.settings.SettingsUtils; +import org.chromium.chrome.browser.util.BraveDbUtil; /** * Settings fragment containing preferences for QA team. @@ -42,6 +46,10 @@ public class BraveQAPreferences extends BravePreferenceFragment private static final String PREF_QA_DEBUG_NTP= "qa_debug_ntp"; private static final String QA_ADS_PER_HOUR = "qa_ads_per_hour"; + private static final String QA_IMPORT_REWARDS_DB = "qa_import_rewards_db"; + private static final String QA_EXPORT_REWARDS_DB = "qa_export_rewards_db"; + + private static final int CHOOSE_FILE_FOR_IMPORT_REQUEST_CODE = STORAGE_PERMISSION_IMPORT_REQUEST_CODE + 1; private static final int MAX_ADS = 50; private static final int DEFAULT_ADS_PER_HOUR = 2; @@ -50,6 +58,11 @@ public class BraveQAPreferences extends BravePreferenceFragment private ChromeSwitchPreference mMaximizeAdsNumber; private ChromeSwitchPreference mDebugNTP; + private Preference mImportRewardsDb; + private Preference mExportRewardsDb; + private BraveDbUtil mDbUtil; + private String mFileToImport; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -71,12 +84,40 @@ public void onCreate(Bundle savedInstanceState) { if(mDebugNTP != null) { mDebugNTP.setOnPreferenceChangeListener(this); } + + mDbUtil = BraveDbUtil.getInstance(); + + mImportRewardsDb = findPreference(QA_IMPORT_REWARDS_DB); + mExportRewardsDb = findPreference(QA_EXPORT_REWARDS_DB); + setRewardsDbClickListeners(); + checkQACode(); + } + + private void setRewardsDbClickListeners() { + if (mImportRewardsDb != null) { + mImportRewardsDb.setOnPreferenceClickListener( preference -> { + Intent intent = new Intent() + .setType("*/*") + .setAction(Intent.ACTION_GET_CONTENT); + + startActivityForResult(Intent.createChooser(intent, "Select a file"), CHOOSE_FILE_FOR_IMPORT_REQUEST_CODE); + return true; + }); + } + + if (mExportRewardsDb != null) { + mExportRewardsDb.setOnPreferenceClickListener( preference -> { + if (isStoragePermissionGranted(true)) { + requestRestart(false); + } + return true; + }); + } } @Override public void onStart() { BraveRewardsNativeWorker.getInstance().AddObserver(this); - checkQACode(); super.onStart(); } @@ -176,49 +217,6 @@ private void enableMaximumAdsNumber(boolean enable) { BraveRewardsNativeWorker.getInstance().SetAdsPerHour(adsPerHour); } - @Override - public void OnWalletInitialized(int error_code) {} - - @Override - public void OnWalletProperties(int error_code) {} - - @Override - public void OnPublisherInfo(int tabId) {} - - @Override - public void OnGetCurrentBalanceReport(double[] report) {} - - @Override - public void OnNotificationAdded(String id, int type, long timestamp, String[] args) {} - - @Override - public void OnNotificationsCount(int count) {} - - @Override - public void OnGetLatestNotification(String id, int type, long timestamp, String[] args) {} - - @Override - public void OnNotificationDeleted(String id) {} - - @Override - public void OnIsWalletCreated(boolean created) {} - - @Override - public void OnGetPendingContributionsTotal(double amount) {} - - @Override - public void OnGetRewardsMainEnabled(boolean enabled) { - } - - @Override - public void OnGetAutoContributeProps() {} - - @Override - public void OnGetReconcileStamp(long timestamp) {} - - @Override - public void OnRecurringDonationUpdated() {} - @Override public void OnResetTheWholeState(boolean success) { if (success) { @@ -235,11 +233,56 @@ public void OnResetTheWholeState(boolean success) { } @Override - public void OnRewardsMainEnabled(boolean enabled) {} + public void onCreatePreferences(Bundle bundle, String s) {} @Override - public void OnFetchPromotions() {} + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + if (STORAGE_PERMISSION_EXPORT_REQUEST_CODE == requestCode) { + requestRestart(false); + } else if (STORAGE_PERMISSION_IMPORT_REQUEST_CODE == requestCode) { + requestRestart(true); + } + } + } @Override - public void onCreatePreferences(Bundle bundle, String s) {} + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == CHOOSE_FILE_FOR_IMPORT_REQUEST_CODE && resultCode == Activity.RESULT_OK) { + mFileToImport = data.getData().getPath(); + String pathParts[] = mFileToImport.split(":"); + if (pathParts.length == 2) { + mFileToImport = pathParts[1]; + } + if (isStoragePermissionGranted(false)) { + requestRestart(true); + } + } + } + + private void requestRestart(boolean isImport) { + DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int button) { + if (button == AlertDialog.BUTTON_POSITIVE) { + if (isImport) { + mDbUtil.setPerformDbImportOnStart(true); + mDbUtil.setDbImportFile(mFileToImport); + } else { + mDbUtil.setPerformDbExportOnStart(true); + } + BraveRelaunchUtils.restart(); + } + } + }; + AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity(), R.style.Theme_Chromium_AlertDialog) + .setMessage( + "This operation requires restart. Would you like to restart application and start operation?") + .setPositiveButton(R.string.ok, onClickListener).setNegativeButton(R.string.cancel, onClickListener); + Dialog dialog = alertDialog.create(); + dialog.setCanceledOnTouchOutside(false); + dialog.show(); + } } diff --git a/android/java/org/chromium/chrome/browser/settings/developer/BraveRewardsDebugPreferences.java b/android/java/org/chromium/chrome/browser/settings/developer/BraveRewardsDebugPreferences.java new file mode 100644 index 000000000000..876996821c6c --- /dev/null +++ b/android/java/org/chromium/chrome/browser/settings/developer/BraveRewardsDebugPreferences.java @@ -0,0 +1,79 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.chromium.chrome.browser.settings.developer; + +import android.app.Dialog; +import android.content.DialogInterface; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.support.v7.app.AlertDialog; +import android.support.v7.preference.Preference; + +import org.chromium.chrome.R; +import org.chromium.chrome.browser.BraveRelaunchUtils; +import org.chromium.chrome.browser.settings.BravePreferenceFragment; +import org.chromium.chrome.browser.settings.SettingsUtils; +import org.chromium.chrome.browser.util.BraveDbUtil; + +/** + * Settings fragment containing preferences for QA team. + */ +public class BraveRewardsDebugPreferences extends BravePreferenceFragment { + private static final String QA_EXPORT_REWARDS_DB = "export_rewards_db"; + + private Preference mExportRewardsDb; + private BraveDbUtil mDbUtil; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + SettingsUtils.addPreferencesFromResource(this, R.xml.brave_rewards_debug_preferences); + + mDbUtil = BraveDbUtil.getInstance(); + mExportRewardsDb = findPreference(QA_EXPORT_REWARDS_DB); + setRewardsDbClickListeners(); + } + + private void setRewardsDbClickListeners() { + if (mExportRewardsDb != null) { + mExportRewardsDb.setOnPreferenceClickListener(preference -> { + if (isStoragePermissionGranted(true)) { + requestRestart(); + } + return true; + }); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + if (STORAGE_PERMISSION_EXPORT_REQUEST_CODE == requestCode) { + requestRestart(); + } + } + } + + private void requestRestart() { + DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int button) { + if (button == AlertDialog.BUTTON_POSITIVE) { + mDbUtil.setPerformDbExportOnStart(true); + BraveRelaunchUtils.restart(); + } + } + }; + AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity(), R.style.Theme_Chromium_AlertDialog) + .setMessage( + "This operation requires restart. Would you like to restart application and start operation?") + .setPositiveButton(R.string.ok, onClickListener).setNegativeButton(R.string.cancel, onClickListener); + Dialog dialog = alertDialog.create(); + dialog.setCanceledOnTouchOutside(false); + dialog.show(); + } +} diff --git a/android/java/org/chromium/chrome/browser/util/BraveDbUtil.java b/android/java/org/chromium/chrome/browser/util/BraveDbUtil.java new file mode 100644 index 000000000000..a31a3478ba9a --- /dev/null +++ b/android/java/org/chromium/chrome/browser/util/BraveDbUtil.java @@ -0,0 +1,192 @@ +/** + * Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +package org.chromium.chrome.browser.util; + +import android.app.Dialog; +import android.content.Context; +import android.os.Environment; +import android.text.TextUtils; +import android.widget.Toast; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.IOException; +import java.lang.SecurityException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.chromium.base.ContextUtils; +import org.chromium.base.FileUtils; +import org.chromium.base.Log; + +public class BraveDbUtil { + private static final String TAG = "BraveDbUtil"; + private static final String PUBLISHER_INFO_DB = "publisher_info_db"; + private static final String REWARDS_DB_SRC_DIR = "app_chrome/Default"; + private static final String REWARDS_DB_DST_DIR = "rewards"; + private static final String PREF_PERFORM_DB_EXPORT_ON_START = "perform_db_export_on_start"; + private static final String PREF_PERFORM_DB_IMPORT_ON_START = "perform_db_import_on_start"; + private static final String PREF_DB_IMPORT_FILE = "db_import_file"; + + private String mRewardsSrc; + private String mRewardsDst; + private String mRewardsDstDir; + + private static BraveDbUtil sInstance; + + private BraveDbUtil() { + } + + public static BraveDbUtil getInstance() { + if (sInstance != null) + return sInstance; + sInstance = new BraveDbUtil(); + return sInstance; + } + + public void ExportRewardsDb(Dialog dlg) { + Context context = ContextUtils.getApplicationContext(); + mRewardsSrc = context.getApplicationInfo().dataDir + File.separator + REWARDS_DB_SRC_DIR + File.separator + + PUBLISHER_INFO_DB; + + mRewardsDstDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + .getAbsolutePath() + File.separator + REWARDS_DB_DST_DIR; + + SimpleDateFormat dateFormat = new SimpleDateFormat("-yyyy-MM-dd-HHmmss"); + mRewardsDst = mRewardsDstDir + File.separator + PUBLISHER_INFO_DB + dateFormat.format(new Date()); + + copyRewardsDbThread(dlg, false); + } + + public void ImportRewardsDb(Dialog dlg, String fileToImport) { + Context context = ContextUtils.getApplicationContext(); + mRewardsDst = context.getApplicationInfo().dataDir + File.separator + REWARDS_DB_SRC_DIR + File.separator + + PUBLISHER_INFO_DB; + + mRewardsSrc = fileToImport.isEmpty() + ? Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() + + File.separator + REWARDS_DB_DST_DIR + File.separator + PUBLISHER_INFO_DB + : fileToImport; + + mRewardsDstDir = ""; + + copyRewardsDbThread(dlg, true); + } + + private void copyRewardsDbThread(Dialog dlg, boolean isImport) { + if (dlg != null) + dlg.show(); + + if (isImport) { + File file = new File(mRewardsDst); + boolean file_deleted = file.delete(); + File file_journal = new File(mRewardsDst + "-journal"); + boolean file_journal_deleted = file_journal.delete(); + } + + String erroMsg = ""; + + // Create dest dir if necessary + if (!TextUtils.isEmpty(mRewardsDstDir)) { + if (!createDstDir(mRewardsDstDir)) { + erroMsg = "Failed to create destination directory for database operation"; + } + } + + // No errors so far: copy the file + if (TextUtils.isEmpty(erroMsg)) { + boolean succeeded = copyFile(mRewardsSrc, mRewardsDst); + if (!succeeded) { + erroMsg = "Failed to copy database file"; + } + } + + // Update UI + final String msg = (!TextUtils.isEmpty(erroMsg)) ? erroMsg + : "Database successfully " + (isImport ? "imported" : "exported"); + if (dlg != null) + dlg.dismiss(); + Context context = ContextUtils.getApplicationContext(); + Toast.makeText(context, msg, Toast.LENGTH_LONG).show(); + } + + private boolean copyFile(String src, String dst) { + boolean succeeded = false; + try { + InputStream in = new FileInputStream(src); + FileUtils.copyStreamToFile(in, new File(dst)); + succeeded = true; + in.close(); + } catch (IOException e) { + Log.e(TAG, "Error on copying database file: " + e); + } + return succeeded; + } + + private boolean createDstDir(String dir) { + boolean succeeded = false; + File dst = new File(dir); + try { + if (!dst.exists()) { + succeeded = dst.mkdirs(); + } else { + succeeded = true; + } + } catch (SecurityException e) { + succeeded = false; + } + return succeeded; + } + + public boolean performDbExportOnStart() { + if (ContextUtils.getAppSharedPreferences() == null) + return false; + return ContextUtils.getAppSharedPreferences().getBoolean(PREF_PERFORM_DB_EXPORT_ON_START, false); + } + + public void setPerformDbExportOnStart(boolean value) { + if (ContextUtils.getAppSharedPreferences() == null) + return; + ContextUtils.getAppSharedPreferences().edit().putBoolean(PREF_PERFORM_DB_EXPORT_ON_START, value).apply(); + } + + public boolean performDbImportOnStart() { + if (ContextUtils.getAppSharedPreferences() == null) + return false; + return ContextUtils.getAppSharedPreferences().getBoolean(PREF_PERFORM_DB_IMPORT_ON_START, false); + } + + public void setPerformDbImportOnStart(boolean value) { + if (ContextUtils.getAppSharedPreferences() == null) + return; + ContextUtils.getAppSharedPreferences().edit().putBoolean(PREF_PERFORM_DB_IMPORT_ON_START, value).apply(); + } + + public String dbImportFile() { + if (ContextUtils.getAppSharedPreferences() == null) + return ""; + return ContextUtils.getAppSharedPreferences().getString(PREF_DB_IMPORT_FILE, ""); + } + + public void setDbImportFile(String file) { + if (ContextUtils.getAppSharedPreferences() == null) + return; + ContextUtils.getAppSharedPreferences().edit().putString(PREF_DB_IMPORT_FILE, file).apply(); + } + + public boolean dbOperationRequested() { + return performDbExportOnStart() || (performDbImportOnStart() && !dbImportFile().isEmpty()); + } + + public void cleanUpDbOperationRequest() { + setPerformDbExportOnStart(false); + setPerformDbImportOnStart(false); + setDbImportFile(""); + } +} diff --git a/android/java/res/xml/brave_rewards_debug_preferences.xml b/android/java/res/xml/brave_rewards_debug_preferences.xml new file mode 100644 index 000000000000..74576c1b2fed --- /dev/null +++ b/android/java/res/xml/brave_rewards_debug_preferences.xml @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/android/java/res/xml/developer_preferences.xml b/android/java/res/xml/developer_preferences.xml index b73cc9d8af4d..3f5b054d53a5 100644 --- a/android/java/res/xml/developer_preferences.xml +++ b/android/java/res/xml/developer_preferences.xml @@ -24,4 +24,8 @@ android:fragment="org.chromium.chrome.browser.settings.developer.BraveQAPreferences" android:key="qa_preferences" android:title="QA Preferences"/> + diff --git a/android/java/res/xml/qa_preferences.xml b/android/java/res/xml/qa_preferences.xml index 793dd8cb46a3..83f9058b59e1 100644 --- a/android/java/res/xml/qa_preferences.xml +++ b/android/java/res/xml/qa_preferences.xml @@ -26,5 +26,13 @@ android:summaryOn="@string/text_on" android:summaryOff="@string/text_off" android:defaultValue="false" /> - + + + + +