From 5449d97bf6d9b69cb1647dd857ff4924eff4e3dd Mon Sep 17 00:00:00 2001
From: George Dregalo <37560650+gdregalo@users.noreply.github.com>
Date: Thu, 14 May 2020 18:16:01 -0400
Subject: [PATCH 1/2] Add import/export db for QA #9766
---
.../developer/BraveQAPreferences.java | 220 ++++++++++++++----
android/java/res/xml/qa_preferences.xml | 11 +-
2 files changed, 181 insertions(+), 50 deletions(-)
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 a589ebb45b7..3c3989c12fb 100644
--- a/android/java/org/chromium/chrome/browser/settings/developer/BraveQAPreferences.java
+++ b/android/java/org/chromium/chrome/browser/settings/developer/BraveQAPreferences.java
@@ -5,21 +5,37 @@
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.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.os.Build;
import android.os.Bundle;
+import android.os.Environment;
+import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.preference.Preference;
import android.support.v7.preference.Preference.OnPreferenceChangeListener;
+import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
+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.chrome.R;
import org.chromium.chrome.browser.BraveConfig;
import org.chromium.chrome.browser.BraveRelaunchUtils;
@@ -31,6 +47,8 @@ import org.chromium.chrome.browser.settings.BravePreferenceFragment;
import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
import org.chromium.chrome.browser.settings.SettingsUtils;
+import org.chromium.base.Log;
+
/**
* Settings fragment containing preferences for QA team.
*/
@@ -42,6 +60,13 @@ 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 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 int STORAGE_PERMISSION_REQUEST_CODE = 8000;
private static final int MAX_ADS = 50;
private static final int DEFAULT_ADS_PER_HOUR = 2;
@@ -50,6 +75,12 @@ public class BraveQAPreferences extends BravePreferenceFragment
private ChromeSwitchPreference mMaximizeAdsNumber;
private ChromeSwitchPreference mDebugNTP;
+ private Preference mImportRewardsDb;
+ private Preference mExportRewardsDb;
+ private String mRewardsSrc;
+ private String mRewardsDst;
+ private String mRewardsDstDir;
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -71,6 +102,146 @@ public class BraveQAPreferences extends BravePreferenceFragment
if(mDebugNTP != null) {
mDebugNTP.setOnPreferenceChangeListener(this);
}
+
+ mImportRewardsDb = findPreference(QA_IMPORT_REWARDS_DB);
+ mExportRewardsDb = findPreference(QA_EXPORT_REWARDS_DB);
+ setRewardsDbClickListeners();
+ }
+
+ private void setRewardsDbClickListeners() {
+ if (mImportRewardsDb != null) {
+ mImportRewardsDb.setOnPreferenceClickListener( preference -> {
+ Context context = ContextUtils.getApplicationContext();
+ mRewardsDst = context.getApplicationInfo().dataDir +
+ File.separator + REWARDS_DB_SRC_DIR +
+ File.separator + PUBLISHER_INFO_DB;
+
+ mRewardsSrc = Environment.getExternalStoragePublicDirectory(
+ Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() +
+ File.separator + REWARDS_DB_DST_DIR + File.separator +
+ PUBLISHER_INFO_DB;
+
+ mRewardsDstDir = "";
+
+ if (isStoragePermissionGranted()) {
+ copyRewardsDbThread();
+ }
+ return true;
+ });
+ }
+
+ if (mExportRewardsDb != null) {
+ mExportRewardsDb.setOnPreferenceClickListener( preference -> {
+ 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());
+
+ if (isStoragePermissionGranted()) {
+ copyRewardsDbThread();
+ }
+ return true;
+ });
+ }
+ }
+
+ private void copyRewardsDbThread() {
+ // disable UI before starting the thread
+ mExportRewardsDb.setEnabled(false);
+ new Thread( () -> {
+ String erroMsg = "";
+
+ // create dest dir if necessary
+ if (!TextUtils.isEmpty(mRewardsDstDir)) {
+ if ( !createDstDir (mRewardsDstDir)) {
+ erroMsg = "Failed to create destination directory";
+ }
+ }
+
+ // no errors so far: copy the file
+ if (TextUtils.isEmpty(erroMsg)) {
+ boolean succeeded = copyFile(mRewardsSrc, mRewardsDst);
+ if (! succeeded) {
+ erroMsg = "Failed to copy db file";
+ }
+ }
+
+ // update UI
+ final String msg = (!TextUtils.isEmpty(erroMsg)) ? erroMsg : "Success";
+ getActivity().runOnUiThread( () -> {
+ Context context = ContextUtils.getApplicationContext();
+ Toast.makeText(context , msg, Toast.LENGTH_SHORT).show();
+ mExportRewardsDb.setEnabled(true);
+ });
+ }).start();
+ }
+
+ private boolean copyFile(String src, String dst) {
+ boolean succeeded = false;
+ try {
+ InputStream in = new FileInputStream(src);
+ FileUtils.copyStreamToFile(in, new File(dst));
+ succeeded = true;
+ }
+ catch (IOException 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;
+ }
+
+ private boolean isStoragePermissionGranted() {
+ 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 {
+ ActivityCompat.requestPermissions(getActivity(),
+ new String[]
+ {android.Manifest.permission.WRITE_EXTERNAL_STORAGE},
+ STORAGE_PERMISSION_REQUEST_CODE);
+ return false;
+ }
+ }
+ else {
+ return true;
+ }
+ }
+
+ @Override
+ public void onRequestPermissionsResult(
+ int requestCode, String[] permissions, int[] grantResults) {
+ if (STORAGE_PERMISSION_REQUEST_CODE == requestCode &&
+ grantResults.length > 0 &&
+ grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ copyRewardsDbThread();
+ }
}
@Override
@@ -176,49 +347,6 @@ public class BraveQAPreferences extends BravePreferenceFragment
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) {
@@ -234,12 +362,6 @@ public class BraveQAPreferences extends BravePreferenceFragment
}
}
- @Override
- public void OnRewardsMainEnabled(boolean enabled) {}
-
- @Override
- public void OnFetchPromotions() {}
-
@Override
public void onCreatePreferences(Bundle bundle, String s) {}
}
diff --git a/android/java/res/xml/qa_preferences.xml b/android/java/res/xml/qa_preferences.xml
index 793dd8cb46a..fec67f3de7c 100644
--- a/android/java/res/xml/qa_preferences.xml
+++ b/android/java/res/xml/qa_preferences.xml
@@ -26,5 +26,14 @@
android:summaryOn="@string/text_on"
android:summaryOff="@string/text_off"
android:defaultValue="false" />
-
+
+
+
+
+
+
From 5ac63f2f97e87a8f417c5ba2f5944bb1bf16cf91 Mon Sep 17 00:00:00 2001
From: samartnik
Date: Wed, 20 May 2020 19:58:06 -0400
Subject: [PATCH 2/2] Additional fixes for import/export db
---
android/brave_java_sources.gni | 2 +
.../chrome/browser/BraveActivity.java | 24 ++
.../settings/BravePreferenceFragment.java | 23 ++
.../developer/BraveQAPreferences.java | 211 ++++++------------
.../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 | 15 +-
9 files changed, 411 insertions(+), 153 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 de999885cd5..48589b271c8 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 6bff24883c1..f54c0505e33 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.content.SharedPreferences;
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.TabModel;
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 @@ public abstract class BraveActivity extends ChromeActivity {
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 517b9af0d41..bcdb1592c6d 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 class BravePreferenceFragment extends PreferenceFragmentCompat {
@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 3c3989c12fb..da687973a87 100644
--- a/android/java/org/chromium/chrome/browser/settings/developer/BraveQAPreferences.java
+++ b/android/java/org/chromium/chrome/browser/settings/developer/BraveQAPreferences.java
@@ -9,33 +9,20 @@ import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
-import android.content.SharedPreferences;
+import android.content.Intent;
import android.content.pm.PackageManager;
-import android.os.Build;
+import android.content.SharedPreferences;
import android.os.Bundle;
-import android.os.Environment;
-import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.preference.Preference;
import android.support.v7.preference.Preference.OnPreferenceChangeListener;
-import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
-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.chrome.R;
import org.chromium.chrome.browser.BraveConfig;
import org.chromium.chrome.browser.BraveRelaunchUtils;
@@ -46,8 +33,7 @@ import org.chromium.chrome.browser.preferences.BravePrefServiceBridge;
import org.chromium.chrome.browser.settings.BravePreferenceFragment;
import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
import org.chromium.chrome.browser.settings.SettingsUtils;
-
-import org.chromium.base.Log;
+import org.chromium.chrome.browser.util.BraveDbUtil;
/**
* Settings fragment containing preferences for QA team.
@@ -63,10 +49,7 @@ public class BraveQAPreferences extends BravePreferenceFragment
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 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 int STORAGE_PERMISSION_REQUEST_CODE = 8000;
+ 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;
@@ -77,9 +60,8 @@ public class BraveQAPreferences extends BravePreferenceFragment
private Preference mImportRewardsDb;
private Preference mExportRewardsDb;
- private String mRewardsSrc;
- private String mRewardsDst;
- private String mRewardsDstDir;
+ private BraveDbUtil mDbUtil;
+ private String mFileToImport;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -103,151 +85,39 @@ public class BraveQAPreferences extends BravePreferenceFragment
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 -> {
- Context context = ContextUtils.getApplicationContext();
- mRewardsDst = context.getApplicationInfo().dataDir +
- File.separator + REWARDS_DB_SRC_DIR +
- File.separator + PUBLISHER_INFO_DB;
+ Intent intent = new Intent()
+ .setType("*/*")
+ .setAction(Intent.ACTION_GET_CONTENT);
- mRewardsSrc = Environment.getExternalStoragePublicDirectory(
- Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() +
- File.separator + REWARDS_DB_DST_DIR + File.separator +
- PUBLISHER_INFO_DB;
-
- mRewardsDstDir = "";
-
- if (isStoragePermissionGranted()) {
- copyRewardsDbThread();
- }
+ startActivityForResult(Intent.createChooser(intent, "Select a file"), CHOOSE_FILE_FOR_IMPORT_REQUEST_CODE);
return true;
});
}
if (mExportRewardsDb != null) {
mExportRewardsDb.setOnPreferenceClickListener( preference -> {
- 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());
-
- if (isStoragePermissionGranted()) {
- copyRewardsDbThread();
+ if (isStoragePermissionGranted(true)) {
+ requestRestart(false);
}
return true;
});
}
}
- private void copyRewardsDbThread() {
- // disable UI before starting the thread
- mExportRewardsDb.setEnabled(false);
- new Thread( () -> {
- String erroMsg = "";
-
- // create dest dir if necessary
- if (!TextUtils.isEmpty(mRewardsDstDir)) {
- if ( !createDstDir (mRewardsDstDir)) {
- erroMsg = "Failed to create destination directory";
- }
- }
-
- // no errors so far: copy the file
- if (TextUtils.isEmpty(erroMsg)) {
- boolean succeeded = copyFile(mRewardsSrc, mRewardsDst);
- if (! succeeded) {
- erroMsg = "Failed to copy db file";
- }
- }
-
- // update UI
- final String msg = (!TextUtils.isEmpty(erroMsg)) ? erroMsg : "Success";
- getActivity().runOnUiThread( () -> {
- Context context = ContextUtils.getApplicationContext();
- Toast.makeText(context , msg, Toast.LENGTH_SHORT).show();
- mExportRewardsDb.setEnabled(true);
- });
- }).start();
- }
-
- private boolean copyFile(String src, String dst) {
- boolean succeeded = false;
- try {
- InputStream in = new FileInputStream(src);
- FileUtils.copyStreamToFile(in, new File(dst));
- succeeded = true;
- }
- catch (IOException 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;
- }
-
- private boolean isStoragePermissionGranted() {
- 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 {
- ActivityCompat.requestPermissions(getActivity(),
- new String[]
- {android.Manifest.permission.WRITE_EXTERNAL_STORAGE},
- STORAGE_PERMISSION_REQUEST_CODE);
- return false;
- }
- }
- else {
- return true;
- }
- }
-
- @Override
- public void onRequestPermissionsResult(
- int requestCode, String[] permissions, int[] grantResults) {
- if (STORAGE_PERMISSION_REQUEST_CODE == requestCode &&
- grantResults.length > 0 &&
- grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- copyRewardsDbThread();
- }
- }
-
@Override
public void onStart() {
BraveRewardsNativeWorker.getInstance().AddObserver(this);
- checkQACode();
super.onStart();
}
@@ -364,4 +234,55 @@ public class BraveQAPreferences extends BravePreferenceFragment
@Override
public void onCreatePreferences(Bundle bundle, String s) {}
+
+ @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(false);
+ } else if (STORAGE_PERMISSION_IMPORT_REQUEST_CODE == requestCode) {
+ requestRestart(true);
+ }
+ }
+ }
+
+ @Override
+ 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 00000000000..876996821c6
--- /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 00000000000..a31a3478ba9
--- /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 00000000000..74576c1b2fe
--- /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 b73cc9d8af4..3f5b054d53a 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 fec67f3de7c..83f9058b59e 100644
--- a/android/java/res/xml/qa_preferences.xml
+++ b/android/java/res/xml/qa_preferences.xml
@@ -27,13 +27,12 @@
android:summaryOff="@string/text_off"
android:defaultValue="false" />
-
-
+
+
+
-
-