diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb843ebe..7a56cbf51 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -226,6 +226,12 @@ android:parentActivityName=".activities.ControlCenter" android:screenOrientation="portrait" android:windowSoftInputMode="stateHidden" /> + () { + @Override + protected Object doInBackground(Object[] params) { + helper.importOldDb(oldHandler, device, targetHandler); + if (!isFinishing() && !isDestroyed()) { + progress.dismiss(); + } + return null; + } + }.execute((Object[]) null); + } catch (Exception ex) { + GB.toast(DbManagementActivity.this, "Error importing old activity data into new database.", Toast.LENGTH_LONG, GB.ERROR, ex); + } + } + }); + } + + private void selectDeviceForMergingActivityDatabaseInto(final DeviceSelectionCallback callback) { + GBDevice connectedDevice = GBApplication.getDeviceManager().getSelectedDevice(); + if (connectedDevice == null) { + callback.invoke(null); + return; + } + final List availableDevices = Collections.singletonList(connectedDevice); + GBDeviceAdapter adapter = new GBDeviceAdapter(getBaseContext(), availableDevices); + + new AlertDialog.Builder(this) + .setCancelable(true) + .setTitle("Associate old Data with Device") + .setAdapter(adapter, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + GBDevice device = availableDevices.get(which); + callback.invoke(device); + } + }) + .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // ignore, just return + } + }) + .show(); + } + + private void deleteActivityDatabase() { + new AlertDialog.Builder(this) + .setCancelable(true) + .setTitle("Delete Activity Data?") + .setMessage("Really delete the entire activity database? All your activity data will be lost.") + .setPositiveButton("Delete", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (GBApplication.deleteActivityDatabase(DbManagementActivity.this)) { + GB.toast(DbManagementActivity.this, "Activity database successfully deleted.", Toast.LENGTH_SHORT, GB.INFO); + } else { + GB.toast(DbManagementActivity.this, "Activity database deletion failed.", Toast.LENGTH_SHORT, GB.INFO); + } + } + }) + .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }) + .show(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + NavUtils.navigateUpFromSameTask(this); + return true; + } + return super.onOptionsItemSelected(item); + } + + public interface DeviceSelectionCallback { + void invoke(GBDevice device); + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DebugActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DebugActivity.java index c1ba961d8..c5a983f7d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DebugActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DebugActivity.java @@ -1,16 +1,11 @@ package nodomain.freeyourgadget.gadgetbridge.activities; -import android.app.AlertDialog; import android.app.NotificationManager; import android.app.PendingIntent; -import android.app.ProgressDialog; import android.content.BroadcastReceiver; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; -import android.database.sqlite.SQLiteOpenHelper; -import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.NavUtils; import android.support.v4.app.NotificationCompat; @@ -25,16 +20,8 @@ import android.widget.Toast; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.File; -import java.util.Collections; -import java.util.List; - import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; -import nodomain.freeyourgadget.gadgetbridge.adapter.GBDeviceAdapter; -import nodomain.freeyourgadget.gadgetbridge.database.ActivityDatabaseHandler; -import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; -import nodomain.freeyourgadget.gadgetbridge.database.DBHelper; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.CallSpec; import nodomain.freeyourgadget.gadgetbridge.model.DeviceService; @@ -42,7 +29,6 @@ import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec; import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec; import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec; import nodomain.freeyourgadget.gadgetbridge.model.NotificationType; -import nodomain.freeyourgadget.gadgetbridge.util.FileUtils; import nodomain.freeyourgadget.gadgetbridge.util.GB; @@ -64,10 +50,6 @@ public class DebugActivity extends GBActivity { private Button setTimeButton; private Button rebootButton; private Button HeartRateButton; - private Button exportDBButton; - private Button importDBButton; - private Button importOldActivityDataButton; - private Button deleteDBButton; private EditText editContent; private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @@ -173,37 +155,6 @@ public class DebugActivity extends GBActivity { } }); - exportDBButton = (Button) findViewById(R.id.exportDBButton); - exportDBButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - exportDB(); - } - }); - importDBButton = (Button) findViewById(R.id.importDBButton); - importDBButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - importDB(); - } - }); - - importOldActivityDataButton = (Button) findViewById(R.id.mergeOldActivityData); - importOldActivityDataButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mergeOldActivityDbContents(); - } - }); - - deleteDBButton = (Button) findViewById(R.id.emptyDBButton); - deleteDBButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - deleteActivityDatabase(); - } - }); - rebootButton = (Button) findViewById(R.id.rebootButton); rebootButton.setOnClickListener(new View.OnClickListener() { @Override @@ -262,130 +213,6 @@ public class DebugActivity extends GBActivity { }); } - private void exportDB() { - try (DBHandler dbHandler = GBApplication.acquireDB()) { - DBHelper helper = new DBHelper(this); - File dir = FileUtils.getExternalFilesDir(); - File destFile = helper.exportDB(dbHandler, dir); - GB.toast(this, "Exported to: " + destFile.getAbsolutePath(), Toast.LENGTH_LONG, GB.INFO); - } catch (Exception ex) { - GB.toast(this, "Error exporting DB: " + ex.getMessage(), Toast.LENGTH_LONG, GB.ERROR, ex); - } - } - - private void importDB() { - new AlertDialog.Builder(this) - .setCancelable(true) - .setTitle("Import Activity Data?") - .setMessage("Really overwrite the current activity database? All your activity data (if any) will be lost.") - .setPositiveButton("Overwrite", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - try (DBHandler dbHandler = GBApplication.acquireDB()) { - DBHelper helper = new DBHelper(DebugActivity.this); - File dir = FileUtils.getExternalFilesDir(); - SQLiteOpenHelper sqLiteOpenHelper = dbHandler.getHelper(); - File sourceFile = new File(dir, sqLiteOpenHelper.getDatabaseName()); - helper.importDB(dbHandler, sourceFile); - helper.validateDB(sqLiteOpenHelper); - GB.toast(DebugActivity.this, "Import successful.", Toast.LENGTH_LONG, GB.INFO); - } catch (Exception ex) { - GB.toast(DebugActivity.this, "Error importing DB: " + ex.getMessage(), Toast.LENGTH_LONG, GB.ERROR, ex); - } - } - }) - .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - } - }) - .show(); - } - - private void mergeOldActivityDbContents() { - final DBHelper helper = new DBHelper(getBaseContext()); - final ActivityDatabaseHandler oldHandler = helper.getOldActivityDatabaseHandler(); - if (oldHandler == null) { - GB.toast(this, "No old activity database found, nothing to import.", Toast.LENGTH_LONG, GB.ERROR); - return; - } - selectDeviceForMergingActivityDatabaseInto(new DeviceSelectionCallback() { - @Override - public void invoke(final GBDevice device) { - if (device == null) { - GB.toast(DebugActivity.this, "No connected device to associate old activity data with.", Toast.LENGTH_LONG, GB.ERROR); - return; - } - try (DBHandler targetHandler = GBApplication.acquireDB()) { - final ProgressDialog progress = ProgressDialog.show(DebugActivity.this, "Merging Activity Data", "Please wait while merging your activity data...", true, false); - new AsyncTask() { - @Override - protected Object doInBackground(Object[] params) { - helper.importOldDb(oldHandler, device, targetHandler); - if (!isFinishing() && !isDestroyed()) { - progress.dismiss(); - } - return null; - } - }.execute((Object[]) null); - } catch (Exception ex) { - GB.toast(DebugActivity.this, "Error importing old activity data into new database.", Toast.LENGTH_LONG, GB.ERROR, ex); - } - } - }); - } - - private void selectDeviceForMergingActivityDatabaseInto(final DeviceSelectionCallback callback) { - GBDevice connectedDevice = GBApplication.getDeviceManager().getSelectedDevice(); - if (connectedDevice == null) { - callback.invoke(null); - return; - } - final List availableDevices = Collections.singletonList(connectedDevice); - GBDeviceAdapter adapter = new GBDeviceAdapter(getBaseContext(), availableDevices); - - new AlertDialog.Builder(this) - .setCancelable(true) - .setTitle("Associate old Data with Device") - .setAdapter(adapter, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - GBDevice device = availableDevices.get(which); - callback.invoke(device); - } - }) - .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - // ignore, just return - } - }) - .show(); - } - - private void deleteActivityDatabase() { - new AlertDialog.Builder(this) - .setCancelable(true) - .setTitle("Delete Activity Data?") - .setMessage("Really delete the entire activity database? All your activity data will be lost.") - .setPositiveButton("Delete", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if (GBApplication.deleteActivityDatabase(DebugActivity.this)) { - GB.toast(DebugActivity.this, "Activity database successfully deleted.", Toast.LENGTH_SHORT, GB.INFO); - } else { - GB.toast(DebugActivity.this, "Activity database deletion failed.", Toast.LENGTH_SHORT, GB.INFO); - } - } - }) - .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - } - }) - .show(); - } - private void testNotification() { Intent notificationIntent = new Intent(getApplicationContext(), DebugActivity.class); notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK diff --git a/app/src/main/res/layout/activity_db_management.xml b/app/src/main/res/layout/activity_db_management.xml new file mode 100644 index 000000000..22632959a --- /dev/null +++ b/app/src/main/res/layout/activity_db_management.xml @@ -0,0 +1,69 @@ + + + + + + + +