diff --git a/briar-android/src/debug/java/org/briarproject/briar/android/test/TestAvatarCreatorImpl.java b/briar-android/src/debug/java/org/briarproject/briar/android/test/TestAvatarCreatorImpl.java new file mode 100644 index 000000000..edcc1ad28 --- /dev/null +++ b/briar-android/src/debug/java/org/briarproject/briar/android/test/TestAvatarCreatorImpl.java @@ -0,0 +1,109 @@ +/* + * Some code was taken from: + * + * RIG – Random Image Generator + * https://github.com/stedi-akk/RandomImageGenerator + * licenced under Apache2 license. + */ + +package org.briarproject.briar.android.test; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; + +import org.briarproject.briar.api.test.TestAvatarCreator; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.util.Random; + +import javax.annotation.Nullable; + +import static android.graphics.Bitmap.CompressFormat.JPEG; +import static org.briarproject.briar.api.media.MediaConstants.MAX_IMAGE_SIZE; + +public class TestAvatarCreatorImpl implements TestAvatarCreator { + private final int WIDTH = 800; + private final int HEIGHT = 640; + + private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final float[] hsv = new float[3]; + private final Random random = new Random(); + + @Nullable + @Override + public InputStream getAvatarInputStream() { + Bitmap bitmap = generateBitmap(); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + // TODO maybe use ImageCompressor once available standalone + for (int quality = 100; quality >= 0; quality -= 10) { + if (!bitmap.compress(JPEG, quality, out)) return null; + if (out.size() <= MAX_IMAGE_SIZE) { + return new ByteArrayInputStream(out.toByteArray()); + } + out.reset(); + } + return new ByteArrayInputStream(out.toByteArray()); + } + + private Bitmap generateBitmap() { + // one pattern is boring, let's at least use two + if (random.nextBoolean()) { + return generateColoredPixels(); + } else { + return generateColoredCircles(); + } + } + + private Bitmap generateColoredPixels() { + Bitmap bitmap = getBitmapWithRandomBackground(); + Canvas canvas = new Canvas(bitmap); + Rect pixel = new Rect(); + int pixelMultiplier = random.nextInt(500) + 1; + for (int x = 0; x < WIDTH; x += pixelMultiplier) { + for (int y = 0; y < HEIGHT; y += pixelMultiplier) { + pixel.set(x, y, x + pixelMultiplier, y + pixelMultiplier); + paint.setColor(getRandomColor()); + canvas.drawRect(pixel, paint); + } + } + return bitmap; + } + + private Bitmap generateColoredCircles() { + Bitmap bitmap = getBitmapWithRandomBackground(); + int biggestSide = Math.max(WIDTH, HEIGHT); + int selectedCount = random.nextInt(10) + 2; + Canvas canvas = new Canvas(bitmap); + float radiusFrom = biggestSide / 12f; + float radiusTo = biggestSide / 4f; + for (int i = 0; i < selectedCount; i++) { + float cx = random.nextInt(WIDTH); + float cy = random.nextInt(HEIGHT); + float radius = + random.nextInt((int) (radiusTo - radiusFrom)) + radiusFrom; + paint.setColor(getRandomColor()); + canvas.drawCircle(cx, cy, radius, paint); + } + return bitmap; + } + + private Bitmap getBitmapWithRandomBackground() { + Bitmap bitmap = + Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888); + bitmap.eraseColor(getRandomColor()); + return bitmap; + } + + private int getRandomColor() { + hsv[0] = random.nextInt(360); + hsv[1] = random.nextFloat(); + hsv[2] = 1f; + return Color.HSVToColor(hsv); + } + +} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java index 747f60897..0ebb6d789 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java @@ -35,11 +35,13 @@ import org.briarproject.briar.android.login.LoginModule; import org.briarproject.briar.android.navdrawer.NavDrawerModule; import org.briarproject.briar.android.privategroup.list.GroupListModule; import org.briarproject.briar.android.reporting.DevReportModule; +import org.briarproject.briar.android.test.TestAvatarCreatorImpl; import org.briarproject.briar.android.viewmodel.ViewModelModule; import org.briarproject.briar.api.android.AndroidNotificationManager; import org.briarproject.briar.api.android.DozeWatchdog; import org.briarproject.briar.api.android.LockManager; import org.briarproject.briar.api.android.ScreenFilterMonitor; +import org.briarproject.briar.api.test.TestAvatarCreator; import java.io.File; import java.security.GeneralSecurityException; @@ -184,6 +186,11 @@ public class AppModule { return devConfig; } + @Provides + TestAvatarCreator provideTestAvatarCreator() { + return new TestAvatarCreatorImpl(); + } + @Provides SharedPreferences provideSharedPreferences(Application app) { // FIXME unify this with getDefaultSharedPreferences() diff --git a/briar-android/src/release/java/org/briarproject/briar/android/test/TestAvatarCreatorImpl.java b/briar-android/src/release/java/org/briarproject/briar/android/test/TestAvatarCreatorImpl.java new file mode 100644 index 000000000..f3299e209 --- /dev/null +++ b/briar-android/src/release/java/org/briarproject/briar/android/test/TestAvatarCreatorImpl.java @@ -0,0 +1,17 @@ +package org.briarproject.briar.android.test; + +import android.util.Log; + +import org.briarproject.briar.api.test.TestAvatarCreator; + +import java.io.InputStream; + +import javax.annotation.Nullable; + +public class TestAvatarCreatorImpl implements TestAvatarCreator { + @Nullable + @Override + public InputStream getAvatarInputStream() { + return null; + } +} diff --git a/briar-api/src/main/java/org/briarproject/briar/api/test/TestAvatarCreator.java b/briar-api/src/main/java/org/briarproject/briar/api/test/TestAvatarCreator.java new file mode 100644 index 000000000..534a25ce1 --- /dev/null +++ b/briar-api/src/main/java/org/briarproject/briar/api/test/TestAvatarCreator.java @@ -0,0 +1,10 @@ +package org.briarproject.briar.api.test; + +import java.io.InputStream; + +import javax.annotation.Nullable; + +public interface TestAvatarCreator { + @Nullable + InputStream getAvatarInputStream(); +} diff --git a/briar-headless/src/test/java/org/briarproject/briar/headless/HeadlessTestModule.kt b/briar-headless/src/test/java/org/briarproject/briar/headless/HeadlessTestModule.kt index 24c3e07a0..ff1326aaf 100644 --- a/briar-headless/src/test/java/org/briarproject/briar/headless/HeadlessTestModule.kt +++ b/briar-headless/src/test/java/org/briarproject/briar/headless/HeadlessTestModule.kt @@ -18,6 +18,7 @@ import org.briarproject.bramble.system.DefaultTaskSchedulerModule import org.briarproject.bramble.system.DefaultWakefulIoExecutorModule import org.briarproject.bramble.system.JavaSystemModule import org.briarproject.bramble.test.TestSecureRandomModule +import org.briarproject.briar.api.test.TestAvatarCreator import org.briarproject.briar.headless.blogs.HeadlessBlogModule import org.briarproject.briar.headless.contact.HeadlessContactModule import org.briarproject.briar.headless.event.HeadlessEventModule @@ -76,4 +77,7 @@ internal class HeadlessTestModule(private val appDir: File) { @Provides internal fun provideFeatureFlags() = FeatureFlags { false } + + @Provides + internal fun provideTestAvatarCreator() = TestAvatarCreator { null } }