f2prateek / device-frame-generator Goto Github PK
View Code? Open in Web Editor NEWWrap your app screenshots in real device artwork.
License: Apache License 2.0
Wrap your app screenshots in real device artwork.
License: Apache License 2.0
This will make it even faster to load the thumbnails.
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:619)
at com.f2prateek.dfg.util.BitmapUtils.decodeUri(BitmapUtils.java:60)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:139)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java)
at java.util.concurrent.FutureTask.setException(FutureTask.java)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java)
at java.util.concurrent.FutureTask.run(FutureTask.java)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java)
at java.lang.Thread.run(Thread.java)
Caused by: java.lang.IllegalStateException: Fragment DeviceFragment{40e9bbf8} not attached to Activity
at android.support.v4.app.Fragment.getResources(Fragment.java:571)
at com.f2prateek.dfg.ui.DeviceFragment$BitmapWorkerTask.doInBackground(DeviceFragment.java:303)
at com.f2prateek.dfg.ui.DeviceFragment$BitmapWorkerTask.doInBackground(DeviceFragment.java:291)
at android.os.AsyncTask$2.call(AsyncTask.java)
... 6 more
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:619)
at com.f2prateek.dfg.util.BitmapUtils.decodeUri(BitmapUtils.java:60)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:139)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
Improve 368fbe1
At the very least cache the value of the color used to indicate the selection.
For a more advanced improvement, add an ImageView that accepts a foreground
attribute, so we can use the default system drawables.
For reference, see Frame Layout.
When the app catches an OOM, it should log some more additional information with bugsense that can help figure out to figure out the situations this happens in.
java.lang.OutOfMemoryError
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:640)
at android.graphics.Bitmap.createBitmap(Bitmap.java:620)
at com.f2prateek.dfg.core.GenerateFrameService.startingImage(GenerateFrameService.java:72)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:156)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:147)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
In the device fragment, color the dimensions in the info displayed for each device. Green if the displayed device is compatible with the users device current and red if not.
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:619)
at com.f2prateek.dfg.util.BitmapUtils.decodeUri(BitmapUtils.java:60)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:139)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:619)
at com.f2prateek.dfg.util.BitmapUtils.decodeUri(BitmapUtils.java:60)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:139)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
java.lang.NullPointerException
at com.f2prateek.dfg.core.GenerateFrameService.startingImage(GenerateFrameService.java:68)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:156)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:147)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
Based on chris's suggestion, I should probably kill the cache in https://github.com/f2prateek/Device-Frame-Generator/blob/368fbe1a8818a1e4f668bb138eddd0e4448f80a0/app/src/main/java/com/f2prateek/dfg/core/DeviceFrameGenerator.java#L46.
Although this will probably slow down the generation, by not keeping these in memory we could free up some memory for the larger images.
My Nexus 7 is on android 4.3,when Device Frame Generator is trying to save the image to gallery,I get "unknown error" and a grey image in the Device Frame Generator folder in my Gallery.
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:619)
at com.f2prateek.dfg.util.BitmapUtils.decodeUri(BitmapUtils.java:60)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:139)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
Use the event bus (see sample in tape) for callbacks for the task.
figure out how this works so we can enable in-app notifications.
Add a dedicated image viewer activity, one that opens up automatically when done through the app, or as a click through from the notification.
Preferably with a white background.
For a plus, back it with a multi touch capable ImageView such as https://github.com/chrisbanes/PhotoView
Hello f2prateek,
My name is Daniel and I'm one of the F-Droid devs and maintainers. We've packaged your app for quite some time, thank you for making it free software!
I'd like to point out just two small improvements to the build process that you might want to consider:
Thank you for your time!
java.lang.OutOfMemoryError
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:640)
at android.graphics.Bitmap.createBitmap(Bitmap.java:575)
at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:466)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:208)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:147)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
When alive, the activity should display more progress messages including errors.
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:619)
at com.f2prateek.dfg.util.BitmapUtils.decodeUri(BitmapUtils.java:60)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:139)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
Display "Frame Generator" in portrait on handsets, full name otherwise.
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:619)
at com.f2prateek.dfg.util.BitmapUtils.decodeUri(BitmapUtils.java:60)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:139)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
Have a different UI that utilizes the space in landscape better. Use the same design from previous version of the app.
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:619)
at com.f2prateek.dfg.util.BitmapUtils.decodeUri(BitmapUtils.java:60)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:139)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:619)
at com.f2prateek.dfg.util.BitmapUtils.decodeUri(BitmapUtils.java:60)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:139)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
Don't use Travis CI. While it would require more verbose checkking fo merges, it has two advantages :
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:619)
at com.f2prateek.dfg.util.BitmapUtils.decodeUri(BitmapUtils.java:60)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:139)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:619)
at com.f2prateek.dfg.util.BitmapUtils.decodeUri(BitmapUtils.java:60)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:139)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:619)
at com.f2prateek.dfg.util.BitmapUtils.decodeUri(BitmapUtils.java:60)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:139)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
Now that I know how to use tape, I can think of adding support for it.
The critical part is how to handle exceptions. We should probably retry a couple of times with OOMs and then fail.
Currently the app uses the same notification, just over-writes the old one. Would be better if a different service handled multiple notifications, showing a progress dialog.
I've spent the last hours trying to build this for f-droid.org repository without luck. The error is [ERROR] Failed to execute goal on project com-f2prateek-dfg: Could not resolve dependencies for project com.f2prateek.dfg:com-f2prateek-dfg:apk:1.0.1: Failure to find android.support:compatibility-v4:jar:12 in http://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced -> [Help 1] [ERROR]
My recipe is Build Version:1.0.1,101,a262fd39bf,maven=yes,prebuild=\ mvn install:install-file -DgroupId=android.support -DartifactId=compatibility-v4 \ -Dversion=12 -Dpackaging=jar -Dfile=$$SDK$$/extras/android/support/v4/android-support-v4.jar && \ sed -i 's/debuggable=\"true\"/debuggable=\"false\"/g' app/AndroidManifest.xml && \ sed -i 's/app/dagger/g' pom.xml && \ sed -i 's/integration-tests/app/g' pom.xml && \ sed -i 's/<version>1.0-SNAPSHOT/<version>1.0.1/g' app/pom.xml && \ sed -i 's/<version>1.0-SNAPSHOT/<version>1.0.1/g' pom.xml && \ git clone https://github.com/square/dagger
Any ideas?
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:619)
at com.f2prateek.dfg.util.BitmapUtils.decodeUri(BitmapUtils.java:60)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:139)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:619)
at com.f2prateek.dfg.util.BitmapUtils.decodeUri(BitmapUtils.java:60)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:139)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java)
at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java)
at com.f2prateek.dfg.util.BitmapUtils.decodeResource(BitmapUtils.java:80)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:186)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:147)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java)
at android.os.Handler.dispatchMessage(Handler.java)
at android.os.Looper.loop(Looper.java)
at android.os.HandlerThread.run(HandlerThread.java)
When generated from share, the existing notification system should be used, but when generated form within the app, the final image should be shown right away.
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:619)
at com.f2prateek.dfg.util.BitmapUtils.decodeUri(BitmapUtils.java:60)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:139)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:619)
at com.f2prateek.dfg.util.BitmapUtils.decodeUri(BitmapUtils.java:60)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:139)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
Add a some touch feedback for the text.
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=131614, result=-1, data=null} to activity {com.f2prateek.dfg/com.f2prateek.dfg.ui.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.deliverResults(ActivityThread.java:3183)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3226)
at android.app.ActivityThread.access$1200(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1272)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4918)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:106)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.f2prateek.dfg.ui.DeviceFragment.onActivityResult(DeviceFragment.java:241)
at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:161)
at android.app.Activity.dispatchActivityResult(Activity.java:5232)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3179)
... 12 more
This means we don't have to rely on device numbers.
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:619)
at com.f2prateek.dfg.util.BitmapUtils.decodeUri(BitmapUtils.java:60)
at com.f2prateek.dfg.core.DeviceFrameGenerator.generateFrame(DeviceFrameGenerator.java:139)
at com.f2prateek.dfg.core.GenerateFrameService.onHandleIntent(GenerateFrameService.java:61)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.