Share: removed PNG share pic.

Fixes #1127.
This commit is contained in:
Dennis Guse
2022-02-14 21:38:03 +01:00
parent 8dca84456b
commit 094c97f78d
5 changed files with 5 additions and 204 deletions
@@ -66,8 +66,6 @@ public class ShareContentProvider extends CustomContentProvider {
uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TracksColumns.TABLE_NAME + "/" + TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA.getName() + "/*/*", URI_KMZ_WITH_TRACKDETAIL_AND_SENSORDATA);
uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TracksColumns.TABLE_NAME + "/" + TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA_AND_PICTURES.getName() + "/*/*", URI_KMZ_WITH_TRACKDETAIL_SENSORDATA_AND_PICTURES);
uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TracksColumns.TABLE_NAME + "/" + TrackFileFormat.SHARE_PICTURE_PNG.getName() + "/*/*", URI_SHARE_PICTURE);
}
/**
@@ -148,9 +146,6 @@ public class ShareContentProvider extends CustomContentProvider {
case URI_KMZ_WITH_TRACKDETAIL_SENSORDATA_AND_PICTURES:
return TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA_AND_PICTURES;
case URI_SHARE_PICTURE:
return TrackFileFormat.SHARE_PICTURE_PNG;
default:
throw new RuntimeException("Could not derive TrackFileFormat from Uri " + uri);
}
@@ -1,7 +1,6 @@
package de.dennisguse.opentracks.io.file;
import android.content.Context;
import android.graphics.Bitmap;
import java.util.Locale;
@@ -10,7 +9,6 @@ import de.dennisguse.opentracks.data.ContentProviderUtils;
import de.dennisguse.opentracks.io.file.exporter.GPXTrackExporter;
import de.dennisguse.opentracks.io.file.exporter.KMLTrackExporter;
import de.dennisguse.opentracks.io.file.exporter.KmzTrackExporter;
import de.dennisguse.opentracks.io.file.exporter.SharePictureTrackExporter;
import de.dennisguse.opentracks.io.file.exporter.TrackExporter;
/**
@@ -102,22 +100,6 @@ public enum TrackFileFormat {
public String getExtension() {
return "gpx";
}
},
SHARE_PICTURE_PNG {
@Override
public TrackExporter createTrackExporter(Context context) {
return new SharePictureTrackExporter(context, Bitmap.CompressFormat.PNG);
}
@Override
public String getMimeType() {
return "image/png";
}
public String getExtension() {
return "png";
}
};
private static final String MIME_KMZ = "application/vnd.google-earth.kmz";
@@ -1,88 +0,0 @@
package de.dennisguse.opentracks.io.file.exporter;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import androidx.annotation.NonNull;
import java.io.OutputStream;
import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.databinding.TrackSharePictureBinding;
import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.util.StringUtils;
/**
* Create a share picture for a track.
* Here a layout is inflated and converted to PNG.
* <p>
* TODO
* If this classes is used with non-visual context (e.g., ApplicationContext), it may not work in the future.
* API31 introduces `ncorrectContextUseViolation`, which may thrown during runtime.
* This code was tested on API30.
* Some more information: https://stackoverflow.com/questions/68539083/inflate-layout-from-applicationcontext-i-e-in-a-contentprovider/68567186#68567186
* <p>
* Future plan: draw directly on a view.
*/
public class SharePictureTrackExporter implements TrackExporter {
private static final String TAG = SharePictureTrackExporter.class.getSimpleName();
private final static int imageWidth = 1024;
private final Context context;
private final Bitmap.CompressFormat compressFormat;
public SharePictureTrackExporter(Context context, Bitmap.CompressFormat compressFormat) {
this.context = context;
this.compressFormat = compressFormat;
}
@Override
public boolean writeTrack(Track[] tracks, @NonNull OutputStream outputStream) {
if (tracks.length > 1) {
Log.e(TAG, "Not yet implemented.");
return false;
}
return writeTrack(tracks[0], outputStream);
}
@Override
public boolean writeTrack(Track track, @NonNull OutputStream outputStream) {
int imageHeight = imageWidth / 4 * 3;
TrackSharePictureBinding viewBinding = TrackSharePictureBinding.inflate(LayoutInflater.from(context));
viewBinding.sharePictureCategory.setText(track.getCategory());
boolean metricUnits = PreferencesUtils.isMetricUnits();
TrackStatistics trackStatistics = track.getTrackStatistics();
viewBinding.sharePictureTotalTime.setText(StringUtils.formatElapsedTimeWithHour(track.getTrackStatistics().getTotalTime()));
viewBinding.sharePictureTotalDistance.setText(StringUtils.formatDistance(context, track.getTrackStatistics().getTotalDistance(), metricUnits));
viewBinding.sharePictureGain.setText(StringUtils.formatAltitudeChange(context, trackStatistics.getTotalAltitudeGain(), metricUnits));
// prepare rendering
View view = viewBinding.getRoot();
int widthSpec = View.MeasureSpec.makeMeasureSpec(imageWidth, View.MeasureSpec.EXACTLY);
int heightSpec = View.MeasureSpec.makeMeasureSpec(imageHeight, View.MeasureSpec.EXACTLY);
view.measure(widthSpec, heightSpec);
view.layout(0, 0, imageWidth, imageHeight);
// draw
Canvas canvas = new Canvas();
Bitmap bitmap = Bitmap.createBitmap(imageWidth, imageHeight, Bitmap.Config.ARGB_8888);
canvas.setBitmap(bitmap);
view.draw(canvas);
// store
return bitmap.compress(compressFormat, 100, outputStream);
}
}
@@ -9,14 +9,12 @@ import android.util.Pair;
import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.ContentProviderUtils;
import de.dennisguse.opentracks.data.ShareContentProvider;
import de.dennisguse.opentracks.data.models.Marker;
import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.io.file.TrackFileFormat;
import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.util.FileUtils;
@@ -47,6 +45,7 @@ public class ShareUtils {
trackDescription = track == null ? "" : new DescriptionGenerator(context).generateTrackDescription(track, false);
}
String mime = "";
ArrayList<Uri> uris = new ArrayList<>();
for (Track.Id trackId : trackIds) {
Track track = contentProviderUtils.getTrack(trackId);
@@ -56,14 +55,14 @@ public class ShareUtils {
}
String trackName = FileUtils.sanitizeFileName(track.getName());
Pair<Uri, String> uriTrackFile = ShareContentProvider.createURI(trackId, trackName, PreferencesUtils.getExportTrackFileFormat());
Pair<Uri, String> uriSharePicture = ShareContentProvider.createURI(trackId, trackName, TrackFileFormat.SHARE_PICTURE_PNG);
Pair<Uri, String> uriAndMime = ShareContentProvider.createURI(trackId, trackName, PreferencesUtils.getExportTrackFileFormat());
uris.addAll(Arrays.asList(uriSharePicture.first, uriTrackFile.first));
uris.add(uriAndMime.first);
mime = uriAndMime.second;
}
return new Intent(Intent.ACTION_SEND_MULTIPLE)
.setType("image/*")
.setType(mime)
.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris)
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
.putExtra(Intent.EXTRA_SUBJECT, context.getString(R.string.share_track_subject))
@@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?><!--<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="SpUsage">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/splashscreen_background"
android:padding="40dp"
android:src="@drawable/ic_logo_color_24dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_gravity="top"
android:layout_margin="20dp">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:scaleType="fitStart"
android:src="@drawable/ic_logo_color_24dp"
android:textAlignment="center" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical|end"
android:text="@string/app_name"
android:layout_gravity="center"
android:textColor="@android:color/white"
app:autoSizeTextType="uniform" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_gravity="bottom">
<TextView
android:id="@+id/share_picture_category"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:textColor="@android:color/white"
app:autoSizeTextType="uniform"
tools:text="CATEGORY" />
<TextView
android:id="@+id/share_picture_total_time"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:textColor="@android:color/white"
app:autoSizeTextType="uniform"
tools:text="00:10:10" />
<TextView
android:id="@+id/share_picture_total_distance"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:textColor="@android:color/white"
app:autoSizeTextType="uniform"
tools:text="135km" />
<TextView
android:id="@+id/share_picture_gain"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:textColor="@android:color/white"
app:autoSizeTextType="uniform"
tools:text="214m" />
</LinearLayout>
</FrameLayout>