Data(base) Management screen clarifications

- rename to Data management in menu and activity
- expand texts and explain files meaning
- add confirmation screen to export
- change layout to Linear, rather then Grid
- add listing of file content in the /files directory
- allow Data management activity to rotate

Add missing widget string to strings
This commit is contained in:
vanous 2021-01-02 16:57:41 +01:00
parent f9e6624646
commit 6f0245a23c
8 changed files with 143 additions and 68 deletions

View File

@ -437,10 +437,9 @@
android:excludeFromRecents="true"/>
<activity
android:name=".activities.DbManagementActivity"
android:name=".activities.DataManagementActivity"
android:label="@string/title_activity_db_management"
android:parentActivityName=".activities.ControlCenterv2"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden" />
<activity
android:name=".activities.DiscoveryActivity"

View File

@ -276,8 +276,8 @@ public class ControlCenterv2 extends AppCompatActivity
Intent debugIntent = new Intent(this, DebugActivity.class);
startActivity(debugIntent);
return true;
case R.id.action_db_management:
Intent dbIntent = new Intent(this, DbManagementActivity.class);
case R.id.action_data_management:
Intent dbIntent = new Intent(this, DataManagementActivity.class);
startActivity(dbIntent);
return true;
case R.id.action_blacklist:

View File

@ -28,9 +28,13 @@ import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.DocumentsContract;
import android.text.TextUtils;
import android.util.Pair;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
@ -41,7 +45,9 @@ import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
@ -57,26 +63,26 @@ import nodomain.freeyourgadget.gadgetbridge.util.ImportExportSharedPreferences;
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
public class DbManagementActivity extends AbstractGBActivity {
private static final Logger LOG = LoggerFactory.getLogger(DbManagementActivity.class);
public class DataManagementActivity extends AbstractGBActivity {
private static final Logger LOG = LoggerFactory.getLogger(DataManagementActivity.class);
private static SharedPreferences sharedPrefs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_db_management);
setContentView(R.layout.activity_data_management);
TextView dbPath = findViewById(R.id.activity_db_management_path);
TextView dbPath = findViewById(R.id.activity_data_management_path);
dbPath.setText(getExternalPath());
Button exportDBButton = findViewById(R.id.exportDBButton);
Button exportDBButton = findViewById(R.id.exportDataButton);
exportDBButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
exportDB();
}
});
Button importDBButton = findViewById(R.id.importDBButton);
Button importDBButton = findViewById(R.id.importDataButton);
importDBButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@ -84,6 +90,34 @@ public class DbManagementActivity extends AbstractGBActivity {
}
});
Button showContentDataButton = findViewById(R.id.showContentDataButton);
showContentDataButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File export_path = null;
try {
export_path = FileUtils.getExternalFilesDir();
} catch (IOException e) {
e.printStackTrace();
}
AlertDialog.Builder builder = new AlertDialog.Builder(DataManagementActivity.this);
builder.setTitle("Export/Import directory content:");
ArrayAdapter<String> directory_listing = new ArrayAdapter<String>(DataManagementActivity.this, android.R.layout.simple_list_item_1, export_path.list());
builder.setSingleChoiceItems(directory_listing, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
});
int oldDBVisibility = hasOldActivityDatabase() ? View.VISIBLE : View.GONE;
TextView deleteOldActivityTitle = findViewById(R.id.mergeOldActivityDataTitle);
@ -140,6 +174,9 @@ public class DbManagementActivity extends AbstractGBActivity {
sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
}
private void showDirectoryContent() {
}
//would rather re-use method of SettingsActivity... but lifecycle...
private String getAutoExportLocationSummary() {
String autoExportLocation = GBApplication.getPrefs().getString(GBPrefs.AUTO_EXPORT_LOCATION, null);
@ -213,7 +250,7 @@ public class DbManagementActivity extends AbstractGBActivity {
File myFile = new File(myPath, "Export_preference");
ImportExportSharedPreferences.importFromFile(sharedPrefs, myFile);
} catch (Exception ex) {
GB.toast(DbManagementActivity.this, getString(R.string.dbmanagementactivity_error_importing_db, ex.getMessage()), Toast.LENGTH_LONG, GB.ERROR, ex);
GB.toast(DataManagementActivity.this, getString(R.string.dbmanagementactivity_error_importing_db, ex.getMessage()), Toast.LENGTH_LONG, GB.ERROR, ex);
}
try (DBHandler lockHandler = GBApplication.acquireDB()) {
@ -236,15 +273,30 @@ public class DbManagementActivity extends AbstractGBActivity {
}
private void exportDB() {
try (DBHandler dbHandler = GBApplication.acquireDB()) {
exportShared();
DBHelper helper = new DBHelper(this);
File dir = FileUtils.getExternalFilesDir();
File destFile = helper.exportDB(dbHandler, dir);
GB.toast(this, getString(R.string.dbmanagementactivity_exported_to, destFile.getAbsolutePath()), Toast.LENGTH_LONG, GB.INFO);
} catch (Exception ex) {
GB.toast(this, getString(R.string.dbmanagementactivity_error_exporting_db, ex.getMessage()), Toast.LENGTH_LONG, GB.ERROR, ex);
}
new AlertDialog.Builder(this)
.setCancelable(true)
.setTitle(R.string.dbmanagementactivity_export_data_title)
.setMessage(R.string.dbmanagementactivity_export_confirmation)
.setPositiveButton(R.string.activity_DB_ExportButton, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try (DBHandler dbHandler = GBApplication.acquireDB()) {
exportShared();
DBHelper helper = new DBHelper(DataManagementActivity.this);
File dir = FileUtils.getExternalFilesDir();
File destFile = helper.exportDB(dbHandler, dir);
GB.toast(DataManagementActivity.this, getString(R.string.dbmanagementactivity_exported_to, destFile.getAbsolutePath()), Toast.LENGTH_LONG, GB.INFO);
} catch (Exception ex) {
GB.toast(DataManagementActivity.this, getString(R.string.dbmanagementactivity_error_exporting_db, ex.getMessage()), Toast.LENGTH_LONG, GB.ERROR, ex);
}
}
})
.setNegativeButton(R.string.Cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
}
private void importDB() {
@ -256,15 +308,15 @@ public class DbManagementActivity extends AbstractGBActivity {
@Override
public void onClick(DialogInterface dialog, int which) {
try (DBHandler dbHandler = GBApplication.acquireDB()) {
DBHelper helper = new DBHelper(DbManagementActivity.this);
DBHelper helper = new DBHelper(DataManagementActivity.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(DbManagementActivity.this, getString(R.string.dbmanagementactivity_import_successful), Toast.LENGTH_LONG, GB.INFO);
GB.toast(DataManagementActivity.this, getString(R.string.dbmanagementactivity_import_successful), Toast.LENGTH_LONG, GB.INFO);
} catch (Exception ex) {
GB.toast(DbManagementActivity.this, getString(R.string.dbmanagementactivity_error_importing_db, ex.getMessage()), Toast.LENGTH_LONG, GB.ERROR, ex);
GB.toast(DataManagementActivity.this, getString(R.string.dbmanagementactivity_error_importing_db, ex.getMessage()), Toast.LENGTH_LONG, GB.ERROR, ex);
}
importShared();
}
@ -285,10 +337,10 @@ public class DbManagementActivity extends AbstractGBActivity {
.setPositiveButton(R.string.Delete, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (GBApplication.deleteActivityDatabase(DbManagementActivity.this)) {
GB.toast(DbManagementActivity.this, getString(R.string.dbmanagementactivity_database_successfully_deleted), Toast.LENGTH_SHORT, GB.INFO);
if (GBApplication.deleteActivityDatabase(DataManagementActivity.this)) {
GB.toast(DataManagementActivity.this, getString(R.string.dbmanagementactivity_database_successfully_deleted), Toast.LENGTH_SHORT, GB.INFO);
} else {
GB.toast(DbManagementActivity.this, getString(R.string.dbmanagementactivity_db_deletion_failed), Toast.LENGTH_SHORT, GB.INFO);
GB.toast(DataManagementActivity.this, getString(R.string.dbmanagementactivity_db_deletion_failed), Toast.LENGTH_SHORT, GB.INFO);
}
}
})
@ -307,10 +359,10 @@ public class DbManagementActivity extends AbstractGBActivity {
new AlertDialog.Builder(this).setPositiveButton(R.string.Delete, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (GBApplication.deleteOldActivityDatabase(DbManagementActivity.this)) {
GB.toast(DbManagementActivity.this, getString(R.string.dbmanagementactivity_old_activity_db_successfully_deleted), Toast.LENGTH_SHORT, GB.INFO);
if (GBApplication.deleteOldActivityDatabase(DataManagementActivity.this)) {
GB.toast(DataManagementActivity.this, getString(R.string.dbmanagementactivity_old_activity_db_successfully_deleted), Toast.LENGTH_SHORT, GB.INFO);
} else {
GB.toast(DbManagementActivity.this, getString(R.string.dbmanagementactivity_old_activity_db_deletion_failed), Toast.LENGTH_SHORT, GB.INFO);
GB.toast(DataManagementActivity.this, getString(R.string.dbmanagementactivity_old_activity_db_deletion_failed), Toast.LENGTH_SHORT, GB.INFO);
}
}
});

View File

@ -418,7 +418,7 @@ public class SettingsActivity extends AbstractSettingsActivity {
/*
Either returns the file path of the selected document, or the display name, or an empty string
*/
private String getAutoExportLocationSummary() {
public String getAutoExportLocationSummary() {
String autoExportLocation = GBApplication.getPrefs().getString(GBPrefs.AUTO_EXPORT_LOCATION, null);
if (autoExportLocation == null) {
return "";

View File

@ -19,6 +19,7 @@ import java.util.List;
import java.util.Map;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.Widget;
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
import nodomain.freeyourgadget.gadgetbridge.database.DBHelper;
@ -58,7 +59,7 @@ public class WidgetConfigurationActivity extends Activity {
}
AlertDialog.Builder builder = new AlertDialog.Builder(WidgetConfigurationActivity.this);
builder.setTitle("Select device");
builder.setTitle(R.string.widget_settings_select_device_title);
allDevices = getAllDevices(getApplicationContext());

View File

@ -10,30 +10,27 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.gridlayout.widget.GridLayout
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
grid:alignmentMode="alignBounds"
grid:columnCount="2">
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingBottom="@dimen/activity_vertical_margin">
<TextView
android:id="@+id/exportImportLabel"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/activity_db_management_exportimport_label"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@color/accent"
grid:layout_columnSpan="2"
grid:layout_columnWeight="1" />
android:textColor="@color/accent"/>
<TextView
android:id="@+id/db_management_intro"
android:layout_width="fill_parent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/activity_db_management_import_export_explanation"
android:textAppearance="?android:attr/textAppearanceSmall"
@ -41,8 +38,8 @@
grid:layout_columnWeight="1" />
<TextView
android:id="@+id/activity_db_management_path"
android:layout_width="fill_parent"
android:id="@+id/activity_data_management_path"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textStyle="bold"
@ -50,19 +47,36 @@
grid:layout_columnWeight="1" />
<Button
android:id="@+id/exportDBButton"
android:text="@string/activity_DB_ExportButton"
grid:layout_column="0" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/exportDataButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/activity_DB_ExportButton" />
<Button
android:id="@+id/importDataButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/activity_DB_import_button" />
</LinearLayout>
<Button
android:id="@+id/importDBButton"
android:text="@string/activity_DB_import_button"
grid:layout_column="0" />
android:id="@+id/showContentDataButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/activity_DB_ShowContentButton" />
<TextView
android:id="@+id/autoExportLocation_label"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/activity_db_management_autoexport_label"
@ -73,7 +87,7 @@
<TextView
android:id="@+id/autoExportLocation_intro"
android:layout_width="fill_parent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/activity_db_management_autoexport_explanation"
android:textAppearance="?android:attr/textAppearanceSmall"
@ -82,7 +96,7 @@
<TextView
android:id="@+id/autoExportLocation_path"
android:layout_width="fill_parent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textStyle="bold"
@ -91,13 +105,14 @@
<Button
android:id="@+id/testExportDBButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/activity_DB_test_export_button"
grid:layout_column="0"
grid:layout_gravity="center" />
<TextView
android:id="@+id/mergeOldActivityDataTitle"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/activity_db_management_merge_old_title"
@ -109,12 +124,13 @@
<Button
android:id="@+id/deleteOldActivityDB"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/activity_DB_delete_legacy_button" />
<TextView
android:id="@+id/emptyActivityDataTitle"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/activity_db_management_empty_DB"
@ -125,7 +141,7 @@
<TextView
android:id="@+id/emptyDBText"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/activity_db_management_empty_db_warning"
android:textAppearance="?android:attr/textAppearanceSmall"
@ -134,9 +150,11 @@
<Button
android:id="@+id/emptyDBButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/activity_DB_empty_button" />
</androidx.gridlayout.widget.GridLayout>
</LinearLayout>
</ScrollView>

View File

@ -10,7 +10,7 @@
<item android:id="@+id/action_debug"
android:title="@string/action_debug"
android:icon="@drawable/ic_devices_other" />
<item android:id="@+id/action_db_management"
<item android:id="@+id/action_data_management"
android:title="@string/action_db_management"
android:icon="@drawable/ic_pageview" />
<item android:id="@+id/action_blacklist"

View File

@ -653,16 +653,18 @@
<string name="activity_prefs_activetime_minutes">Daily target: active time in minutes</string>
<string name="pref_title_pebble_health_store_raw">Store raw record in the database</string>
<string name="pref_summary_pebble_health_store_raw">Stores the data \"as is\", increasing the database usage to allow for later interpretation.</string>
<string name="action_db_management">Database management</string>
<string name="title_activity_db_management">Database management</string>
<string name="activity_db_management_import_export_explanation">The database operations use the following path on your device. \nThis path is accessible to other Android apps and your computer. \nExpect to find your exported database (or place the database you want to import) there:</string>
<string name="action_db_management">Data management</string>
<string name="title_activity_db_management">Data management</string>
<string name="activity_db_management_import_export_explanation">The export/import operations use the following path to a directory on your device. This directory is accessible to other Android apps and your computer. The data includes:\n Export_preference - global settings\n Export_preference_MAC - device specific settings\n Gadgetbridge - device and activity database\n Gadgetbridge_date - database exported on a date\n *.gpx - GPS recordings\n *.log - log files\nExpect to find your exported files (or place the files you want to import) there:</string>
<string name="activity_db_management_merge_old_title">Legacy database delete</string>
<string name="dbmanagementactivvity_cannot_access_export_path">Cannot access export path. Please contact the developers.</string>
<string name="dbmanagementactivity_exported_to">Exported to: %1$s</string>
<string name="dbmanagementactivity_error_exporting_db">"Error exporting DB: %1$s"</string>
<string name="dbmanagementactivity_error_exporting_shared">"Error exporting preference: %1$s"</string>
<string name="dbmanagementactivity_import_data_title">Import Data?</string>
<string name="dbmanagementactivity_overwrite_database_confirmation">Really overwrite the current database? All your current activity data (if any) will be lost.</string>
<string name="dbmanagementactivity_export_data_title">ExportData?</string>
<string name="dbmanagementactivity_overwrite_database_confirmation">Really overwrite the current data? All your current activity data (if any) and preferences will be overwritten.</string>
<string name="dbmanagementactivity_export_confirmation">Really export data? Previously exported activity data (if any) and preferences will be overwritten.</string>
<string name="dbmanagementactivity_import_successful">Imported.</string>
<string name="dbmanagementactivity_error_importing_db">"Error importing DB: %1$s"</string>
<string name="dbmanagementactivity_error_importing_shared">"Error importing preference: %1$s"</string>
@ -677,12 +679,12 @@
<string name="dbmanagementactivity_overwrite">Overwrite</string>
<string name="activity_db_management_autoexport_explanation">Database autoexport location has been set to:</string>
<string name="activity_db_management_autoexport_label">AutoExport</string>
<string name="activity_DB_ExportButton">Export DB</string>
<string name="activity_DB_import_button">Import DB</string>
<string name="activity_DB_ExportButton">Export Data</string>
<string name="activity_DB_import_button">Import Data</string>
<string name="activity_DB_test_export_button">Run AutoExport Now</string>
<string name="activity_DB_test_export_message">Exporting database…</string>
<string name="activity_DB_delete_legacy_button">Delete old DB</string>
<string name="activity_DB_empty_button">Empty DB</string>
<string name="activity_DB_empty_button">Empty Database</string>
<string name="activity_db_management_empty_DB">Empty Database</string>
<string name="activity_db_management_exportimport_label">Export and Import</string>
<string name="activity_db_management_empty_db_warning">Warning! By pushing this button you will wipe your database and start from scratch.</string>
@ -898,6 +900,7 @@
<string name="save_configuration">Save Configuration</string>
<!-- App Widgets-->
<string name="appwidget_not_connected">Not connected, alarm not set.</string>
<string name="widget_settings_select_device_title">Select device</string>
<string name="appwidget_text">Zzz</string>
<string name="add_widget">Add widget</string>
<string name="appwidget_setting_alarm">Setting alarm for %1$02d:%2$02d</string>
@ -1104,4 +1107,6 @@
<string name="prefs_operating_sounds">Operating Sounds</string>
<string name="prefs_fake_ring_duration">Fake continuous ringing</string>
<string name="prefs_autoremove_message">Automatically remove SMS notifications</string>
<string name="activity_data_management_directory_content_title">Export/Import directory content</string>
<string name="activity_DB_ShowContentButton">Show Export/Import directory content</string>
</resources>