hannahmitt / homemirror Goto Github PK
View Code? Open in Web Editor NEWAndroid application powering the mirror in my house
License: Apache License 2.0
Android application powering the mirror in my house
License: Apache License 2.0
From what I saw, you have to hard code your calendar, stocks, birthdays and such before compiling and deploying the code. It'd be cool if a future version provided wireless sync with another device. It'd probably need the coding of a second app to allow your mirror to mirror - pun intended - your main device.
Hey Hannah, thanks so much for starting this project. I'm not a frequent programmer, so having this backbone in place for me to tweak for my needs has been greatly appreciated. I wanted to share some things that I've discovered in case you want to incorporate the changes. I'll only go over general concepts of my major changes, but I would be happy to share the actual code if you want details.
I wanted a little more out of the weather forecast, so I pulled in a few more items from the json and updated the layout:
I wanted to see the top 5 headlines, so I just arrayified everything and added a for
loop to populate it. I also added an icon to help the headlines stand out.
I've been fiddling with this the most because it's the feature that's most appealing to me. I use this for chores, reminders, meetings, and a countdown to fun things I have planned in the future. This is what I've changed and a couple of things for you to keep in mind if you're not already aware:
Potential "bugs:" You are using the Events table in the Calendar provider to search for upcoming events. This is fine and dandy, but it will not catch instances of recurring events. I banged my head on this one for a bit since I have several recurring chore-like events. I switched to using the following public method of the CalendarContract.Instances
class when assigning the cursor:
public static final Cursor query (ContentResolver cr, String[] projection, long begin, long end)
This grabs all of the event instances since the instances table contains 1 instance for each single event and 1 instance each for every iteration of a recurring event.
Your where
clause will also not catch events that last through to the following day(s). You might want it function that way, but you may consider changing the clause from:
(dtstart > start) and (dtend < endofday)
to:
(dtstart > start) and (dtstart < endofday)
My updates and how I use this module: I created a new shared calendar specifically for the device running the app and have it as the only visible one. I put chores and reminder type events as well as fun events ("countdown events") that I have coming up. There's nothing special about the chores/reminders, but the countdown events start with a #
(more on that shortly). I query all event instances on the calendar for the next six months (hopefully this doesn't come back to bite me, but the Instances query doesn't let you specify a where
clause, so I guess I'd have to do another query to optimize this).
The first chore/reminder event is shown only if there is one happening today. In the attached screenshot, the text on the bottom is an event reminding me to pick up anything from the floor so my Roomba "Rosie" doesn't get in trouble while I'm at work. The first upcoming countdown event in the next 180 days is always visible (default text if none), and I calculate the days until that event. I can distinguish those events from others due to the #
, and then just take the .substring(1)
of the title to get it to display properly.
I created a new resource folder called layout-land
and copied the activity_mirror.xml
into it. Android will automatically switch the layout based on screen orientation, so now I can choose which orientation to run the device.
Here's what the layout looks like for now (I am constantly tweaking the layout because I'm never satisfied with how it looks. arrrrgggggghhhh.)
Oh, I also changed the app icon to Minecraft's Magic Mirror item... sorry, I couldn't resist! 😛
Hello, I used your app last year, it's awesome. But recently I found the mood detection function couldn't work anymore. Do you know the reason? Thank you!
Any thoughts on solving the issue of installing something like your project in a bathroom?
Pre-requisite problems in my head (1- I don't know materials engineering 2 - I don't know much electrical engineering)
Your online cut-to-size vendor link warns:
Not for use with high humidity or contact with water.
And, elsewhere, I found another short explanation:
Acrylics tend to absorb moisture. High humidity levels may cause temporary warpage to the material. The warpage is characteristic of the material and should be considered in the design of the product or application.
Anyways, not to mention there's the problem of running constant USB power cable through your wall-mount, which, as most bathroom building in the developed world require GFCI protection. Maybe you could update your design or documentation with links to stuff like this GFCI USB/AC adapter available for sale at on Amazon - you probably would want a certified electrician still installing it for you of course...
Hi,
I am unable to built a apk. I get "failed to find built tools revision 23.0.1" everytime :-(
fixed, changed the built tools in the gradle.
I don't really mind that the news headlines originate from a single source. However, it would be nice if they changed a bit more frequently than once per day. Would be great if they changed every 10 seconds, even if they are the same handful of headlines in the RSS feed, over and over.
Maybe you could submit it at Google's Android Experiment https://www.androidexperiments.com/
Hey all,
Thanks for checking this out! I apologize for a project so hard-coded to my life.
I actually left for vacation without a computer before this project got popular. Once I'm done traipsing I'll review all your hard work and git issues.
Much thanks, and best of luck with all your mirror adventures
Hi - firstly thanks for this wonderful project - I downloaded android studio, bought a tablet and started learning how this code works (and java, and android, and github and ... and... :) ) just to get this to work on the old offbrand tablet I bought. It's working now and I couldn't be more thrilled with the result.
Thanks again!!!
I was trying to add a feature that would show a countdown clock to an event - and I am making no progress whatsoever - is there any possibility that you could add it as a feature? We are counting down to our first child and having this displayed on our mirror would be truly awesome.
Thanks so much.
Next calendar event is not appearing.. anyone else having this problem?
Thanks!!
Hi,
I was thinking if you could include display of the, say top 5, unread emails in the Gmail account.
Thanks.
Only a particular phone can achieve the effect ? I removed the following part of the codebecause the problem of the network ,
buildscript {
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'io.fabric.tools:gradle:1.+'
}
}
Run successfully but only on the phone screen appeared the effect?
Oral-B's Genius toothbrush offers an SDK (https://developer.oralb.com/) for exposing the same kind of position detection feature its official app enjoys (but is a pain to use because mounting your phone via a suction cap 3 feet above a ceramic sink of running water is a recipe for disaster). Has anyone tried integrating Oral-B's SDK yet into this project?
Aha?Can it change to the IOS System?If can,May i call it iMirror?Sorry for my poor English
Request from email
Just wandering how to display more contents than a screen size tablet will take
on the mirror?
Probably use multiple tablets to display the more contents ?
my question is this, modify the code to make it in Spanish but not how to put it in apk. to play on smarphone or tablet, if anyone can help me how to spend all the files would appreciate.
very good project.
How do you start the app if the tablet dies? Maybe set it as the home activity so it starts on boot?
Hi, is it possible to show multple, an all day Calendar-Entrys on screen?
I can only see 1 by 1.
and what needs to be changed to display in German?
thx ;)
Hi! I love your app but it's not available on F-droid, could you do share it there too, please?
Thanks a lot for this amazing app!!
Hi guys!
I got everything for this mirror today!!
When i installed the app Home Mirror on google play using android 4.4.2 on my tablet and went through the setup page it worked!!
Right away i realized it was off screen for most of the time & date & weather.
What can i do to fix this or do you have any recommendations??
Thanks for taking the time to help out!
Hi,
after installation, the app crashes on my tablet. Here is the log I can see in Android Studio when I try to open the app. Someone can help me?
Thank you very much.
Rob
11-06 17:41:36.424 7906-7906/com.morristaedt.mirror E/Trace﹕ error opening trace file: No such file or directory (2)
11-06 17:41:36.434 7906-7906/com.morristaedt.mirror W/ActivityThread﹕ Application com.morristaedt.mirror can be debugged on port 8100...
11-06 17:41:36.594 7906-7906/com.morristaedt.mirror D/AndroidRuntime﹕ Shutting down VM
11-06 17:41:36.594 7906-7906/com.morristaedt.mirror W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x40cee2a0)
11-06 17:41:36.594 7906-7906/com.morristaedt.mirror E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.morristaedt.mirror/com.morristaedt.mirror.SetUpActivity}: java.lang.IllegalArgumentException: provider==null
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
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:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: provider==null
at android.location.LocationManager.getLastKnownLocation(LocationManager.java:1165)
at com.morristaedt.mirror.SetUpActivity.setUpLocationMonitoring(SetUpActivity.java:113)
at com.morristaedt.mirror.SetUpActivity.onCreate(SetUpActivity.java:81)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1089)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
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:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
11-06 17:41:36.674 7906-7908/com.morristaedt.mirror D/dalvikvm﹕ GC_CONCURRENT freed 258K, 6% free 6179K/6535K, paused 2ms+1ms, total 70ms
Excellent app Hannah! (my project for this weekend!)
I've noticed a few enhancement requests for emails/notifications etc and wondered if it might be possible to use the front facing camera as a way of recognising hand or facial gestures? Move hand left for emails, scroll through (hand up / down etc), email list etc, smile to open, frown to exit!! You're already halfway there addig the functionality to read different facial expressions/moods.
I bought a cheap Android tablet off Amazon for this project. The screen is not great with bad viewing angles and it seems that even with the brightness all the way down the backlight still shines through, so you can't really get a deep black. Will this kind of device work or would it be a waste of time?
http://www.amazon.ca/Tablet-Certified-Google-Android-Resolution/dp/B015R1R2QQ
I find the moduel "trainScheduelModul.java" but it seems its not initiated anywhere?
Some thing your working on and haven't finished or is it my skills thats lacking =)
/ Ola
Title says it all. One of the sites linked to purchase a two way mirror mentions a glass solution. Will this work as well? I am thinking the glass mirror would generally be more resilient
Would it be possible to have a colourwheel/time based approach to changing the colour of the font? Default White, but I noticed the photo you use in your demo has a blue tint? Whether or not that's a camera anomoly or if the mirror film you use is tinted blue, the ability to change the colour would be very useful. I'd actually love to have the option of changing the colour during a certain time period - for example - brilliant white during daytime hours up to 10pm, and then a deep red during the night until 5am. Possible?
Hi,
Would it be possible for the display to turn on when the forward camera detects motion? That way the display wouldn't be "always on". Naturally, the display would need a timeout option. Can we put in user selectable timeout period?
Thanks
It's really cool! Awesome job! ;)
How about using velcro tape instead of double sided tape. Would make it even easier to take the android device off if you need to run an update or something like that: http://www.amazon.com/Velcro-Stick-Tape-Black-VEL60211/dp/B0017S83PI
I tried to download your project in Intellij. But it can't be compiled. It's showed int Messages console:
Error:(43, 81) Gradle: error: cannot find symbol variable dark_sky_api_key
So could your update your project?
Hi, since I don't get the pr feature and how it works here is my change of values
values-de
(german translation)
HomeMirror<string name="default_mirror_mirror">Mirror, mirror on the wall. Hannah is the prettiest of them all.</string>
<!-- Owners -->
<string name="owners">Hannah and Andy</string>
<!-- Time module -->
<string name="good_morning">Guten Morgen, %s</string>
<string name="good_afternoon">Guten Nachmittag, %s</string>
<string name="good_evening">Guten Abend, %s</string>
<string name="late">Du bist ja noch wach, %s</string>
<string name="bedtime">Guten Abend, %s\n\nIt\'s Hannah\'s bedtime.</string>
<!-- Forecast module -->
<string name="bike_today">Radfahr-Wetter</string>
<string name="no_bike_today">Kein Radfahr-Wetter</string>
<!-- Birthday module -->
<string name="happy_birthday">Herzlichen Glückwunsch, %s!</string>
<!-- Chores module -->
<string name="water_plants">Pflanzen giessen</string>
<string name="grocery_list">Einkaufszettel</string>
<!-- Mood module -->
<string name="it_gets_better">Kopf hoch!</string>
<string name="looking_good">Du siehst toll aus</string>
<string name="something_special">Yay! Hallo Sonnenschein!</string>
<!-- Set up -->
<string name="location">Standort</string>
<string name="set_up">Einstellen</string>
<string name="latitude">Latitude</string>
<string name="longitude">Longitude</string>
<string name="launch">Starte</string>
<string name="mood_detection_option">Launen Erkennung</string>
<string name="show_xkcd">Zeige neuen xkcd</string>
<string name="invert_colors">Invertiere Comic Farben</string>
<string name="show_calendar_event">Zeige nachsten Kalendereintrag</string>
<string name="stock">Boerse</string>
<string name="ticker_symbol">Ticker Symbol, z.B. GOOG</string>
<string name="show_headline">Zeige BBC Schlagzeilen</string>
<string name="found_location">Standord erkannt</string>
<string name="mood_explanation">Benutzt Front-Kamera um Laune zu erkennen</string>
<string name="stock_description">Erscheint an Wochentagen, wenn der Kurs sich um mehr als 3% veraendert</string>
<string name="biking_hint">Zeige Radfahr-Wetter Tipp</string>
<string name="how_to_stop">Um dieses Menue erneut zu oeffnen, von unten wischen und "zurueck" druecken.</string>
Hi i just discover this app and i want to modify 2 things.
It's possible to stand by the screen ?
It's possible to change the chores ? I want to replace with "get out trash" and "do grossery"
Someone can help me to custom the java code ?
on the screen shot it shows a to do list, but when I load it on my hp touchpad (cynogenmod) with google account signed and the tasks does not show up. Only the time, date, temp and weather and xkcd.
Thanks for this awesome app. It really drove my interest in getting more in depth into android.
It would be great to have the app at F-Droid! Here's how to: https://f-droid.org/contribute/
Hi Hannah
Your project is super cool!
Please, claim our donations 😄
https://flattr.com/thing/4654222/HannahMittHomeMirror-on-GitHub
Cheers
I would like to have this on my tablet, when I leave it docked at my desk. Most daydream apps are disappointing and this one looks like a strong candidate for a useful Daydream.
Hi Hanna, nice work.
I get the following error (I am using Google studio):
Error:Execution failed for task ':app:fabricGenerateResourcesRelease'.
Crashlytics Developer Tools error.
Is there a way to disable Crashlytics?
Spanish people want to use this in spanish language
If you happen to be in Toronto, I'll be talking mirror stuff at AndroidTO on Dec 1.
http://androidto.com/
Hi there,
I added the following features on my fork - if any are of interest, I'd be happy to polish them up (ie settings into config rather than hard coded, etc) and send pull requests:
Thanks for all your code so far!
Tim
Idea: Version of app for phone that relays notifications to the mirror, like texts and emails. It'd make the mirror even more useful.
Toggle display visibility when faces are detected using the new Mobile Vision API from Google Play Services.
Assert "positive affirmations" when a sad face is detected.
Hi,
the ability to insert the weather api key in the app would be great, so you dont need to download it and install all that android studio stuff.
Thank you for your excellent work. I was wondering if there was any way to introduce a twitter client in this?
Help me please, How can I fixed this? (using android studio 1.2 with emulator of Nexus 7 API 5.0)
Error at AsyncTask
Log:
09-14 00:29:01.031 3242-3260/com.morristaedt.mirror E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
Process: com.morristaedt.mirror, PID: 3242
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.IllegalStateException: Error handler returned null for wrapped exception.
at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:244)
at java.lang.reflect.Proxy.invoke(Proxy.java:397)
at $Proxy0.getHourlyForecast(Unknown Source)
at com.morristaedt.mirror.modules.ForecastModule$1.doInBackground(ForecastModule.java:50)
at com.morristaedt.mirror.modules.ForecastModule$1.doInBackground(ForecastModule.java:31)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: retrofit.RetrofitError: 403 Forbidden
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:388)
at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
at java.lang.reflect.Proxy.invoke(Proxy.java:397)
at $Proxy0.getHourlyForecast(Unknown Source)
at com.morristaedt.mirror.modules.ForecastModule$1.doInBackground(ForecastModule.java:50)
at com.morristaedt.mirror.modules.ForecastModule$1.doInBackground(ForecastModule.java:31)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
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.