mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2025-02-24 16:31:13 +01:00
Add menus to share GPX, raw summary, raw details
This commit is contained in:
parent
9851493cf1
commit
a8b9d22313
@ -188,7 +188,7 @@ public class ActivitySummaryDetail extends AbstractGBActivity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
layout.startAnimation(animFadeRight);
|
layout.startAnimation(animFadeRight);
|
||||||
show_hide_gpx_menu();
|
updateMenuItems();
|
||||||
} else {
|
} else {
|
||||||
layout.startAnimation(animBounceRight);
|
layout.startAnimation(animBounceRight);
|
||||||
}
|
}
|
||||||
@ -211,7 +211,7 @@ public class ActivitySummaryDetail extends AbstractGBActivity {
|
|||||||
|
|
||||||
|
|
||||||
layout.startAnimation(animFadeLeft);
|
layout.startAnimation(animFadeLeft);
|
||||||
show_hide_gpx_menu();
|
updateMenuItems();
|
||||||
} else {
|
} else {
|
||||||
layout.startAnimation(animBounceLeft);
|
layout.startAnimation(animBounceLeft);
|
||||||
}
|
}
|
||||||
@ -560,8 +560,17 @@ public class ActivitySummaryDetail extends AbstractGBActivity {
|
|||||||
case R.id.activity_action_take_screenshot:
|
case R.id.activity_action_take_screenshot:
|
||||||
take_share_screenshot(ActivitySummaryDetail.this);
|
take_share_screenshot(ActivitySummaryDetail.this);
|
||||||
return true;
|
return true;
|
||||||
|
case R.id.activity_action_show_gpx:
|
||||||
|
viewGpxTrack(ActivitySummaryDetail.this);
|
||||||
|
return true;
|
||||||
case R.id.activity_action_share_gpx:
|
case R.id.activity_action_share_gpx:
|
||||||
share_gpx_track(ActivitySummaryDetail.this);
|
shareGpxTrack(ActivitySummaryDetail.this, currentItem);
|
||||||
|
return true;
|
||||||
|
case R.id.activity_action_dev_share_raw_summary:
|
||||||
|
shareRawSummary(ActivitySummaryDetail.this, currentItem);
|
||||||
|
return true;
|
||||||
|
case R.id.activity_action_dev_share_raw_details:
|
||||||
|
shareRawDetails(ActivitySummaryDetail.this, currentItem);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
@ -604,7 +613,7 @@ public class ActivitySummaryDetail extends AbstractGBActivity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void share_gpx_track(Context context) {
|
private void viewGpxTrack(Context context) {
|
||||||
final String gpxTrack = currentItem.getGpxTrack();
|
final String gpxTrack = currentItem.getGpxTrack();
|
||||||
|
|
||||||
if (gpxTrack != null) {
|
if (gpxTrack != null) {
|
||||||
@ -618,16 +627,63 @@ public class ActivitySummaryDetail extends AbstractGBActivity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void show_hide_gpx_menu() {
|
private static void shareGpxTrack(final Context context, final BaseActivitySummary summary) {
|
||||||
String gpxTrack = null;
|
try {
|
||||||
|
AndroidUtils.shareFile(context, new File(summary.getGpxTrack()));
|
||||||
|
} catch (final Exception e) {
|
||||||
|
GB.toast(context, "Unable to share GPX track: " + e.getMessage(), Toast.LENGTH_LONG, GB.ERROR, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void shareRawSummary(final Context context, final BaseActivitySummary summary) {
|
||||||
|
if (summary.getRawSummaryData() == null) {
|
||||||
|
GB.toast(context, "No raw summary in this activity", Toast.LENGTH_LONG, GB.WARN);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final String rawSummaryFilename = FileUtils.makeValidFileName(String.format("%s_summary.bin", DateTimeUtils.formatIso8601(summary.getStartTime())));
|
||||||
|
|
||||||
|
try {
|
||||||
|
AndroidUtils.shareBytesAsFile(context, rawSummaryFilename, summary.getRawSummaryData());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
GB.toast(context, "Unable to share GPX track: " + e.getMessage(), Toast.LENGTH_LONG, GB.ERROR, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void shareRawDetails(final Context context, final BaseActivitySummary summary) {
|
||||||
|
if (summary.getRawDetailsPath() == null) {
|
||||||
|
GB.toast(context, "No raw details in this activity", Toast.LENGTH_LONG, GB.WARN);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
AndroidUtils.shareFile(context, new File(summary.getRawDetailsPath()));
|
||||||
|
} catch (final Exception e) {
|
||||||
|
GB.toast(context, "Unable to share raw details: " + e.getMessage(), Toast.LENGTH_LONG, GB.ERROR, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateMenuItems() {
|
||||||
|
boolean hasGpx = false;
|
||||||
|
boolean hasRawSummary = false;
|
||||||
|
boolean hasRawDetails = false;
|
||||||
|
|
||||||
if (currentItem != null) {
|
if (currentItem != null) {
|
||||||
gpxTrack = currentItem.getGpxTrack();
|
hasGpx = currentItem.getGpxTrack() != null;
|
||||||
}
|
hasRawSummary = currentItem.getRawSummaryData() != null;
|
||||||
if (gpxTrack == null) {
|
|
||||||
mOptionsMenu.findItem(R.id.activity_detail_overflowMenu).getSubMenu().findItem(R.id.activity_action_share_gpx).setVisible(false);
|
final String rawDetailsPath = currentItem.getRawDetailsPath();
|
||||||
} else {
|
if (rawDetailsPath != null) {
|
||||||
mOptionsMenu.findItem(R.id.activity_detail_overflowMenu).getSubMenu().findItem(R.id.activity_action_share_gpx).setVisible(true);
|
hasRawDetails = new File(rawDetailsPath).exists();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mOptionsMenu.findItem(R.id.activity_detail_overflowMenu).getSubMenu().findItem(R.id.activity_action_show_gpx).setVisible(hasGpx);
|
||||||
|
mOptionsMenu.findItem(R.id.activity_detail_overflowMenu).getSubMenu().findItem(R.id.activity_action_share_gpx).setVisible(hasGpx);
|
||||||
|
mOptionsMenu.findItem(R.id.activity_detail_overflowMenu).getSubMenu().findItem(R.id.activity_action_dev_share_raw_summary).setVisible(hasRawSummary);
|
||||||
|
mOptionsMenu.findItem(R.id.activity_detail_overflowMenu).getSubMenu().findItem(R.id.activity_action_dev_share_raw_details).setVisible(hasRawDetails);
|
||||||
|
final MenuItem devToolsMenu = mOptionsMenu.findItem(R.id.activity_detail_overflowMenu).getSubMenu().findItem(R.id.activity_action_dev_tools);
|
||||||
|
devToolsMenu.setVisible(devToolsMenu.getSubMenu().hasVisibleItems());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showCanvas() {
|
private void showCanvas() {
|
||||||
@ -663,7 +719,7 @@ public class ActivitySummaryDetail extends AbstractGBActivity {
|
|||||||
super.onCreateOptionsMenu(menu);
|
super.onCreateOptionsMenu(menu);
|
||||||
mOptionsMenu = menu;
|
mOptionsMenu = menu;
|
||||||
getMenuInflater().inflate(R.menu.activity_take_screenshot_menu, menu);
|
getMenuInflater().inflate(R.menu.activity_take_screenshot_menu, menu);
|
||||||
show_hide_gpx_menu();
|
updateMenuItems();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,7 +26,6 @@ import android.content.res.Configuration;
|
|||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.os.ParcelUuid;
|
import android.os.ParcelUuid;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
@ -40,7 +39,11 @@ import androidx.annotation.Nullable;
|
|||||||
import androidx.core.content.FileProvider;
|
import androidx.core.content.FileProvider;
|
||||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
@ -49,6 +52,8 @@ import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
|
|
||||||
public class AndroidUtils {
|
public class AndroidUtils {
|
||||||
|
private static final Logger LOG = LoggerFactory.getLogger(AndroidUtils.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link ParcelUuid} array with the contents of the given uuids.
|
* Creates a new {@link ParcelUuid} array with the contents of the given uuids.
|
||||||
* The given array is expected to contain only {@link ParcelUuid} elements.
|
* The given array is expected to contain only {@link ParcelUuid} elements.
|
||||||
@ -244,4 +249,47 @@ public class AndroidUtils {
|
|||||||
Toast.makeText(context, R.string.activity_error_no_app_for_gpx, Toast.LENGTH_LONG).show();
|
Toast.makeText(context, R.string.activity_error_no_app_for_gpx, Toast.LENGTH_LONG).show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void shareBytesAsFile(final Context context, final String name, final byte[] bytes) throws IOException {
|
||||||
|
final File cacheDir = context.getCacheDir();
|
||||||
|
final File rawCacheDir = new File(cacheDir, "raw");
|
||||||
|
rawCacheDir.mkdir();
|
||||||
|
final File file = new File(rawCacheDir, name);
|
||||||
|
|
||||||
|
try (FileOutputStream outputStream = new FileOutputStream(file)) {
|
||||||
|
outputStream.write(bytes);
|
||||||
|
} catch (final IOException e) {
|
||||||
|
LOG.error("Failed to write bytes to temporary file", e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
shareFile(context, file);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void shareFile(final Context context, final File file) throws IOException {
|
||||||
|
if (!file.exists()) {
|
||||||
|
LOG.warn("File {} does not exist", file.getPath());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
shareFile(context, file, "*/*");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void shareFile(final Context context, final File file, final String type) throws IOException {
|
||||||
|
final Uri contentUri = FileProvider.getUriForFile(
|
||||||
|
context,
|
||||||
|
context.getApplicationContext().getPackageName() + ".screenshot_provider",
|
||||||
|
file
|
||||||
|
);
|
||||||
|
|
||||||
|
final Intent intent = new Intent(Intent.ACTION_SEND);
|
||||||
|
intent.setType(type);
|
||||||
|
intent.putExtra(Intent.EXTRA_STREAM, contentUri);
|
||||||
|
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||||
|
try {
|
||||||
|
context.startActivity(Intent.createChooser(intent, "Share file"));
|
||||||
|
} catch (ActivityNotFoundException e) {
|
||||||
|
Toast.makeText(context, R.string.activity_error_share_failed, Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,11 +17,35 @@
|
|||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/activity_action_share_gpx"
|
android:id="@+id/activity_action_show_gpx"
|
||||||
android:icon="@drawable/ic_map"
|
android:icon="@drawable/ic_map"
|
||||||
android:title="@string/activity_detail_show_gps_label"
|
android:title="@string/activity_detail_show_gps_label"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/activity_action_share_gpx"
|
||||||
|
android:icon="@drawable/ic_share"
|
||||||
|
android:title="@string/activity_detail_share_gps_label"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/activity_action_dev_tools"
|
||||||
|
android:icon="@drawable/ic_developer_mode"
|
||||||
|
android:title="@string/dev_tools"
|
||||||
|
app:showAsAction="never">
|
||||||
|
<menu>
|
||||||
|
<item
|
||||||
|
android:id="@+id/activity_action_dev_share_raw_summary"
|
||||||
|
android:title="@string/activity_detail_share_raw_summary"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/activity_action_dev_share_raw_details"
|
||||||
|
android:title="@string/activity_detail_share_raw_details"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
</menu>
|
||||||
|
</item>
|
||||||
|
|
||||||
</menu>
|
</menu>
|
||||||
</item>
|
</item>
|
||||||
</menu>
|
</menu>
|
||||||
|
@ -1188,6 +1188,7 @@
|
|||||||
<string name="activity_type_exercise">Exercise</string>
|
<string name="activity_type_exercise">Exercise</string>
|
||||||
<string name="activity_error_no_app_for_gpx">To view activity trace, install app which can handle GPX files.</string>
|
<string name="activity_error_no_app_for_gpx">To view activity trace, install app which can handle GPX files.</string>
|
||||||
<string name="activity_error_no_app_for_png">To share this screenshot, install an app which can handle image files.</string>
|
<string name="activity_error_no_app_for_png">To share this screenshot, install an app which can handle image files.</string>
|
||||||
|
<string name="activity_error_share_failed">Sharing file failed.</string>
|
||||||
<string name="select_all">Select all</string>
|
<string name="select_all">Select all</string>
|
||||||
<string name="share">Share</string>
|
<string name="share">Share</string>
|
||||||
<string name="reset_index">Reset fetch date</string>
|
<string name="reset_index">Reset fetch date</string>
|
||||||
@ -1618,7 +1619,11 @@
|
|||||||
<string name="activity_detail_end_label">End</string>
|
<string name="activity_detail_end_label">End</string>
|
||||||
<string name="activity_detail_duration_label">Duration</string>
|
<string name="activity_detail_duration_label">Duration</string>
|
||||||
<string name="activity_detail_show_gps_label">Show GPS Track</string>
|
<string name="activity_detail_show_gps_label">Show GPS Track</string>
|
||||||
|
<string name="activity_detail_share_gps_label">Share GPS Track</string>
|
||||||
|
<string name="activity_detail_share_raw_summary">Share Raw Summary</string>
|
||||||
|
<string name="activity_detail_share_raw_details">Share Raw Details</string>
|
||||||
<string name="gps_track">GPS track</string>
|
<string name="gps_track">GPS track</string>
|
||||||
|
<string name="dev_tools">Dev Tools</string>
|
||||||
<!-- Device Actions Preferences -->
|
<!-- Device Actions Preferences -->
|
||||||
<string name="prefs_events_forwarding_summary">Use device events to trigger actions and Android broadcasts</string>
|
<string name="prefs_events_forwarding_summary">Use device events to trigger actions and Android broadcasts</string>
|
||||||
<string name="prefs_events_forwarding_title">Device actions</string>
|
<string name="prefs_events_forwarding_title">Device actions</string>
|
||||||
|
@ -2,5 +2,6 @@
|
|||||||
<!-- defines directories shared to other applications -->
|
<!-- defines directories shared to other applications -->
|
||||||
<paths xmlns:android="http://schemas.android.com/apk/res/android">
|
<paths xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<external-path name="external_files" path="."/>
|
<external-path name="external_files" path="."/>
|
||||||
<files-path name="gpx" path="./"/>
|
<files-path name="gpx" path="./" />
|
||||||
</paths>
|
<cache-path name="raw" path="raw/" />
|
||||||
|
</paths>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user