Widget unified image URIs

master
M66B 9 months ago
parent 93214faea4
commit fe70f0402c

@ -23,11 +23,13 @@ import android.appwidget.AppWidgetManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.graphics.drawable.Icon; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.text.SpannableString; import android.text.SpannableString;
import android.text.Spanned; import android.text.Spanned;
@ -43,6 +45,11 @@ import androidx.core.content.ContextCompat;
import androidx.core.graphics.ColorUtils; import androidx.core.graphics.ColorUtils;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -173,13 +180,39 @@ public class WidgetUnifiedRemoteViewsFactory implements RemoteViewsService.Remot
db.endTransaction(); db.endTransaction();
} }
File dir = new File(Helper.getExternalFilesDir(context), "avatars");
dir.mkdirs();
hasColor = false; hasColor = false;
allColors = (account_color > 0); allColors = (account_color > 0);
for (TupleMessageWidget message : messages) for (TupleMessageWidget message : messages) {
if (message.accountColor == null) if (message.accountColor == null)
allColors = false; allColors = false;
else else
hasColor = true; hasColor = true;
File file = new File(dir, message.id + ".png");
if (!file.exists()) {
ContactInfo[] info = ContactInfo.get(context,
message.account, null,
message.bimi_selector, Boolean.TRUE.equals(message.dmarc),
message.isForwarder() ? message.submitter : message.from);
Bitmap bm = (info.length == 0 ? null : info[0].getPhotoBitmap());
if (bm != null) {
int dp36 = Helper.dp2pixels(context, 36);
bm = Bitmap.createScaledBitmap(bm, dp36, bm.getHeight() * dp36 / bm.getWidth(), true);
}
if (bm != null) {
try (OutputStream os = new BufferedOutputStream(new FileOutputStream(file))) {
bm.compress(Bitmap.CompressFormat.PNG, ImageHelper.DEFAULT_PNG_COMPRESSION, os);
} catch (IOException ex) {
Log.e(ex);
}
}
}
}
} }
@Override @Override
@ -249,21 +282,18 @@ public class WidgetUnifiedRemoteViewsFactory implements RemoteViewsService.Remot
views.setViewVisibility(R.id.stripe, hasColor && account_color == 1 ? View.VISIBLE : View.GONE); views.setViewVisibility(R.id.stripe, hasColor && account_color == 1 ? View.VISIBLE : View.GONE);
if (avatars) { if (avatars) {
ContactInfo[] info = ContactInfo.get(context, File dir = new File(Helper.getExternalFilesDir(context), "avatars");
message.account, null, File file = new File(dir, message.id + ".png");
message.bimi_selector, Boolean.TRUE.equals(message.dmarc), if (file.exists()) {
message.isForwarder() ? message.submitter : message.from); Uri uri = FileProviderEx.getUri(context, BuildConfig.APPLICATION_ID, file);
Bitmap bm = (info.length == 0 ? null : info[0].getPhotoBitmap()); Intent intent = new Intent(Intent.ACTION_MAIN);
if (bm != null) { intent.addCategory(Intent.CATEGORY_HOME);
int w = bm.getWidth(); List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
int h = bm.getHeight(); for (ResolveInfo resolveInfo : resInfoList)
int dp36 = Helper.dp2pixels(context, 36); context.grantUriPermission(resolveInfo.activityInfo.packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
bm = Bitmap.createScaledBitmap(bm, dp36, bm.getHeight() * dp36 / bm.getWidth(), true); views.setImageViewUri(R.id.avatar, uri);
} } else
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.BAKLAVA) views.setImageViewBitmap(R.id.avatar, null);
views.setImageViewBitmap(R.id.avatar, bm);
else
views.setImageViewIcon(R.id.avatar, bm == null ? null : Icon.createWithBitmap(bm));
} }
views.setViewVisibility(R.id.avatar, avatars ? View.VISIBLE : View.GONE); views.setViewVisibility(R.id.avatar, avatars ? View.VISIBLE : View.GONE);

@ -225,6 +225,7 @@ public class WorkerCleanup extends Worker {
cleanupMessageFiles(db, manual, Helper.ensureExists(context, "encryption").listFiles()); cleanupMessageFiles(db, manual, Helper.ensureExists(context, "encryption").listFiles());
cleanupMessageFiles(db, manual, Helper.ensureExists(context, "photo").listFiles()); cleanupMessageFiles(db, manual, Helper.ensureExists(context, "photo").listFiles());
cleanupMessageFiles(db, manual, Helper.ensureExists(context, "calendar").listFiles()); cleanupMessageFiles(db, manual, Helper.ensureExists(context, "calendar").listFiles());
cleanupMessageFiles(db, manual, new File(Helper.getExternalFilesDir(context), "avatars").listFiles());
// Cleanup raw message files // Cleanup raw message files
if (!download_eml) { if (!download_eml) {

@ -24,4 +24,7 @@
<files-path <files-path
name="shared" name="shared"
path="shared" /> path="shared" />
<external-files-path
name="avatars"
path="avatars" />
</paths> </paths>

Loading…
Cancel
Save