From 5cd686e2886e0691d139f8e0a675b45b6ff30a7a Mon Sep 17 00:00:00 2001 From: Paul Gavrikov Date: Sat, 20 Dec 2014 04:45:50 +0100 Subject: [PATCH] Initial Upload. Access Steps, Battery and LE Params. Not very stable yet. --- .metadata/.lock | 0 .metadata/.log | 562 +++ .metadata/.mylyn/.taskListIndex/segments.gen | Bin 0 -> 20 bytes .metadata/.mylyn/.taskListIndex/segments_1 | Bin 0 -> 32 bytes .metadata/.mylyn/repositories.xml.zip | Bin 0 -> 437 bytes .metadata/.mylyn/tasks.xml.zip | Bin 0 -> 250 bytes .../AnalogClock.png | Bin 0 -> 4580 bytes .../AutoCompleteTextView.png | Bin 0 -> 2174 bytes .../Button.png | Bin 0 -> 1308 bytes .../CalendarView.png | Bin 0 -> 18027 bytes .../CheckBox.png | Bin 0 -> 3311 bytes .../CheckedTextView.png | Bin 0 -> 2132 bytes .../Date.png | Bin 0 -> 1269 bytes .../DigitalClock.png | Bin 0 -> 814 bytes .../Email.png | Bin 0 -> 2511 bytes .../ExpandableListView.png | Bin 0 -> 302 bytes .../LargeText.png | Bin 0 -> 1277 bytes .../ListView.png | Bin 0 -> 302 bytes .../MediumText.png | Bin 0 -> 1245 bytes .../MultiAutoCompleteTextView.png | Bin 0 -> 2542 bytes .../MultilineText.png | Bin 0 -> 7972 bytes .../Number.png | Bin 0 -> 840 bytes .../NumberDecimal.png | Bin 0 -> 1170 bytes .../NumberSigned.png | Bin 0 -> 867 bytes .../Password.png | Bin 0 -> 354 bytes .../PasswordNumeric.png | Bin 0 -> 1155 bytes .../PersonName.png | Bin 0 -> 1865 bytes .../Phone.png | Bin 0 -> 1661 bytes .../PlainText.png | Bin 0 -> 1104 bytes .../PostalAddress.png | Bin 0 -> 1818 bytes .../ProgressBarHorizontal.png | Bin 0 -> 820 bytes .../ProgressBarLarge.png | Bin 0 -> 2639 bytes .../ProgressBarNormal.png | Bin 0 -> 1284 bytes .../ProgressBarSmall.png | Bin 0 -> 410 bytes .../QuickContactBadge.png | Bin 0 -> 1045 bytes .../RadioButton.png | Bin 0 -> 2936 bytes .../RadioGroup.png | Bin 0 -> 1966 bytes .../RatingBar.png | Bin 0 -> 3974 bytes .../SeekBar.png | Bin 0 -> 1634 bytes .../SmallButton.png | Bin 0 -> 1071 bytes .../SmallText.png | Bin 0 -> 783 bytes .../Switch.png | Bin 0 -> 741 bytes .../TextView.png | Bin 0 -> 1153 bytes .../Time.png | Bin 0 -> 1521 bytes .../ToggleButton.png | Bin 0 -> 760 bytes .../ZoomButton.png | Bin 0 -> 5192 bytes .../ZoomControls.png | Bin 0 -> 5123 bytes .../preview.properties | 2 + .metadata/.plugins/org.eclipse.cdt.core/.log | 2 + .../org.eclipse.cdt.make.core/specs.c | 1 + .../org.eclipse.cdt.make.core/specs.cpp | 1 + .../0/a06de7faec870014196aa5e86be5823c | 37 + .../1/70b49fdad98700141885aa2aa9523af4 | 20 + .../1/d0e8eaf4df8700141885aa2aa9523af4 | 46 + .../10/c07a171bed870014196aa5e86be5823c | 36 + .../13/603c9935db8700141885aa2aa9523af4 | 26 + .../14/20df9f7bdb8700141885aa2aa9523af4 | 25 + .../14/809d9b59f7870014196aa5e86be5823c | 208 ++ .../16/201cc50ff9870014196aa5e86be5823c | 0 .../17/a07453a4e9870014196aa5e86be5823c | 15 + .../18/a0833b17ee870014196aa5e86be5823c | 182 + .../18/d0598389d88700141885aa2aa9523af4 | 70 + .../19/20314991de8700141885aa2aa9523af4 | 17 + .../19/50ab4003f3870014196aa5e86be5823c | 193 + .../1a/a0e36e87d68700141885aa2aa9523af4 | 27 + .../1c/4025d149f8870014196aa5e86be5823c | 235 ++ .../1c/40b86b85e4870014196aa5e86be5823c | 31 + .../1c/d0973b39d88700141885aa2aa9523af4 | 68 + .../1e/0005cc07e18700141885aa2aa9523af4 | 78 + .../1e/40866795ce8700141885aa2aa9523af4 | 3 + .../1f/c0f5aeb9e18700141885aa2aa9523af4 | 82 + .../1f/d0aee612f6870014196aa5e86be5823c | 65 + .../21/b0e8e801e18700141885aa2aa9523af4 | 78 + .../22/10c7d4c0e8870014196aa5e86be5823c | 38 + .../23/3008771ee7870014196aa5e86be5823c | 129 + .../24/60a7b01fec870014196aa5e86be5823c | 65 + .../24/b052e324dc8700141885aa2aa9523af4 | 7 + .../25/b0895a09e08700141885aa2aa9523af4 | 46 + .../26/00c411b9e4870014196aa5e86be5823c | 12 + .../26/d07ddf9bf5870014196aa5e86be5823c | 211 ++ .../27/10e7f38fee870014196aa5e86be5823c | 37 + .../28/6086e11adc8700141885aa2aa9523af4 | 73 + .../28/b0074003f6870014196aa5e86be5823c | 93 + .../28/b07ee274f7870014196aa5e86be5823c | 218 ++ .../28/c0c02d64e8870014196aa5e86be5823c | 145 + .../29/b0ac3b10ee870014196aa5e86be5823c | 181 + .../2d/50070725dc8700141885aa2aa9523af4 | 77 + .../2f/00d29edfdc8700141885aa2aa9523af4 | 77 + .../3/00eab3efea870014196aa5e86be5823c | 23 + .../3/b0314761df8700141885aa2aa9523af4 | 39 + .../3/c016be3cf7870014196aa5e86be5823c | 25 + .../3/f06b8a09e38700141885aa2aa9523af4 | 97 + .../30/c043bdede28700141885aa2aa9523af4 | 97 + .../31/e04a80c6e38700141885aa2aa9523af4 | 0 .../31/f05462bcec870014196aa5e86be5823c | 7 + .../32/40ab3976ec870014196aa5e86be5823c | 55 + .../32/a0709064dc8700141885aa2aa9523af4 | 30 + .../34/0002d7f1f3870014196aa5e86be5823c | 0 .../34/509de358e5870014196aa5e86be5823c | 109 + .../35/60c49bf8f6870014196aa5e86be5823c | 22 + .../35/c0ed5f6df8870014196aa5e86be5823c | 12 + .../35/d0746695ce8700141885aa2aa9523af4 | 2 + .../35/e03e5dcfe6870014196aa5e86be5823c | 131 + .../37/700c4f98e7870014196aa5e86be5823c | 139 + .../38/4028145fe38700141885aa2aa9523af4 | 97 + .../38/602c3f93ec870014196aa5e86be5823c | 55 + .../3e/40798e9de8870014196aa5e86be5823c | 33 + .../3e/e05675d7d68700141885aa2aa9523af4 | 26 + .../3f/70518c37e9870014196aa5e86be5823c | 152 + .../3f/f0677c5af4870014196aa5e86be5823c | 206 ++ .../43/008907e5ee870014196aa5e86be5823c | 190 + .../44/30d2e947f9870014196aa5e86be5823c | 6 + .../44/70b159bde5870014196aa5e86be5823c | 111 + .../46/30832483eb870014196aa5e86be5823c | 158 + .../48/000f1098e4870014196aa5e86be5823c | 31 + .../4b/3076006dd88700141885aa2aa9523af4 | 69 + .../4b/30818ae5d98700141885aa2aa9523af4 | 11 + .../4b/80e7dddbde8700141885aa2aa9523af4 | 23 + .../4e/c0adfb16e9870014196aa5e86be5823c | 149 + .../5/605fa0fbd68700141885aa2aa9523af4 | 30 + .../51/70dbab7cdc8700141885aa2aa9523af4 | 27 + .../51/907d51def4870014196aa5e86be5823c | 24 + .../51/a01ed591f8870014196aa5e86be5823c | 33 + .../52/00e855d0ec870014196aa5e86be5823c | 23 + .../52/20689590f7870014196aa5e86be5823c | 228 ++ .../53/50ba50e2d68700141885aa2aa9523af4 | 28 + .../53/b0d5fc67de8700141885aa2aa9523af4 | 13 + .../55/70e4f6dfd98700141885aa2aa9523af4 | 12 + .../57/005656c7d78700141885aa2aa9523af4 | 68 + .../57/10e23bc9db8700141885aa2aa9523af4 | 26 + .../57/b0c31529da8700141885aa2aa9523af4 | 12 + .../57/c03bfee9e9870014196aa5e86be5823c | 155 + .../58/b02315c3f4870014196aa5e86be5823c | 20 + .../59/0087ef07eb870014196aa5e86be5823c | 156 + .../59/407870a9dd8700141885aa2aa9523af4 | 82 + .../59/60488e56f5870014196aa5e86be5823c | 206 ++ .../59/80f225b8e6870014196aa5e86be5823c | 117 + .../59/d05cba9eed870014196aa5e86be5823c | 158 + .../5d/4051e238f9870014196aa5e86be5823c | 307 ++ .../5d/6096e2b5df8700141885aa2aa9523af4 | 44 + .../5d/b0dfbaa8e4870014196aa5e86be5823c | 35 + .../5e/5082c18adc8700141885aa2aa9523af4 | 20 + .../5f/1015cee3e28700141885aa2aa9523af4 | 96 + .../6/a0c491d5e8870014196aa5e86be5823c | 38 + .../61/c0b48cf8ec870014196aa5e86be5823c | 38 + .../62/4005706df6870014196aa5e86be5823c | 15 + .../62/80b62d30da8700141885aa2aa9523af4 | 76 + .../63/f058ef1cf6870014196aa5e86be5823c | 68 + .../67/105366f2da8700141885aa2aa9523af4 | 8 + .../68/808d3ab6f7870014196aa5e86be5823c | 231 ++ .../6b/a008d1b0e4870014196aa5e86be5823c | 5 + .../6c/00dcede8cf8700141885aa2aa9523af4 | 12 + .../6c/50740a3bec870014196aa5e86be5823c | 34 + .../6e/50cd0ee9d68700141885aa2aa9523af4 | 30 + .../6e/80e6d462f3870014196aa5e86be5823c | 204 ++ .../6e/c0192c29f9870014196aa5e86be5823c | 309 ++ .../6f/30114ff0ed870014196aa5e86be5823c | 166 + .../73/90c89f2dee870014196aa5e86be5823c | 182 + .../73/d0e350e6ec870014196aa5e86be5823c | 25 + .../75/d08c2eaeee870014196aa5e86be5823c | 51 + .../76/10d8ee12e9870014196aa5e86be5823c | 38 + .../76/e0ac720ce5870014196aa5e86be5823c | 102 + .../77/70327500f7870014196aa5e86be5823c | 70 + .../78/308299a3e38700141885aa2aa9523af4 | 98 + .../79/10cae10de18700141885aa2aa9523af4 | 80 + .../79/e07057f2d88700141885aa2aa9523af4 | 71 + .../7a/108362d9e5870014196aa5e86be5823c | 112 + .../7b/0005672cef870014196aa5e86be5823c | 193 + .../7c/8020c9c3eb870014196aa5e86be5823c | 155 + .../7d/005b9164dc8700141885aa2aa9523af4 | 8 + .../7d/007705efe9870014196aa5e86be5823c | 14 + .../7d/70fdcc1ff6870014196aa5e86be5823c | 70 + .../7e/406193bdf4870014196aa5e86be5823c | 13 + .../7e/900bfedde28700141885aa2aa9523af4 | 94 + .../8/50195647db8700141885aa2aa9523af4 | 26 + .../80/20e8cf3ee9870014196aa5e86be5823c | 151 + .../82/30cbfcb7dc8700141885aa2aa9523af4 | 12 + .../83/104252ece28700141885aa2aa9523af4 | 96 + .../83/6089b2dbec870014196aa5e86be5823c | 25 + .../86/4068d810f6870014196aa5e86be5823c | 96 + .../86/d01d9e4ed08700141885aa2aa9523af4 | 12 + .../87/5053714aec870014196aa5e86be5823c | 55 + .../8b/b066a8b4f5870014196aa5e86be5823c | 207 ++ .../8b/e090d076e8870014196aa5e86be5823c | 12 + .../8b/f07427bfd78700141885aa2aa9523af4 | 40 + .../9/50b11535d78700141885aa2aa9523af4 | 28 + .../92/d0e40a4af6870014196aa5e86be5823c | 10 + .../95/10e503dce9870014196aa5e86be5823c | 155 + .../95/50eef3efec870014196aa5e86be5823c | 26 + .../95/e0119313ea870014196aa5e86be5823c | 21 + .../96/30f593a3e9870014196aa5e86be5823c | 12 + .../97/90d345a1f6870014196aa5e86be5823c | 6 + .../9a/406dce4cd88700141885aa2aa9523af4 | 69 + .../9a/902a44cee28700141885aa2aa9523af4 | 82 + .../9a/b086a6bce8870014196aa5e86be5823c | 36 + .../9a/f0e5928ce7870014196aa5e86be5823c | 137 + .../9b/301c16a3f5870014196aa5e86be5823c | 207 ++ .../9b/80ddf6d3e18700141885aa2aa9523af4 | 82 + .../9e/1032dea1ed870014196aa5e86be5823c | 167 + .../9e/9062150ef4870014196aa5e86be5823c | 5 + .../a/b0ebe737f9870014196aa5e86be5823c | 309 ++ .../a1/9038e59cf6870014196aa5e86be5823c | 5 + .../a2/004604ade08700141885aa2aa9523af4 | 50 + .../a3/c07968d6e18700141885aa2aa9523af4 | 82 + .../a4/10c3906eec870014196aa5e86be5823c | 55 + .../a4/9011961af4870014196aa5e86be5823c | 38 + .../a5/504a2a1ced870014196aa5e86be5823c | 36 + .../a6/c0c6a60eec870014196aa5e86be5823c | 50 + .../a6/f0cb20ddd78700141885aa2aa9523af4 | 69 + .../a7/00cafe74db8700141885aa2aa9523af4 | 25 + .../ab/e06cb73de18700141885aa2aa9523af4 | 80 + .../ac/c0c1f7d7e08700141885aa2aa9523af4 | 71 + .../ad/500115f0e08700141885aa2aa9523af4 | 74 + .../ae/10e22875ed870014196aa5e86be5823c | 35 + .../ae/e0ff8bd9ec870014196aa5e86be5823c | 25 + .../ae/f046801df9870014196aa5e86be5823c | 5 + .../af/90751529da8700141885aa2aa9523af4 | 11 + .../b/40108f54e5870014196aa5e86be5823c | 113 + .../b2/504bc6c0ec870014196aa5e86be5823c | 23 + .../b3/409e3627ec870014196aa5e86be5823c | 30 + .../b3/c08db071f9870014196aa5e86be5823c | 33 + .../b6/60d5d97aee870014196aa5e86be5823c | 35 + .../b7/30f19140ee870014196aa5e86be5823c | 188 + .../b7/40aac0d4ee870014196aa5e86be5823c | 188 + .../b8/a06f609cdf8700141885aa2aa9523af4 | 43 + .../b8/d0769f1bea870014196aa5e86be5823c | 23 + .../b9/207b4d2df4870014196aa5e86be5823c | 204 ++ .../b9/d09dfc5adb8700141885aa2aa9523af4 | 27 + .../ba/a0036100f6870014196aa5e86be5823c | 23 + .../bb/80158594ce8700141885aa2aa9523af4 | 5 + .../bc/e0f1b249d78700141885aa2aa9523af4 | 35 + .../bc/f0b45cafe08700141885aa2aa9523af4 | 71 + .../be/60a5eb7ef4870014196aa5e86be5823c | 5 + .../c0/20425253f3870014196aa5e86be5823c | 199 + .../c1/f0a757efe4870014196aa5e86be5823c | 101 + .../c3/808fd516e6870014196aa5e86be5823c | 115 + .../c3/b0274622de8700141885aa2aa9523af4 | 9 + .../c4/00bdaf1fec870014196aa5e86be5823c | 65 + .../c4/2068bc04ee870014196aa5e86be5823c | 180 + .../c4/60253401e6870014196aa5e86be5823c | 115 + .../c4/902c54b9d68700141885aa2aa9523af4 | 15 + .../c6/f03faa2dda8700141885aa2aa9523af4 | 20 + .../c8/60276e25f9870014196aa5e86be5823c | 309 ++ .../c8/8095736af3870014196aa5e86be5823c | 204 ++ .../c8/f0f4152be48700141885aa2aa9523af4 | 16 + .../cb/f0b0df75d78700141885aa2aa9523af4 | 37 + .../cc/802e23b9f7870014196aa5e86be5823c | 236 ++ .../cc/f0690e2bdb8700141885aa2aa9523af4 | Bin 0 -> 1674 bytes .../cd/50365a13e48700141885aa2aa9523af4 | 5 + .../cf/0004e2d4e5870014196aa5e86be5823c | 110 + .../d/d0f23014da8700141885aa2aa9523af4 | 20 + .../d2/5069d1e7ec870014196aa5e86be5823c | 26 + .../d3/a0adcc4cda8700141885aa2aa9523af4 | 75 + .../d5/30ee32ddf4870014196aa5e86be5823c | 20 + .../d6/d0e9018ee8870014196aa5e86be5823c | 33 + .../d7/60888a66db8700141885aa2aa9523af4 | 25 + .../d8/b0bd8fd0e18700141885aa2aa9523af4 | 82 + .../da/00b6a28dec870014196aa5e86be5823c | 55 + .../da/b08df6d4f6870014196aa5e86be5823c | 18 + .../da/d060735df4870014196aa5e86be5823c | 207 ++ .../db/50ac094af6870014196aa5e86be5823c | 34 + .../dc/20348c81e4870014196aa5e86be5823c | 17 + .../dc/50c55822de8700141885aa2aa9523af4 | 26 + .../df/b0d5dfb7ce8700141885aa2aa9523af4 | 12 + .../e/40450240f7870014196aa5e86be5823c | 34 + .../e/b09a10c4f4870014196aa5e86be5823c | 20 + .../e0/0067276ef9870014196aa5e86be5823c | 236 ++ .../e1/c0b7caabe4870014196aa5e86be5823c | 0 .../e2/308b1a57e7870014196aa5e86be5823c | 132 + .../e2/e063ca1edd8700141885aa2aa9523af4 | 81 + .../e3/60ffa197ee870014196aa5e86be5823c | 51 + .../e4/b0a2a807da8700141885aa2aa9523af4 | 71 + .../e5/00bd3ee8df8700141885aa2aa9523af4 | 45 + .../e6/006d9cd3d78700141885aa2aa9523af4 | 68 + .../e7/c03d63d5ec870014196aa5e86be5823c | 24 + .../e8/10048494ce8700141885aa2aa9523af4 | 17 + .../e8/b024d197f9870014196aa5e86be5823c | 307 ++ .../e8/b0b65633ec870014196aa5e86be5823c | 33 + .../e9/20f5e61ef4870014196aa5e86be5823c | 204 ++ .../eb/50ab32fae6870014196aa5e86be5823c | 131 + .../ed/003a3572ec870014196aa5e86be5823c | 55 + .../ed/708cb2d1d98700141885aa2aa9523af4 | 7 + .../ed/a0d8bd0be18700141885aa2aa9523af4 | 80 + .../ee/6030aac3f7870014196aa5e86be5823c | 236 ++ .../ee/c0c44450d78700141885aa2aa9523af4 | 38 + .../ef/20b441b3dc8700141885aa2aa9523af4 | 15 + .../ef/d0e3bf06ef870014196aa5e86be5823c | 191 + .../f/30ea5384e5870014196aa5e86be5823c | 110 + .../f0/507caf71f9870014196aa5e86be5823c | 241 ++ .../f1/b002584ff6870014196aa5e86be5823c | 15 + .../f2/209c627be8870014196aa5e86be5823c | 33 + .../f7/60e50729f8870014196aa5e86be5823c | 235 ++ .../f7/e045743cde8700141885aa2aa9523af4 | 81 + .../f9/30c53e80e7870014196aa5e86be5823c | 135 + .../fa/20ca1b6bf8870014196aa5e86be5823c | 34 + .../fa/602842a9f5870014196aa5e86be5823c | 207 ++ .../fa/60457be2d98700141885aa2aa9523af4 | 12 + .../fb/f0272abadb8700141885aa2aa9523af4 | 74 + .../fc/905f8b26eb870014196aa5e86be5823c | 156 + .../fd/804e2405ea870014196aa5e86be5823c | 19 + .../fd/e0907d58d78700141885aa2aa9523af4 | 37 + .../ff/20983376e9870014196aa5e86be5823c | 154 + .../ff/20ae37ede4870014196aa5e86be5823c | 99 + .../ff/303eea10d88700141885aa2aa9523af4 | 69 + .../ff/508a085ff5870014196aa5e86be5823c | 39 + .../.location | Bin 0 -> 172 bytes .../.markers.snap | Bin 0 -> 384 bytes .../.syncinfo.snap | Bin 0 -> 384 bytes .../MiBand/.indexes/a0/4/history.index | Bin 0 -> 76 bytes .../MiBand/.indexes/a0/5f/history.index | Bin 0 -> 108 bytes .../MiBand/.indexes/a0/5f/properties.index | Bin 0 -> 222 bytes .../MiBand/.indexes/a0/d6/history.index | Bin 0 -> 861 bytes .../MiBand/.indexes/a0/d6/properties.index | Bin 0 -> 594 bytes .../MiBand/.indexes/a0/de/history.index | Bin 0 -> 274 bytes .../MiBand/.indexes/a0/de/properties.index | Bin 0 -> 314 bytes .../MiBand/.indexes/a0/eb/history.index | Bin 0 -> 83 bytes .../MiBand/.indexes/a0/ee/history.index | Bin 0 -> 155 bytes .../MiBand/.indexes/af/history.index | Bin 0 -> 94 bytes .../MiBand/.indexes/e4/81/60/12/history.index | Bin 0 -> 95 bytes .../.indexes/e4/81/60/2f/29/history.index | Bin 0 -> 1499 bytes .../.indexes/e4/81/60/2f/a5/history.index | Bin 0 -> 209 bytes .../MiBand/.indexes/e4/81/60/2f/history.index | Bin 0 -> 3405 bytes .../.projects/MiBand/.indexes/history.index | Bin 0 -> 125 bytes .../MiBand/.indexes/properties.index | Bin 0 -> 746 bytes .../.projects/MiBand/.markers | Bin 0 -> 3120 bytes .../.projects/MiBand/.markers.snap | Bin 0 -> 53966 bytes .../.projects/MiBand/.syncinfo.snap | Bin 0 -> 384 bytes .../.root/.indexes/history.version | 1 + .../.root/.indexes/properties.index | Bin 0 -> 355 bytes .../.root/.indexes/properties.version | 1 + .../.root/.markers.snap | Bin 0 -> 411 bytes .../org.eclipse.core.resources/.root/2.tree | Bin 0 -> 639939 bytes .../.safetable/org.eclipse.core.resources | Bin 0 -> 12811 bytes .../org.eclipse.core.resources/2.snap | Bin 0 -> 25869 bytes .../com.android.ide.eclipse.adt.prefs | 4 + .../com.android.ide.eclipse.ddms.prefs | 10 + .../org.eclipse.cdt.debug.core.prefs | 2 + .../.settings/org.eclipse.cdt.ui.prefs | 4 + .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.debug.core.prefs | 4 + .../.settings/org.eclipse.debug.ui.prefs | 7 + .../.settings/org.eclipse.jdt.core.prefs | 12 + .../.settings/org.eclipse.jdt.launching.prefs | 2 + .../.settings/org.eclipse.jdt.ui.prefs | 20 + .../.settings/org.eclipse.m2e.discovery.prefs | 2 + .../org.eclipse.mylyn.context.core.prefs | 2 + .../.settings/org.eclipse.mylyn.java.ui.prefs | 3 + .../org.eclipse.mylyn.monitor.ui.prefs | 2 + .../org.eclipse.mylyn.tasks.ui.prefs | 4 + ....eclipse.recommenders.completion.rcp.prefs | 2 + .../.settings/org.eclipse.team.cvs.ui.prefs | 2 + .../.settings/org.eclipse.team.ui.prefs | 2 + .../.settings/org.eclipse.ui.editors.prefs | 2 + .../.settings/org.eclipse.ui.ide.prefs | 7 + .../.settings/org.eclipse.ui.prefs | 2 + .../.settings/org.eclipse.ui.workbench.prefs | 3 + .../.settings/org.eclipse.wst.sse.ui.prefs | 4 + .../.launches/MiBand.launch | 21 + .../launchConfigurationHistory.xml | 23 + .../org.eclipse.e4.workbench/workbench.xmi | 3202 +++++++++++++++++ .../.project | 18 + .../org.eclipse.jdt.core/1255426124.index | Bin 0 -> 12478 bytes .../org.eclipse.jdt.core/77043017.index | Bin 0 -> 1867176 bytes .../org.eclipse.jdt.core/811295056.index | Bin 0 -> 486758 bytes .../assumedExternalFilesCache | Bin 0 -> 4 bytes .../org.eclipse.jdt.core/externalFilesCache | Bin 0 -> 159 bytes .../externalLibsTimeStamps | Bin 0 -> 175 bytes .../org.eclipse.jdt.core/invalidArchivesCache | Bin 0 -> 4 bytes .../org.eclipse.jdt.core/javaLikeNames.txt | 1 + .../org.eclipse.jdt.core/nonChainingJarsCache | Bin 0 -> 159 bytes .../org.eclipse.jdt.core/savedIndexNames.txt | 4 + .../variablesAndContainers.dat | Bin 0 -> 715 bytes .../dialog_settings.xml | 9 + .../org.eclipse.jdt.launching/.install.xml | 8 + .../libraryInfos.xml | 117 + .../org.eclipse.jdt.ui/OpenTypeHistory.xml | 2 + .../QualifiedTypeNameHistory.xml | 21 + .../org.eclipse.jdt.ui/dialog_settings.xml | 26 + .../org.eclipse.jdt.ui/jdt-images/0.png | Bin 0 -> 220 bytes .../org.eclipse.jdt.ui/jdt-images/1.png | Bin 0 -> 283 bytes .../org.eclipse.jdt.ui/jdt-images/10.png | Bin 0 -> 137 bytes .../org.eclipse.jdt.ui/jdt-images/11.png | Bin 0 -> 281 bytes .../org.eclipse.jdt.ui/jdt-images/2.png | Bin 0 -> 490 bytes .../org.eclipse.jdt.ui/jdt-images/3.png | Bin 0 -> 174 bytes .../org.eclipse.jdt.ui/jdt-images/4.png | Bin 0 -> 194 bytes .../org.eclipse.jdt.ui/jdt-images/5.png | Bin 0 -> 210 bytes .../org.eclipse.jdt.ui/jdt-images/6.png | Bin 0 -> 105 bytes .../org.eclipse.jdt.ui/jdt-images/7.png | Bin 0 -> 147 bytes .../org.eclipse.jdt.ui/jdt-images/8.png | Bin 0 -> 509 bytes .../org.eclipse.jdt.ui/jdt-images/9.png | Bin 0 -> 238 bytes .../2014/12/51/refactorings.history | 4 + .../.workspace/2014/12/51/refactorings.index | 1 + .../MiBand/2014/12/51/refactorings.history | 3 + .../MiBand/2014/12/51/refactorings.index | 4 + .../dialog_settings.xml | 7 + .../0.log | 0 .../logback.1.5.0.20140606-0033.xml | 43 + .../org.eclipse.team.cvs.core/.running | 0 .../org.eclipse.ui.intro/dialog_settings.xml | 4 + .../dialog_settings.xml | 21 + .../org.eclipse.ui.workbench/workingsets.xml | 4 + .../org.eclipse.wst.internet.cache/cache.xml | 1 + .../task-tags.properties | 3 + .../dialog_settings.xml | 5 + .../default_catalog.xml | 5 + .../system_catalog.xml | 37 + .metadata/version.ini | 3 + .../identified-project-coordinates.json | 1 + .recommenders/caches/manual-mappings.json | 1 + .../_1.fdt | Bin 0 -> 2295049 bytes .../_1.fdx | Bin 0 -> 41188 bytes .../_1.fnm | 4 + .../_1.frq | 652 ++++ .../_1.nrm | 1 + .../_1.prx | Bin 0 -> 60969 bytes .../_1.tii | Bin 0 -> 12694 bytes .../_1.tis | Bin 0 -> 819310 bytes .../segments.gen | Bin 0 -> 20 bytes .../segments_2 | Bin 0 -> 247 bytes .../write.lock | 0 .../index/0.0.0-SNAPSHOT/_remote.repositories | 3 + .../index-0.0.0-20140605.014212-1.zip | Bin 0 -> 738902 bytes .../0.0.0-SNAPSHOT/maven-metadata-models.xml | 20 + .../0.0.0-SNAPSHOT/resolver-status.properties | 3 + MiBand/.classpath | 9 + MiBand/.project | 33 + MiBand/.settings/org.eclipse.jdt.core.prefs | 4 + MiBand/AndroidManifest.xml | 38 + MiBand/bin/AndroidManifest.xml | 38 + MiBand/bin/MiBand.apk | Bin 0 -> 374580 bytes MiBand/bin/classes.dex | Bin 0 -> 1057632 bytes .../motioncoding/debugging/L$LogType.class | Bin 0 -> 1260 bytes .../com/motioncoding/debugging/L.class | Bin 0 -> 2958 bytes .../com/motioncoding/miband/BuildConfig.class | Bin 0 -> 355 bytes .../motioncoding/miband/MiActivity$1.class | Bin 0 -> 1195 bytes .../com/motioncoding/miband/MiActivity.class | Bin 0 -> 3600 bytes .../miband/MiLeParamsActivity.class | Bin 0 -> 1934 bytes .../miband/MiOverviewActivity$1.class | Bin 0 -> 3414 bytes .../miband/MiOverviewActivity$2.class | Bin 0 -> 1897 bytes .../miband/MiOverviewActivity.class | Bin 0 -> 7864 bytes .../com/motioncoding/miband/R$attr.class | Bin 0 -> 355 bytes .../com/motioncoding/miband/R$drawable.class | Bin 0 -> 465 bytes .../com/motioncoding/miband/R$id.class | Bin 0 -> 659 bytes .../com/motioncoding/miband/R$layout.class | Bin 0 -> 460 bytes .../com/motioncoding/miband/R$menu.class | Bin 0 -> 412 bytes .../com/motioncoding/miband/R$string.class | Bin 0 -> 624 bytes .../com/motioncoding/miband/R$style.class | Bin 0 -> 446 bytes .../classes/com/motioncoding/miband/R.class | Bin 0 -> 670 bytes .../miband/model/Battery$Status.class | Bin 0 -> 1515 bytes .../motioncoding/miband/model/Battery.class | Bin 0 -> 1463 bytes .../miband/model/LeParams$1.class | Bin 0 -> 1167 bytes .../motioncoding/miband/model/LeParams.class | Bin 0 -> 1872 bytes .../motioncoding/miband/model/MiBand.class | Bin 0 -> 1555 bytes .../miband/view/ColorPickerDialog$1.class | Bin 0 -> 1238 bytes .../ColorPickerDialog$ColorPickerView.class | Bin 0 -> 6238 bytes ...rPickerDialog$OnColorChangedListener.class | Bin 0 -> 323 bytes .../miband/view/ColorPickerDialog.class | Bin 0 -> 2080 bytes ...rt-v4-30a8292059eb8e12a9fe0cd4181a4ef1.jar | Bin 0 -> 342975 bytes MiBand/bin/jarlist.cache | 3 + .../res/crunch/drawable-hdpi/ic_launcher.png | Bin 0 -> 1434 bytes .../res/crunch/drawable-mdpi/ic_launcher.png | Bin 0 -> 888 bytes .../res/crunch/drawable-xhdpi/ic_launcher.png | Bin 0 -> 2018 bytes .../crunch/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 4785 bytes .../drawable-xxhdpi/searching_mili_icon.png | Bin 0 -> 1728 bytes MiBand/bin/resources.ap_ | Bin 0 -> 17168 bytes .../com/motioncoding/miband/BuildConfig.java | 6 + MiBand/gen/com/motioncoding/miband/R.java | 59 + MiBand/ic_launcher-web.png | Bin 0 -> 20776 bytes MiBand/libs/android-support-v4.jar | Bin 0 -> 995624 bytes MiBand/proguard-project.txt | 20 + MiBand/project.properties | 14 + MiBand/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 1433 bytes MiBand/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 868 bytes MiBand/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 2086 bytes MiBand/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 3877 bytes .../drawable-xxhdpi/searching_mili_icon.png | Bin 0 -> 1728 bytes MiBand/res/layout/activity_mi.xml | 26 + MiBand/res/layout/activity_mi_overview.xml | 55 + MiBand/res/menu/menu_overview.xml | 7 + MiBand/res/values/strings.xml | 11 + MiBand/res/values/styles.xml | 21 + MiBand/src/com/motioncoding/debugging/L.java | 65 + .../com/motioncoding/miband/MiActivity.java | 81 + .../miband/MiLeParamsActivity.java | 33 + .../miband/MiOverviewActivity.java | 241 ++ .../motioncoding/miband/model/Battery.java | 53 + .../motioncoding/miband/model/LeParams.java | 71 + .../com/motioncoding/miband/model/MiBand.java | 43 + .../miband/view/ColorPickerDialog.java | 304 ++ 489 files changed, 25830 insertions(+) create mode 100644 .metadata/.lock create mode 100644 .metadata/.log create mode 100644 .metadata/.mylyn/.taskListIndex/segments.gen create mode 100644 .metadata/.mylyn/.taskListIndex/segments_1 create mode 100644 .metadata/.mylyn/repositories.xml.zip create mode 100644 .metadata/.mylyn/tasks.xml.zip create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/AnalogClock.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/AutoCompleteTextView.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/Button.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/CalendarView.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/CheckBox.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/CheckedTextView.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/Date.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/DigitalClock.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/Email.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ExpandableListView.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/LargeText.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ListView.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/MediumText.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/MultiAutoCompleteTextView.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/MultilineText.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/Number.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/NumberDecimal.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/NumberSigned.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/Password.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/PasswordNumeric.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/PersonName.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/Phone.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/PlainText.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/PostalAddress.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ProgressBarHorizontal.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ProgressBarLarge.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ProgressBarNormal.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ProgressBarSmall.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/QuickContactBadge.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/RadioButton.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/RadioGroup.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/RatingBar.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/SeekBar.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/SmallButton.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/SmallText.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/Switch.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/TextView.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/Time.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ToggleButton.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ZoomButton.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ZoomControls.png create mode 100644 .metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/preview.properties create mode 100644 .metadata/.plugins/org.eclipse.cdt.core/.log create mode 100644 .metadata/.plugins/org.eclipse.cdt.make.core/specs.c create mode 100644 .metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/0/a06de7faec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1/70b49fdad98700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1/d0e8eaf4df8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/10/c07a171bed870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/13/603c9935db8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/14/20df9f7bdb8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/14/809d9b59f7870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/16/201cc50ff9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/17/a07453a4e9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/18/a0833b17ee870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/18/d0598389d88700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/19/20314991de8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/19/50ab4003f3870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1a/a0e36e87d68700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1c/4025d149f8870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1c/40b86b85e4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1c/d0973b39d88700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1e/0005cc07e18700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1e/40866795ce8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1f/c0f5aeb9e18700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1f/d0aee612f6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/21/b0e8e801e18700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/22/10c7d4c0e8870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/23/3008771ee7870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/24/60a7b01fec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/24/b052e324dc8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/25/b0895a09e08700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/26/00c411b9e4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/26/d07ddf9bf5870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/27/10e7f38fee870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/28/6086e11adc8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/28/b0074003f6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/28/b07ee274f7870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/28/c0c02d64e8870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/29/b0ac3b10ee870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2d/50070725dc8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2f/00d29edfdc8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3/00eab3efea870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3/b0314761df8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3/c016be3cf7870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3/f06b8a09e38700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/30/c043bdede28700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/31/e04a80c6e38700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/31/f05462bcec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/32/40ab3976ec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/32/a0709064dc8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/34/0002d7f1f3870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/34/509de358e5870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/35/60c49bf8f6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/35/c0ed5f6df8870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/35/d0746695ce8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/35/e03e5dcfe6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/37/700c4f98e7870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/38/4028145fe38700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/38/602c3f93ec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3e/40798e9de8870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3e/e05675d7d68700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3f/70518c37e9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3f/f0677c5af4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/43/008907e5ee870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/44/30d2e947f9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/44/70b159bde5870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/46/30832483eb870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/48/000f1098e4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4b/3076006dd88700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4b/30818ae5d98700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4b/80e7dddbde8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4e/c0adfb16e9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5/605fa0fbd68700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/51/70dbab7cdc8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/51/907d51def4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/51/a01ed591f8870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/52/00e855d0ec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/52/20689590f7870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/53/50ba50e2d68700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/53/b0d5fc67de8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/55/70e4f6dfd98700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/57/005656c7d78700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/57/10e23bc9db8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/57/b0c31529da8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/57/c03bfee9e9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/58/b02315c3f4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/59/0087ef07eb870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/59/407870a9dd8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/59/60488e56f5870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/59/80f225b8e6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/59/d05cba9eed870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5d/4051e238f9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5d/6096e2b5df8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5d/b0dfbaa8e4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5e/5082c18adc8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5f/1015cee3e28700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6/a0c491d5e8870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/61/c0b48cf8ec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/62/4005706df6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/62/80b62d30da8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/63/f058ef1cf6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/67/105366f2da8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/68/808d3ab6f7870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6b/a008d1b0e4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6c/00dcede8cf8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6c/50740a3bec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6e/50cd0ee9d68700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6e/80e6d462f3870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6e/c0192c29f9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6f/30114ff0ed870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/73/90c89f2dee870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/73/d0e350e6ec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/75/d08c2eaeee870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/76/10d8ee12e9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/76/e0ac720ce5870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/77/70327500f7870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/78/308299a3e38700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/79/10cae10de18700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/79/e07057f2d88700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7a/108362d9e5870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7b/0005672cef870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7c/8020c9c3eb870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7d/005b9164dc8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7d/007705efe9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7d/70fdcc1ff6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7e/406193bdf4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7e/900bfedde28700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8/50195647db8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/80/20e8cf3ee9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/82/30cbfcb7dc8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/83/104252ece28700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/83/6089b2dbec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/86/4068d810f6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/86/d01d9e4ed08700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/87/5053714aec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8b/b066a8b4f5870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8b/e090d076e8870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8b/f07427bfd78700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9/50b11535d78700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/92/d0e40a4af6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/95/10e503dce9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/95/50eef3efec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/95/e0119313ea870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/96/30f593a3e9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/97/90d345a1f6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9a/406dce4cd88700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9a/902a44cee28700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9a/b086a6bce8870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9a/f0e5928ce7870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9b/301c16a3f5870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9b/80ddf6d3e18700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9e/1032dea1ed870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9e/9062150ef4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a/b0ebe737f9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a1/9038e59cf6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a2/004604ade08700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a3/c07968d6e18700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a4/10c3906eec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a4/9011961af4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a5/504a2a1ced870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a6/c0c6a60eec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a6/f0cb20ddd78700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a7/00cafe74db8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ab/e06cb73de18700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ac/c0c1f7d7e08700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ad/500115f0e08700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ae/10e22875ed870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ae/e0ff8bd9ec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ae/f046801df9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/af/90751529da8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b/40108f54e5870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b2/504bc6c0ec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b3/409e3627ec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b3/c08db071f9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b6/60d5d97aee870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b7/30f19140ee870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b7/40aac0d4ee870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b8/a06f609cdf8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b8/d0769f1bea870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b9/207b4d2df4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b9/d09dfc5adb8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ba/a0036100f6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/bb/80158594ce8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/bc/e0f1b249d78700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/bc/f0b45cafe08700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/be/60a5eb7ef4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c0/20425253f3870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c1/f0a757efe4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c3/808fd516e6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c3/b0274622de8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c4/00bdaf1fec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c4/2068bc04ee870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c4/60253401e6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c4/902c54b9d68700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c6/f03faa2dda8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c8/60276e25f9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c8/8095736af3870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c8/f0f4152be48700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/cb/f0b0df75d78700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/cc/802e23b9f7870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/cc/f0690e2bdb8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/cd/50365a13e48700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/cf/0004e2d4e5870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d/d0f23014da8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d2/5069d1e7ec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d3/a0adcc4cda8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d5/30ee32ddf4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d6/d0e9018ee8870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d7/60888a66db8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d8/b0bd8fd0e18700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/da/00b6a28dec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/da/b08df6d4f6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/da/d060735df4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/db/50ac094af6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/dc/20348c81e4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/dc/50c55822de8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/df/b0d5dfb7ce8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e/40450240f7870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e/b09a10c4f4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e0/0067276ef9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e1/c0b7caabe4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e2/308b1a57e7870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e2/e063ca1edd8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e3/60ffa197ee870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e4/b0a2a807da8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e5/00bd3ee8df8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e6/006d9cd3d78700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e7/c03d63d5ec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e8/10048494ce8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e8/b024d197f9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e8/b0b65633ec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e9/20f5e61ef4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/eb/50ab32fae6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ed/003a3572ec870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ed/708cb2d1d98700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ed/a0d8bd0be18700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ee/6030aac3f7870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ee/c0c44450d78700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ef/20b441b3dc8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ef/d0e3bf06ef870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f/30ea5384e5870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f0/507caf71f9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f1/b002584ff6870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f2/209c627be8870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f7/60e50729f8870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f7/e045743cde8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f9/30c53e80e7870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/fa/20ca1b6bf8870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/fa/602842a9f5870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/fa/60457be2d98700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/fb/f0272abadb8700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/fc/905f8b26eb870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/fd/804e2405ea870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/fd/e0907d58d78700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ff/20983376e9870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ff/20ae37ede4870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ff/303eea10d88700141885aa2aa9523af4 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ff/508a085ff5870014196aa5e86be5823c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/.org.eclipse.jdt.core.external.folders/.location create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/.org.eclipse.jdt.core.external.folders/.markers.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/.org.eclipse.jdt.core.external.folders/.syncinfo.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/a0/4/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/a0/5f/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/a0/5f/properties.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/a0/d6/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/a0/d6/properties.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/a0/de/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/a0/de/properties.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/a0/eb/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/a0/ee/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/af/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/e4/81/60/12/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/e4/81/60/2f/29/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/e4/81/60/2f/a5/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/e4/81/60/2f/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/properties.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.markers create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.markers.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.syncinfo.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.root/2.tree create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources create mode 100644 .metadata/.plugins/org.eclipse.core.resources/2.snap create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/com.android.ide.eclipse.adt.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/com.android.ide.eclipse.ddms.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.m2e.discovery.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.java.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.monitor.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.tasks.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.recommenders.completion.rcp.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.cvs.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.sse.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.debug.core/.launches/MiBand.launch create mode 100644 .metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml create mode 100644 .metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/.org.eclipse.jdt.core.external.folders/.project create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/1255426124.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/77043017.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/811295056.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/assumedExternalFilesCache create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/externalFilesCache create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/externalLibsTimeStamps create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/invalidArchivesCache create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/javaLikeNames.txt create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/nonChainingJarsCache create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt create mode 100644 .metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat create mode 100644 .metadata/.plugins/org.eclipse.jdt.debug.ui/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.jdt.launching/.install.xml create mode 100644 .metadata/.plugins/org.eclipse.jdt.launching/libraryInfos.xml create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/QualifiedTypeNameHistory.xml create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/0.png create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/1.png create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/10.png create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/11.png create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/2.png create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/3.png create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/4.png create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/5.png create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/6.png create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/7.png create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/8.png create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/9.png create mode 100644 .metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2014/12/51/refactorings.history create mode 100644 .metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2014/12/51/refactorings.index create mode 100644 .metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/MiBand/2014/12/51/refactorings.history create mode 100644 .metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/MiBand/2014/12/51/refactorings.index create mode 100644 .metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.m2e.logback.configuration/0.log create mode 100644 .metadata/.plugins/org.eclipse.m2e.logback.configuration/logback.1.5.0.20140606-0033.xml create mode 100644 .metadata/.plugins/org.eclipse.team.cvs.core/.running create mode 100644 .metadata/.plugins/org.eclipse.ui.intro/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml create mode 100644 .metadata/.plugins/org.eclipse.wst.internet.cache/cache.xml create mode 100644 .metadata/.plugins/org.eclipse.wst.sse.core/task-tags.properties create mode 100644 .metadata/.plugins/org.eclipse.wst.sse.ui/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.wst.xml.core/default_catalog.xml create mode 100644 .metadata/.plugins/org.eclipse.wst.xml.core/system_catalog.xml create mode 100644 .metadata/version.ini create mode 100644 .recommenders/caches/identified-project-coordinates.json create mode 100644 .recommenders/caches/manual-mappings.json create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_luna_/_1.fdt create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_luna_/_1.fdx create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_luna_/_1.fnm create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_luna_/_1.frq create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_luna_/_1.nrm create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_luna_/_1.prx create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_luna_/_1.tii create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_luna_/_1.tis create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_luna_/segments.gen create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_luna_/segments_2 create mode 100644 .recommenders/index/http___download_eclipse_org_recommenders_models_luna_/write.lock create mode 100644 .recommenders/repository/http___download_eclipse_org_recommenders_models_luna_/org/eclipse/recommenders/index/0.0.0-SNAPSHOT/_remote.repositories create mode 100644 .recommenders/repository/http___download_eclipse_org_recommenders_models_luna_/org/eclipse/recommenders/index/0.0.0-SNAPSHOT/index-0.0.0-20140605.014212-1.zip create mode 100644 .recommenders/repository/http___download_eclipse_org_recommenders_models_luna_/org/eclipse/recommenders/index/0.0.0-SNAPSHOT/maven-metadata-models.xml create mode 100644 .recommenders/repository/http___download_eclipse_org_recommenders_models_luna_/org/eclipse/recommenders/index/0.0.0-SNAPSHOT/resolver-status.properties create mode 100644 MiBand/.classpath create mode 100644 MiBand/.project create mode 100644 MiBand/.settings/org.eclipse.jdt.core.prefs create mode 100644 MiBand/AndroidManifest.xml create mode 100644 MiBand/bin/AndroidManifest.xml create mode 100644 MiBand/bin/MiBand.apk create mode 100644 MiBand/bin/classes.dex create mode 100644 MiBand/bin/classes/com/motioncoding/debugging/L$LogType.class create mode 100644 MiBand/bin/classes/com/motioncoding/debugging/L.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/BuildConfig.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/MiActivity$1.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/MiActivity.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/MiLeParamsActivity.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/MiOverviewActivity$1.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/MiOverviewActivity$2.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/MiOverviewActivity.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/R$attr.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/R$drawable.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/R$id.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/R$layout.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/R$menu.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/R$string.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/R$style.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/R.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/model/Battery$Status.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/model/Battery.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/model/LeParams$1.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/model/LeParams.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/model/MiBand.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/view/ColorPickerDialog$1.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/view/ColorPickerDialog$ColorPickerView.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/view/ColorPickerDialog$OnColorChangedListener.class create mode 100644 MiBand/bin/classes/com/motioncoding/miband/view/ColorPickerDialog.class create mode 100644 MiBand/bin/dexedLibs/android-support-v4-30a8292059eb8e12a9fe0cd4181a4ef1.jar create mode 100644 MiBand/bin/jarlist.cache create mode 100644 MiBand/bin/res/crunch/drawable-hdpi/ic_launcher.png create mode 100644 MiBand/bin/res/crunch/drawable-mdpi/ic_launcher.png create mode 100644 MiBand/bin/res/crunch/drawable-xhdpi/ic_launcher.png create mode 100644 MiBand/bin/res/crunch/drawable-xxhdpi/ic_launcher.png create mode 100644 MiBand/bin/res/crunch/drawable-xxhdpi/searching_mili_icon.png create mode 100644 MiBand/bin/resources.ap_ create mode 100644 MiBand/gen/com/motioncoding/miband/BuildConfig.java create mode 100644 MiBand/gen/com/motioncoding/miband/R.java create mode 100644 MiBand/ic_launcher-web.png create mode 100644 MiBand/libs/android-support-v4.jar create mode 100644 MiBand/proguard-project.txt create mode 100644 MiBand/project.properties create mode 100644 MiBand/res/drawable-hdpi/ic_launcher.png create mode 100644 MiBand/res/drawable-mdpi/ic_launcher.png create mode 100644 MiBand/res/drawable-xhdpi/ic_launcher.png create mode 100644 MiBand/res/drawable-xxhdpi/ic_launcher.png create mode 100644 MiBand/res/drawable-xxhdpi/searching_mili_icon.png create mode 100644 MiBand/res/layout/activity_mi.xml create mode 100644 MiBand/res/layout/activity_mi_overview.xml create mode 100644 MiBand/res/menu/menu_overview.xml create mode 100644 MiBand/res/values/strings.xml create mode 100644 MiBand/res/values/styles.xml create mode 100644 MiBand/src/com/motioncoding/debugging/L.java create mode 100644 MiBand/src/com/motioncoding/miband/MiActivity.java create mode 100644 MiBand/src/com/motioncoding/miband/MiLeParamsActivity.java create mode 100644 MiBand/src/com/motioncoding/miband/MiOverviewActivity.java create mode 100644 MiBand/src/com/motioncoding/miband/model/Battery.java create mode 100644 MiBand/src/com/motioncoding/miband/model/LeParams.java create mode 100644 MiBand/src/com/motioncoding/miband/model/MiBand.java create mode 100644 MiBand/src/com/motioncoding/miband/view/ColorPickerDialog.java diff --git a/.metadata/.lock b/.metadata/.lock new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.log b/.metadata/.log new file mode 100644 index 0000000..f4568a5 --- /dev/null +++ b/.metadata/.log @@ -0,0 +1,562 @@ +!SESSION 2014-12-19 23:01:44.389 ----------------------------------------------- +eclipse.buildId=4.4.1.M20140925-0400 +java.version=1.8.0_20 +java.vendor=Oracle Corporation +BootLoader constants: OS=macosx, ARCH=x86_64, WS=cocoa, NL=en_US +Framework arguments: -product org.eclipse.epp.package.java.product -product org.eclipse.epp.package.java.product -keyring /Users/paul/.eclipse_keyring -showlocation +Command-line arguments: -os macosx -ws cocoa -arch x86_64 -product org.eclipse.epp.package.java.product -data /Users/paul/Documents/MiBandAndroid -product org.eclipse.epp.package.java.product -keyring /Users/paul/.eclipse_keyring -showlocation + +!ENTRY org.eclipse.m2e.logback.configuration 2 0 2014-12-19 23:01:46.249 +!MESSAGE Exception while setting up logging:org.eclipse.osgi.internal.framework.EquinoxConfiguration$1 cannot be cast to java.lang.String +!STACK 0 +java.lang.ClassCastException: org.eclipse.osgi.internal.framework.EquinoxConfiguration$1 cannot be cast to java.lang.String + at org.eclipse.m2e.logback.configuration.LogHelper.logJavaProperties(LogHelper.java:26) + at org.eclipse.m2e.logback.configuration.LogPlugin.loadConfiguration(LogPlugin.java:189) + at org.eclipse.m2e.logback.configuration.LogPlugin.configureLogback(LogPlugin.java:144) + at org.eclipse.m2e.logback.configuration.LogPlugin.access$2(LogPlugin.java:107) + at org.eclipse.m2e.logback.configuration.LogPlugin$1.run(LogPlugin.java:62) + at java.util.TimerThread.mainLoop(Timer.java:555) + at java.util.TimerThread.run(Timer.java:505) + +!ENTRY org.eclipse.core.net 1 0 2014-12-19 23:01:48.000 +!MESSAGE System property http.nonProxyHosts has been set to local|*.local|169.254/16|*.169.254/16 by an external source. This value will be overwritten using the values from the preferences + +!ENTRY com.android.ide.eclipse.adt 4 0 2014-12-19 23:14:02.169 +!MESSAGE Failed to load properties file for project 'MiBand' + +!ENTRY com.android.ide.eclipse.adt 2 0 2014-12-19 23:14:15.171 +!MESSAGE Failed to render set of icons for TabHost + +!ENTRY com.android.ide.eclipse.adt 4 0 2014-12-19 23:14:15.172 +!MESSAGE Could not create tab content because could not find view with id -1 +!STACK 0 +java.lang.RuntimeException: Could not create tab content because could not find view with id -1 + at android.widget.TabHost$ViewIdContentStrategy.(TabHost.java:695) + at android.widget.TabHost$ViewIdContentStrategy.(TabHost.java:686) + at android.widget.TabHost$TabSpec.setContent(TabHost.java:535) + at com.android.layoutlib.bridge.impl.RenderSessionImpl.setupTabHost(RenderSessionImpl.java:1373) + at com.android.layoutlib.bridge.impl.RenderSessionImpl.postInflateProcess(RenderSessionImpl.java:1218) + at com.android.layoutlib.bridge.impl.RenderSessionImpl.postInflateProcess(RenderSessionImpl.java:1296) + at com.android.layoutlib.bridge.impl.RenderSessionImpl.postInflateProcess(RenderSessionImpl.java:1296) + at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:411) + at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:332) + at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:332) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderService.createRenderSession(RenderService.java:517) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.PreviewIconFactory.render(PreviewIconFactory.java:273) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.PreviewIconFactory.initColors(PreviewIconFactory.java:595) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.PreviewIconFactory.getBackgroundColor(PreviewIconFactory.java:570) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.PaletteControl.reloadPalette(PaletteControl.java:437) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.reloadPalette(GraphicalEditorPart.java:1327) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.changed(GraphicalEditorPart.java:771) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.onTargetChange(GraphicalEditorPart.java:1196) + at com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate.onDescriptorsChanged(LayoutEditorDelegate.java:916) + at com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate.delegateInitUiRootNode(LayoutEditorDelegate.java:835) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart$TargetListener.updateEditor(GraphicalEditorPart.java:953) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart$TargetListener.onTargetLoaded(GraphicalEditorPart.java:917) + at com.android.ide.eclipse.adt.AdtPlugin$11.run(AdtPlugin.java:1749) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:136) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3983) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3660) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:135) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603) + at org.eclipse.equinox.launcher.Main.run(Main.java:1465) + +!ENTRY com.android.ide.eclipse.adt 2 0 2014-12-19 23:14:15.180 +!MESSAGE Failed to render set of icons for TabWidget + +!ENTRY com.android.ide.eclipse.adt 4 0 2014-12-19 23:14:15.180 +!MESSAGE Could not create tab content because could not find view with id -1 +!STACK 0 +java.lang.RuntimeException: Could not create tab content because could not find view with id -1 + at android.widget.TabHost$ViewIdContentStrategy.(TabHost.java:695) + at android.widget.TabHost$ViewIdContentStrategy.(TabHost.java:686) + at android.widget.TabHost$TabSpec.setContent(TabHost.java:535) + at com.android.layoutlib.bridge.impl.RenderSessionImpl.setupTabHost(RenderSessionImpl.java:1373) + at com.android.layoutlib.bridge.impl.RenderSessionImpl.postInflateProcess(RenderSessionImpl.java:1218) + at com.android.layoutlib.bridge.impl.RenderSessionImpl.postInflateProcess(RenderSessionImpl.java:1296) + at com.android.layoutlib.bridge.impl.RenderSessionImpl.postInflateProcess(RenderSessionImpl.java:1296) + at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:411) + at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:332) + at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:332) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderService.createRenderSession(RenderService.java:517) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.PreviewIconFactory.render(PreviewIconFactory.java:273) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.PreviewIconFactory.initColors(PreviewIconFactory.java:595) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.PreviewIconFactory.getBackgroundColor(PreviewIconFactory.java:570) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.PaletteControl.reloadPalette(PaletteControl.java:437) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.reloadPalette(GraphicalEditorPart.java:1327) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.changed(GraphicalEditorPart.java:771) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.onTargetChange(GraphicalEditorPart.java:1196) + at com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate.onDescriptorsChanged(LayoutEditorDelegate.java:916) + at com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate.delegateInitUiRootNode(LayoutEditorDelegate.java:835) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart$TargetListener.updateEditor(GraphicalEditorPart.java:953) + at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart$TargetListener.onTargetLoaded(GraphicalEditorPart.java:917) + at com.android.ide.eclipse.adt.AdtPlugin$11.run(AdtPlugin.java:1749) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:136) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3983) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3660) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:135) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603) + at org.eclipse.equinox.launcher.Main.run(Main.java:1465) +!SESSION 2014-12-19 23:18:20.463 ----------------------------------------------- +eclipse.buildId=4.4.1.M20140925-0400 +java.version=1.8.0_20 +java.vendor=Oracle Corporation +BootLoader constants: OS=macosx, ARCH=x86_64, WS=cocoa, NL=en_US +Framework arguments: -product org.eclipse.epp.package.java.product -keyring /Users/paul/.eclipse_keyring -showlocation +Command-line arguments: -os macosx -ws cocoa -arch x86_64 -product org.eclipse.epp.package.java.product -keyring /Users/paul/.eclipse_keyring -showlocation + +!ENTRY org.eclipse.m2e.logback.configuration 2 0 2014-12-19 23:18:22.707 +!MESSAGE Exception while setting up logging:org.eclipse.osgi.internal.framework.EquinoxConfiguration$1 cannot be cast to java.lang.String +!STACK 0 +java.lang.ClassCastException: org.eclipse.osgi.internal.framework.EquinoxConfiguration$1 cannot be cast to java.lang.String + at org.eclipse.m2e.logback.configuration.LogHelper.logJavaProperties(LogHelper.java:26) + at org.eclipse.m2e.logback.configuration.LogPlugin.loadConfiguration(LogPlugin.java:189) + at org.eclipse.m2e.logback.configuration.LogPlugin.configureLogback(LogPlugin.java:144) + at org.eclipse.m2e.logback.configuration.LogPlugin.access$2(LogPlugin.java:107) + at org.eclipse.m2e.logback.configuration.LogPlugin$1.run(LogPlugin.java:62) + at java.util.TimerThread.mainLoop(Timer.java:555) + at java.util.TimerThread.run(Timer.java:505) + +!ENTRY org.eclipse.core.net 1 0 2014-12-19 23:18:24.572 +!MESSAGE System property http.nonProxyHosts has been set to local|*.local|169.254/16|*.169.254/16 by an external source. This value will be overwritten using the values from the preferences + +!ENTRY com.android.ide.eclipse.adt 4 0 2014-12-19 23:30:05.287 +!MESSAGE Failed to load properties file for project 'MiBand' + +!ENTRY org.eclipse.jface 2 0 2014-12-19 23:39:51.774 +!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation. +!SUBENTRY 1 org.eclipse.jface 2 0 2014-12-19 23:39:51.774 +!MESSAGE A conflict occurred for COMMAND+SHIFT+C: +Binding(COMMAND+SHIFT+C, + ParameterizedCommand(Command(org.eclipse.jdt.ui.edit.text.java.toggle.comment,Toggle Comment, + Toggle comment the selected lines, + Category(org.eclipse.jdt.ui.category.source,Source,Java Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@19469022, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.jdt.ui.javaEditorScope,,,system) +Binding(COMMAND+SHIFT+C, + ParameterizedCommand(Command(org.eclipse.wst.sse.ui.toggle.comment,Toggle Comment, + Toggle Comment, + Category(org.eclipse.ui.category.edit,Edit,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@76104df5, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.wst.sse.ui.structuredTextEditorScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2014-12-19 23:39:51.774 +!MESSAGE A conflict occurred for COMMAND+SHIFT+\: +Binding(COMMAND+SHIFT+\, + ParameterizedCommand(Command(org.eclipse.jdt.ui.edit.text.java.remove.block.comment,Remove Block Comment, + Remove the block comment enclosing the selection, + Category(org.eclipse.jdt.ui.category.source,Source,Java Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@491d31d9, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.jdt.ui.javaEditorScope,,,system) +Binding(COMMAND+SHIFT+\, + ParameterizedCommand(Command(org.eclipse.wst.sse.ui.remove.block.comment,Remove Block Comment, + Remove Block Comment, + Category(org.eclipse.ui.category.edit,Edit,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@3c17794e, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.wst.sse.ui.structuredTextEditorScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2014-12-19 23:39:51.774 +!MESSAGE A conflict occurred for COMMAND+I: +Binding(COMMAND+I, + ParameterizedCommand(Command(org.eclipse.jdt.ui.edit.text.java.indent,Correct Indentation, + Corrects the indentation of the selected lines, + Category(org.eclipse.jdt.ui.category.source,Source,Java Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@5baab8b6, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.jdt.ui.javaEditorScope,,,system) +Binding(COMMAND+I, + ParameterizedCommand(Command(org.eclipse.wst.sse.ui.format.active.elements,Format Active Elements, + Format active elements, + Category(org.eclipse.ui.category.edit,Edit,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@68550d86, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.wst.sse.ui.structuredTextEditorScope,,,system) +Binding(COMMAND+I, + ParameterizedCommand(Command(org.eclipse.ui.file.properties,Properties, + Display the properties of the selected item, + Category(org.eclipse.ui.category.file,File,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@7b9d1a4, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.ui.contexts.window,,cocoa,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2014-12-19 23:39:51.774 +!MESSAGE A conflict occurred for COMMAND+SHIFT+F: +Binding(COMMAND+SHIFT+F, + ParameterizedCommand(Command(org.eclipse.jdt.ui.edit.text.java.format,Format, + Format the selected text, + Category(org.eclipse.jdt.ui.category.source,Source,Java Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@5c6204e5, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.jdt.ui.javaEditorScope,,,system) +Binding(COMMAND+SHIFT+F, + ParameterizedCommand(Command(org.eclipse.wst.sse.ui.format.document,Format, + Format selection, + Category(org.eclipse.ui.category.edit,Edit,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@282c5075, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.wst.sse.ui.structuredTextEditorScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2014-12-19 23:39:51.775 +!MESSAGE A conflict occurred for COMMAND+/: +Binding(COMMAND+/, + ParameterizedCommand(Command(org.eclipse.jdt.ui.edit.text.java.toggle.comment,Toggle Comment, + Toggle comment the selected lines, + Category(org.eclipse.jdt.ui.category.source,Source,Java Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@19469022, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.jdt.ui.javaEditorScope,,,system) +Binding(COMMAND+/, + ParameterizedCommand(Command(org.eclipse.wst.sse.ui.add.block.comment,Add Block Comment, + Add Block Comment, + Category(org.eclipse.ui.category.edit,Edit,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@3a5e4f32, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.wst.sse.ui.structuredTextEditorScope,,cocoa,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2014-12-19 23:39:51.775 +!MESSAGE A conflict occurred for COMMAND+SHIFT+P: +Binding(COMMAND+SHIFT+P, + ParameterizedCommand(Command(org.eclipse.jdt.ui.edit.text.java.goto.matching.bracket,Go to Matching Bracket, + Moves the cursor to the matching bracket, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@718858cb, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.jdt.ui.javaEditorScope,,,system) +Binding(COMMAND+SHIFT+P, + ParameterizedCommand(Command(org.eclipse.wst.sse.ui.goto.matching.bracket,Matching Character, + Go to Matching Character, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@5a31abe9, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.wst.sse.ui.structuredTextEditorScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2014-12-19 23:39:51.775 +!MESSAGE A conflict occurred for COMMAND+O: +Binding(COMMAND+O, + ParameterizedCommand(Command(org.eclipse.jdt.ui.edit.text.java.show.outline,Quick Outline, + Show the quick outline for the editor input, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@513b2cda, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.jdt.ui.javaEditorScope,,,system) +Binding(COMMAND+O, + ParameterizedCommand(Command(org.eclipse.wst.sse.ui.quick_outline,Quick Outline, + Show the quick outline for the editor input, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@5f5a5143, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.wst.sse.ui.structuredTextEditorScope,,,system) + +!ENTRY org.eclipse.ui 4 4 2014-12-20 00:41:43.711 +!MESSAGE Referenced part does not exist yet: org.eclipse.ui.views.ProblemView. + +!ENTRY org.eclipse.ltk.core.refactoring 4 0 2014-12-20 01:07:10.933 +!MESSAGE The refactoring executed at Jan 1, 1970, 12:59:59 AM contributed a refactoring descriptor with invalid format: +!SUBENTRY 1 org.eclipse.ltk.core.refactoring 4 0 2014-12-20 01:07:10.933 +!MESSAGE Extracts string 'MiBand not found. Is it in range?' into R.string.not_found + +!ENTRY org.eclipse.ltk.core.refactoring 4 10000 2014-12-20 01:07:10.934 +!MESSAGE Internal Error +!STACK 1 +org.eclipse.core.runtime.CoreException: The value of key 'xml-attr-name' is not a string + at org.eclipse.ltk.internal.core.refactoring.history.RefactoringHistoryManager.checkArgumentMap(RefactoringHistoryManager.java:131) + at org.eclipse.ltk.internal.core.refactoring.history.RefactoringHistoryService.checkDescriptor(RefactoringHistoryService.java:613) + at org.eclipse.ltk.internal.core.refactoring.history.RefactoringHistoryService.performHistoryNotification(RefactoringHistoryService.java:955) + at org.eclipse.ltk.internal.core.refactoring.history.RefactoringHistoryService.access$0(RefactoringHistoryService.java:949) + at org.eclipse.ltk.internal.core.refactoring.history.RefactoringHistoryService$2.historyNotification(RefactoringHistoryService.java:379) + at org.eclipse.core.commands.operations.DefaultOperationHistory$2.run(DefaultOperationHistory.java:941) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.core.commands.operations.DefaultOperationHistory.notifyListeners(DefaultOperationHistory.java:930) + at org.eclipse.core.commands.operations.DefaultOperationHistory.notifyAboutToExecute(DefaultOperationHistory.java:953) + at org.eclipse.core.commands.operations.DefaultOperationHistory.openOperation(DefaultOperationHistory.java:1335) + at org.eclipse.ltk.internal.core.refactoring.UndoManager2.aboutToPerformChange(UndoManager2.java:139) + at org.eclipse.ltk.core.refactoring.PerformChangeOperation$1.run(PerformChangeOperation.java:254) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2313) + at org.eclipse.ltk.core.refactoring.PerformChangeOperation.executeChange(PerformChangeOperation.java:306) + at org.eclipse.ltk.internal.ui.refactoring.UIPerformChangeOperation.executeChange(UIPerformChangeOperation.java:92) + at org.eclipse.ltk.core.refactoring.PerformChangeOperation.run(PerformChangeOperation.java:218) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2313) + at org.eclipse.ltk.internal.ui.refactoring.WorkbenchRunnableAdapter.run(WorkbenchRunnableAdapter.java:87) + at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:122) +!SUBENTRY 1 org.eclipse.ltk.core.refactoring 4 10007 2014-12-20 01:07:10.935 +!MESSAGE The value of key 'xml-attr-name' is not a string + +!ENTRY com.android.ide.eclipse.adt 4 0 2014-12-20 01:08:57.633 +!MESSAGE Warning: Ignoring name conflict in resource file for name hello_world + +!ENTRY org.eclipse.recommenders.rcp 4 5 2014-12-20 01:11:09.415 +!MESSAGE Failed to resolve selection in ‘=MiBand/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 Y)e!8H{kSGs{=Y&1ZE0gsYlbKO8xY^dOP)fwB-N ziwB@@Z*SuD^;NvQyig7jn1GE}KtDe}#pC0nxWB&_cXxN<_V$)?fWQJw9v&VfBilef zK0d_R*%@Iv6zb{esbpju===M-I669_105=`0V4t>P&$u5DFUSklt2lTKC^9lq*6DDos;d0n+2!SBQB+hUg|BM(YD1uIK=IS8eQj+` zWM^j^Q0M06{My;c$w}kf`}_Mo+YqQtpwRL0u?P(fm3HOjJqD~tHB2}EiFyjVI9-!;dJF}{BCwEoU3e99oA{9 zKrAOG$F_~G-Q8WwATKU1PK=L_e>(;@p|Sz^va&MM<0~sGg9j+KHmYN-t*w3min|}q z)7R(X;$m6X+}v#2Mrm(vPsGQ^8=ZRMHAX!&JUna(6wvV#QGG>4h5Q`- z*q)xAzy^x76P<{Tj+QnV85!d0>dG%b{k?`378c5OMCXW#^|p(P3z3(XXGHVZUz-6% zoBJq6RGpZZDBIK1(*u7Ws)Y5(Y|G#TpjhKndtYCl={XJ$4~;2Y-+t*p-ABC=>J{*y z0gAiSYz=Y((E9p%*%lri?lH4fTU#sbFyoj3)q^%&2*i|)`wSIOQ!bo?yC3V3>X18B zCjdpDhBidvp87gAHfEd$(XB5))o}qI*@^rWZcy#k+V`;_QVLIQe7hwCP5F>j;x-C>LUoFAUQc%?pxIpnwXdvOQ4XRUc*eF zPlMha)DF;t zg9AFxp#mGPfa0AX_{zu0$%(kRxuFvsBCr4xu<`1>EqH6s&d!eL?d=u){rzHaaFB9< zzyeJ0FA2PQvyvL6c+b}J^Rsw*dZHX4umBUQ(aEX*IsMQHP_r7@?PZ)9u5T#3JMCI!dqE26ckj@-#;u2 zV2`V3gd+-yJdc8`)F+qOeNTctE`TT<|MattP^RM^v#S__(GxK}OEk(nP zfBLI_o3bPLd)19flxsN3ky?9jMKbH zXCTBvV*ow!m4wRC5n{=LfiM5r42EF=n^<9zbcFwG5|IK&6GDi9z5i_f=fr=m@t+g_ zbq%br5&hB0NoM0OUu?{*tnxAF2_fhdd3kwiPENJ{X~K?*KY#v=p%HVFZTW>;U0wZF zRrDC`d6b5=tb#&FTvF1@{kgixhb~i9U-8(uxX!k)wyv%&agw%4bL5r4a?^JA)zy_O z*b|S0MWvd6$CRAQz~{Be0NElcwr47g>sJsSW&SillpYvdc)jrZx4hZy<#Fhe=Y9<$ zx3ZEa(gCG?Acaqf;`P_4*G9jeWO`w~CAlMYl(?9;2QC^9!@#HNvF2KzG0lw6@VYh& zinzGmD?g1;*mj4aTfE&C`_e;bHd}2r_GhLl&w0`HjoWTffs63{=Eg>Y$Hl=y(->QM zv!VAd#xHveX5!x4x$ zx;mB#9kV$+1jNPlewLLvUE)9b#mdS$cCyi*$E=j__C>6MBgXp>n1SQB#pYyv33_^| zMz1?JN$*$>6Jq2VuLBghifslD@NczlK_-}!qb+&hfyKq{th}*sW2Gw2sPpR=Aqk7AIN4py0j+vd+YHA8;<24;xUwX_cemcN=?$9Z7TdJx8e(7J2Ysj{} zd}*029voc0Jj;L;UU?ZoM`Owm9~&gf!Boa+C`Aa?_5CW7CrpGX-Hh#s@rZ#R?NJn` zBdQdRb0y1imcJdX*Cpf^Hm)T`%Q`6)5h)QVrVa_WU>f3U%f+I*C^hv^vJO`%dq$;A z={lK^U9KmcFyZ&)E zWo|qe77P>QBI{h<{`1EnxGvbCQ#H<~$O2N!Mie|2C*;!=2G1t4dPBGS(Qd~lPbqP> zKQ}LrH38N2RdivRs6qToR9Pl0P6h_}A%7gA!D^w==Yjy-=qHTA@4Wx z|EJ$ikisWJP3DuYn%J^2&@#K6S1=wWY1+~FC`uVS=mp!fd;INcb5t`Tf)AAp=s&`2 zF6Pk};(fqR`{*<_tSK?Ru>ZYzMdy|Y0k3>$!tgWHi0oX{0x5fjjgrzL(M z9=I1G0CCG~DA<7U_4iH_U=z!n5bR>~vV^uaRxp&Aps-le%8i(G74j1E`5gH_kG5S8 z7yH;4Sm4)A_duf|cavRJhYY}hK#KfqjBoFh+vz~{TZVR!gZYM^8)pn4Zi^6uHrVSB zpzqwOzr~fIhDnw9?UdmCJq=vw*u^}NB?GpoTS8>f?<}$Pa zo<0PhuTSTNLG6Vs9a)cJKSgtqsuEny-Wyh_6BkXupzr;W4hvW5lcbsj4==jBEkWgDDy*0M(F8x$^!x&iLE7^%0P=h z&81HO_o2~)Dxv`I^4CU;r``_zsuphD+Rs>QoqGPwfXn~OkJQ<+)Ruh#SGxzvK8F`5 z|G^3Wpo;$y!1xcU_y=J8&rkgSMkc$uzj~Vm)$ZE;F&*l#p?cz**B}VBppB&4R=RU; z=IuI*(^VIz7ro^|qq@1ZHG%m8t>;`}nrmzM-DwU?^{rW)J(ZNNca!$)q39Y99kln$BVUJ3&gZO^ z>a3UWQ}9<-R`8Jk4v?$)Q>NRbbB6muqf~3sXigBf5A!jLYDP8UII-=vi=I*o}us!=ASJ*ynDYOvaLhCg(Xyvp>@nw>#k~_d5ldim@-0$8xLK z9DnxpDRxytAdnQN+OsnU@p@>9PQ#e-axeOZzpse%!Svqk2B-HQlDfRZCQX%*pBLzANmv>~(|v*0r2S5t6<1El=EUoy-@YJj#@m zlvjDVxi+qsN01Sb_>niPi^SyQy{Gcw6wHGeVogg#3G*?pUcOv5v!P7Grs5{_)xX>Q zd_F{5a`OiItnu$7X?*)u;_vEqv@A7finWohXvLvlZ_}PN55*>N5ym)Zc0IkOhO`?K zB402wA6NhR^UXcwYb@|Ajoa4;O^4^HPB@P6F}nez5L~)>P2zq{f=c)~h^(IYsJQ0f zla2Q8aLVq7NWox90CxI2()Scg5NWu&Hnc1PDC_w30M6>EwbvppE4G#N(*q$zYKE8qiV)2l_=`r%CH??8y+$t$4@lpkwXHWWTMsgzxo=5QW z@f{mK9^$nnV;VZpgb6=;^xID95l3X&kIw7#%=@!~y9gKxH+4kB;^d_9;Su;8<#w*^ zj`HCQFQ6-Tb4 z*>cS?LY&To3G&{ICG6U@(|e1po=tZTz!eQ%>6A>mJ=|SfJxCd9`5S_>xHmJlEppMM zeZI}rDvy4PPc2DLPnSCUl$@L_sth7T=f2xf^|ov9y|dMPOs6mTYU)qV^I3Q$al4Mx zZo7^Q@KR@iJ|jx-7{nB=b5ZOUS)jCT&Z?*5o=*Q+Q8C(8hZ%x&hR1NyJ@Z4TqV@Il z>6~z%Dng%8K=Y7*jd5h%K0_UN-41VmM?DX_I^CK(jF3VA2)?$Qffi@W2c2NCgKcQ9Le-f;RgbeH;79p1xEz((IsI7xl7Rzx*aCvP`|-OlP*X7Z>iG%MUDj>p)28Ry_9C4r>Eb+ zlZMJkOOLt#la{&RC20!=L!r=I0W7RNO=4o=m_<6e651%>bB2KmX;G90j-^C{^7;My zAbo|mZ{NE4`@puYkbPxwYC|P5?#o1#|71mae{G@X%GB7a zu9Jm@NVt6^4jfT_uYFahe7qtTFy*s58SCKa7|`9_9rSR!B|)&%;$CNh{Mn1#Lv$>8 zUMw83WP0%2hOlHTpR^o$a(e8~)->)+OiyoTj{_+gG0pSm1@7)bdslad-Vz>1%k3+g znwpKhZy%IG;e*U|Hv&<-n2J9iqemvT`lN%Ts*DGBGUu3hAI(awySZ*dZ4-XgEl)>7RUU@X#M+7Ja2$p#C!di0=6A^X zpP4|w`=ny>XpwaQZ(Ig1t-H9R$`P{&Gw$Bt^NB*=&)xhyz%RYYm7^_=w zvE-e(S8dpZ)A85aom3|!k?GF8;{f8rxx4G1X>MJIx2mdJNCHa!0WPmwm**j&p<|_< zfT=x^xLqM=@LIZ_s(TX4qKY3ZPFM0)HScF7za8?8HUq+oYVcu7L*KSX;`1drz%U4I zMCo}Ir4-Q4dozutUQaMFibd)Uleyl{%LSdCpGWjK78@}#3jB%q!Vw_Wa(u09t z2|5{A2%fK`kMItPwv=?RALV0Yj9GZivGzMWEKS@~_(6iPo6VEQ8oW~&;-b*_ z#tk&j>1CCvGqGx$b9u+c&1HsGMjbJA%~Jgoq0tw-l^Exj*p1}j?1QD})y-)P85(*T z`)cBBYp;ikYjw}HIhk2GIQS`^U@%hN-tzA0$WQft{|@t0%PfFnq((>k7%oZ0(gtCy)G=iWdsJK%bmfjh$RUaW8SAG_8xsJMgtm4RQez7yRrtfWE?y? zXZJ&wR8{*|mWs-*MHk0~J)>0#r0Xn?>$F=P6fCS-_tjc&)$oSxcN=iyHo8mP!HOJ>yGs9k_aeMx-cL%wx_bDNoZ}QVfOfR=`db=;TW>egP z?Dp_R^YJXcha&227W>*h>ggGsWk3v@a(&bCgL_iv@dIPHCfKAS^rgM!;Ip900p|4` zOH2I*ovkk_sKabk8p#WjJK>+=5Gnor=F>>rK}y6v{~ODBqt?m!)%Tmf#Cd^cnUn?g zUmR0LnTosd{BSG6W(4szWtqr>fi{(Xo3D@F>z)VeA`Q|P(vp(C>Q#OTxdIp|K3;(V zoev+fQpKsMsZBO3Q}n&AjPJd3xf7%6p4nqNj+()t*v(!&v8v*|avokl^mZKGDfhl( zEBD?W$-3p7{Zk-uSCp)&dwcp*z4*3K9E+`hMaXsaUBpTbyO3ihVs4xaa$KE~(vNRE zoZj+lJThsFdW;jHJE&uH0N4O{8G*PFIYT7++iyLm&TU=DM<+>Rc zi#n;Ke15Qy+F_-G&j?c9J(X9<6i@FE*1)g&VwdEYSIqI1vEds4zCU{=sdpg-y>9Ep z!W*EX>|$cN&(k*tQxkdJ&c2q7BlNuo$1AI<>;s>W!;!)^%RZaJgK0vsh`W7j@3|~p zb93`QZo17bqZeN7_pF~{^C<@dXv?S7zN+-vy;W5Z|2>}UxEeKtm1Tp7cq~fbJw7ND zfJvfuxs_z;ex;wfZwFCzbYr8Y)(x<&sG=-$xg&=3suQ&dl8jxz`nEKq^Ufq=YT>RY&qMvM;g}5J{nV2tgJ@1GS8>6| za>Z410mKE@;lOo&r4I3Kl$|D|bk{z0))C5e zQYB{*6)kbD&suf?ME+!lV(!1|G9v4eE z{lqYJU_RZ*s>jWFIN_?1Sdo?8JeA?}>IS6B##wC3>U|3qA2up82Z9yLcNoRAvV{RO zPr*}6!PL~W1As&g;zdP8jeCIm8GhY-1jh|^?N4A|a|7}bv!5TOq@+549Odc8w)My{)UK1lU6qW@46D+KVNrt-3SR6=CK(|NS(&D$bccO zugU{~qm?P?=%gJqN_w4FW!icsT`35@(9aeG0h1*bxnj7 zE35TV%^G3x@N|ZK_Q-}v5P|VYv!}b-Y%+4vt5<7*rsKDh(r zz>T(bOV{}C2y1Yu)Z@xo)yIy*y18fXq= zEuKDmrjR2aZa3oV=wUXVudG(+OGJu@BucOn1}Jn*w}XZ)s@bq;|4*Mk7g)^Y=I1MN zww%T2vYgY!Y!0QfEws2J%J;^NYoKuQdr~vF(tubfmsnV)L=N7>9bbD~p|I{G#)`Y*)N@O^{{?iaXJS=`w z@(FMr6W0}Y$3QKL8mq8ih=!DOb0qMuudHIk+b>GgTTCFRRiR^xBI$dVE*wwN3q<`~ zz#^gxR%rIJKL5=bIKRKyt^qQJ8^Pd^5bP%q^|;UWm8?x)?AG5GZGH$YQ`dq$o1}+#Dppmiv6624)R12fbCz-&{3olopST z8br%y^Y6@Pj#g}|EYwmH@FOu>lhsFD*5|lc_tfLL{97zU<1m z_~*}CmJ$bhe3q1a$^((Z0tK_?Kc$;<9IkZS>*+$CdZ+Cnf|wL&CWTXy>4hTv{2K8v z0LJhkaMLMBGl&f~Wy<5?o+>-oB4!HSCBskS4K3gd(7Bu%z54`$K$W-uAa4?l_goRo zr(1PlH`=OMQHbz zEkQ2s@gsub1fw4NF~*Z9J?}fmpn@>2Q6j-98BRjd7xZz2)YPTsqubnAa!=m(?msSK zAYf90PV(w`BGvDs)GF=H#&9dtpmL%}uX*CBcIeZaZ%Zla+6}?On{l9^N-Q`dwJCbz zOAY&tW9NvB5eI`+Gm`CJC3TXbsKVa?H`*OR_!Tq6j|-p%9Y+=Fp-3c>!&NB(wBouA z&5{HsJ(X-7dtD!#HvnKctYXY%IxP&=} z#q5fg*U^f)H5|Mm$QJ1?2KaQA7+iiX5)2FJ$X~T62?XECd4F$w+Cax8-8R%kW!R2L zW)fP?V3;CQBu!v}qB{p+DUl~#`ofZ}g!rzfTih$)4cEe4R+8Lt0`{dC4S`O-B0ZG(FPXj4ECvkCI7IYSeKp5x5B9Vrxqq1=DIJPG0zXxsTkY!Ea;e5=Saqt8w%|xCy4_t`+p`J2P2JJj@^@f<{a@ciwG4 z#ZX=c`!DEO>gwp`gg3fh&^X^nDh^pK?#$b#`K%ujFMe${^Jed^Ks`LYz=ni7I*MVr ztw^1-tZ{$kbOx+OWRPImNWV^jlN} zuQGc(XTQ;2Nq$Sz&Ja!8(Zh3nMtCt+wHW(&E*8B^rK-CqgeMb#`{P+Un z@Ld2-@;U#H1+G-609GNMJIgYLVFBhJ&pM@m?7GEkGTv($On`nUPFP zp89UM(nW*8u(xmjR=WPZe*5;C5TeZXb(2`pW-0_IPlZ9D|5^U~KVbcLC$N&WXDw{( zX8weQOG#yjshLNT`bYuXl}PJ)H`l^`$PIyXzfVicd2u51a{X6X?o?R38hr7~PIjK? zSEyrIt&&y+tKN0u=vr=D+0y>;MZ|Lf#ihGN+%bVn8j$5&=ChHAy&{!2cEzrD<~;is zVGg58Zy}BaPg{lMDFo=>UEg?TO@XI{&nS@AZOa2KcFtT2uxBSO<51hTZK|p6u5I? z?ZtMWkCiVb?;owT(1V^xAGZ{Wk)!UcFYZ=f#dg0jzdOndRLEJRI%M#^f2sJqg)XSF zPZ0YD2xINxzH8lQXDwVM{|}Ct;q()ASNr)ju>o)4O?KT`9Ax&u5m8PqGc9G_mC}^L zaNE(PWaJVjn1&DzcY+JPBy~T;O`pKR&3%Et^-GH7Wzfg?V{**RRoNm*Led_b_0GLy z!T8vlv{3!tc$C-C7@H{GJ}Dub81qMhZe_z=)~cWz7KqJW zQR6)pE*hg1Rff-Y{UYI1Aa!r^?b6-CFCU@=PT|s-^Gm{!$T}vpLFHq)auR0c`D}PB z2@`s(zIFP6bpXs-R9~cEEwECHb)`9*zQJW@oI0!uZJ z7LT%ha7Oa))3-mBCkJb_Gl2BZh|_J;N1yTt7j;Q-3EFTXM{sw{ud=Nz7gBegLso)a zsf?yZMt(^&iKJt6|EAa9(di{(lrP+LRRX(Aci^b^-E72}HD~nb7M)jXo+g}BPim9s z_B}XldL*8RlaS7fM5&D99X|F4?qzzM-(ke%W%LVWXW7<561)F-`m);*NqA(uIVqV_ z!E?}~>fwj$L;)Fj7H24dvn)Z&d(M-@vJiFVl6~wMRJ_I}Mo@jY;FHhTHf&--%yT4g z>C{433^-4GWN~I2UqC^7mooe@ zUur0r$nb@)lcv}tZtM%X3rKkjNBTqaTo=2vWCP2BpB&g9lR#r2EF!||*5}Isge#G+ z`K;q}gA&M^glO-h-3|Z2yA@X#pBrT`K;!(eWu=OEB|-O$`{$xG`0GowOTxFL;rRlP za2kx+X+uv4{d9WaU;11a?}U4KeLp7Vvju`}grkHLid20#<)e|=VJ$2T&|^{3&dvNz zv1V6!(o{uSUvujx1!mY5|63$J1Ly%Wfa;d2fpKB`Vp1B0+U@mygrBU_@1Mdy)Cbcs zf-JEd0Y$(^bHWzv{sqtrtI8?25dQXSwk^?IdIBjmu{j*H$dki6tE{pLzIV&N9-%id zMg$DgIT0BIhL!U{AetRL(TuL-w{r71y#AM>-=?|l1^D>*mZ1UDPv;FpC)TU{Q?$Y6 zKK}+eeb9h{c{T}(AxdJ^jzvlE2)XL3CupTe=_ksi$|FS40w%Xix^s%)*F{&3jl@$o z_KAg?Vac4L9@R{sA2l`VDH7h|`p$el$ea&3@(KW*Hddk;Y3kkI*Y`*f42Fg$JD+_X zs6MaOW8da3$?)mQihBP7M6`D#J7NQXO2T>(^YP#96S%nd6SI%{vCdwU+?g@cXmV<8 zBd;lq)JricUXoRfX^|vQ0IU{=7*I1n_2k2pM_Ek=Z;p&pGX8_Cf`@E5%dv5-XhDUz zTbzyS3vElr`lz%()8hMspRr<_@LpQruDv)J2JimZ_(qlS)?1Ujw7y!h#0TL<7&^pg zqPF38NpZrJQ}i5=0!`~mYU8#*Q)BgQ5zGV@q4NzwTEwIvkcagOJOGsu1Xc=ecdHCk z1m}pAcARt?Y)8Wm7F)U(#G}-lFJyw6#~Zc;$%|T)$bRm@q`R1*Gq%w!P!D)}UhjWvk)bI`k<`v!oR{bf>in+rvV=g!K-V%~4W!x52lU1I`j=LI zi=HTYtLNcvGGN05cURf8?u3d{ZPef!$Q5QYHuLJmEc1YfdJjNrz4QCR+R#~ARz2}8 zBQO~r5uw5WqID!z!s06S`@vqqQPHQvx|tuZ2VUXO`_fe`Z>HQ|+(6guXV|6^N`G_KPY7d4+3Ifx$oDPYMDRGKFIg(-R4ZE6`dNvHv`%ULNjpy)M-f)R4&M!-i`7))C;P%)qOH-VbQebY!pKBEnL3) zV}UJ{NTo?m56~2eQB!Lq0+~W0_|Ie}Z|~(B8G^x7P>RE&B$az&dYVfYOp4 zXZz-D;9E#&NMH*idu+YZ&9&2)!UG~g+jF1*Q79(n> ztnV40X;=J(9xWDjJK39gqP4BAt=+HtL^TuIKC&}W^zpWpU9UOG8~-)rD*O4WzzC|< zD-bR?>#*fQZv@2QER5|;UPdvm-g!;P=$8S=TIeU2+R=l<84fmBIqR8A{IOZjXT%3? zdrcn<_+0(6;lnOhez&VX_@Cl`?;P~IL6899Ox5u(Lx_|PQhoO>E&-$oA9SiW#QL$D zMPkytTm}#d4;Bhwu^m2uZ+G{23gyV;_Rq_zQRz<*6Ib>Cigf2Q3xEmR7l&o0w3w^+ zoH+yVrpanSII{fk|HX-HSrq&9JAS_6M$%=SRAwyr7b6jQlWaMcA1>Of%Lri|%D(8! z5i>OmAZv${JP#PsPP|J%SXfIS-9TLm^NJXQ9jiZG?{sr;4T{nt`v533Hl?h$G2jR_ z7LcxF3-|?{^>c8Kbb&!b`QrH!LeD+CyM6gL#&_5R%5x%UKpviX{iH|gFuvdXBW{sG z3{fNmbve+5hc^oy;#wSAw^1`voR=4n=5JCbL4!o?iMJPq9#79%PnPvHMr z6#JDVZ-eEn%;N3UsiQR;p{Rpqy-n6<EyDPZJlP$k zZ{L+FOEUGOzBY?Fu;c^g3Y017>ZbEU(G9Tu$9MvPAZO-&rq?=vTJ{Czga1UI`eVsr zi4*>dzfCD`lPa!_VPs%n_+b$tI;zkqBpMwT7Z+v5hH?-wJK+s;Al}=Kn|-8&^+*}q zTCJ|2fQ@)e@^o<(+Zn(Tx&IrM;CuswcA8V1i4-OEnv;tbt`0X%Y~waY|W8Jhe_ zh)`RG#)KD18XhJ9LE20G=P=bC5%t;%Ur@0yZ#iRkm1NhvcBxYE2`;)k@zRE2 z0eyFSh1WiYyXTzdKZml|-no3*^_^hKnjlbVJ6z8uVEH^tw{sxx7a-QZa(r~mktHC! zBHr$a5j}+vaT73HvHk)2pnpK`_i#A`AVtrgaXN%PwP z$TffM2}M&H?(db;h1`71<Glu(U$V-3=|w^sSD{xDM|}Q5={fsG3Ll1(b0=xTNltr3_#sfrc-p@fg+hhp z)6ysBnuhPcZ;2ekzVTeMdGG2<^@wPDZP^y=SEVNi*V#Wp8PyQXeg(GNC{=kxS9^Ks zVm4oID<#pO-O@G(_Et5%Yf<|w{R{sWYmn+&3yrSn&wkc3^>2jTH+glD@D;uxH_NbD zPEDoaGsY4Nyl}Nfp`c8qm*?h)P?+Qsx?&?Y7NQRK7)GS3q zVga?%@VH$0`8j@*-ew$C*=H}kil;5Ew5m6Mq#Mqm>e}{QDr&G2Am*hICkV!)`77Xm zvx{tx5WTXUadmY)N8Q$;**aQbjkI5{o=~7t-1Vr$QW2CAj(CrQhK9X*_SAIj*K+p? z_Q_qVEed*H+wpHo{0(hw?JHI;*!%RzYMfdX!7tKLPeE)^X$ipXK3cP|f;Gs3-AFXF zc3I106l{}YahF&vb?Q>LYHAiHbvOx`cR4sJ8wtsK#O*p*=G7p+2t(Q+RE@!~wb|A7iuy02i!LuBJ8q z{MnYgD>#d5MyFyrkSQTS7u4!jOcEg>K=#B5PO#a#(06zDV(*Z-@?Ni01X6k@7)atn ztQPsj{_dw`B2f4!qjmTwd_^ni}dpA_kEp4Ss)J< zeD+x>UD6765Qlvf`k} zyu5AC$Hrn{rDDnM8~_<)?YfSe7bkpqB3Y=lD+}GA{;o}u8(h;Qz5BI%YR=h((985) z%sF?-du9;TSxCf_i}sBd6yfKLl|&NKKd7bjqU622S~rEU6GyHDZ4G*3n7z^?iUV_V znN_qAerP~|r7CjE(S4#I6iLH`g7lyT+@0y^icWDb$ zmX;g7df<=2Mk~DY1Vje%KR#QeOJc#!p_7;bxc|!fVLoVe@oy;`f$2CidvocD%ssV_o^rxTQKV5Dq%9dR7z&XUS`Sv0f+8VDf*R&? zUj5$Q-jrRY;HOCcX@d~R3_3;`nBjwl2I)ktjAvoDc}<|~6D4I9hLQ~5fE1fL{*swq z)7LW30Da`CQ`5}Em;^Si>QvN-3byPs~Q>#A`>iKRgE<ra!Pz!^Ir;*GB&?sK%6bx+_BJP3cNz|@_4#!>OyiMYX`MQ^J-5_ zI$Iu9e0}<>DP*K~X4b!k)zH|{(eeBYsONOmJz8${`vRkq3Aywy`g<2yotK1%+vqs% zYY{f-X{BP#{^V8c(OaG~vr}zY7RRey%^j;^V$HMJFCMvUJZADa^tfCJIxlj7xI#jF z+p1nI?lQ4_1nE6H9QA$rH`$)j02B}&mLz&b?M#o~5|I!vEEBY((=Rf2mb{w9L8D)E ze*zWR4g+3rM30bd!k&*aCNHl_ap+XNS7}IjomQK$MxU4_le+qpLPCt486rYPM}K>t zz>OKAoF+JGEUcrj{>!aEA@;@ba&1rd58u?a@~-7#6%<2tm=>XFM@p&W_Ue;n+LwMa zC%R1UGgB;Z4HFM@QS3gbbA`l#KU&DxRSjOG_!C&%+?O@{aXgx&vv0$UoT zz&=b&>nV`0kF`NTe`msy{;#R7|CxybMIoL-{96yb|L+a&NK0E~i_l90zht<$7NDx`~)L!1Bi>`+F7!6`DO zJ*vrBldnIL-6AKHLK*R~yKgxPH2iRTe)waT* zW4+dcT%;w_m$?Mb#u}o7@$1Qol5)z1ANuK>jfHcbd)xKayanqpZZac;ne{x;9NcWxPg9$K!NvGo~#X8ISAy~&2KN>`{Ili{m373&23=je)eEAsI(aY_V>Y z;RM>x?MmFkkik#oNmh~PsNq8b!s(Bm0SH>7chywWiMtG4TcwRPs;7gbN@oe4I&H{6 zaM+GPAjkE*xm5+Mz2KDs=2(41$jxA5HOa2r9bnknilLmEIJn|fb#s73WDx0kwjIsv zbR(rF0c2k|{0AqOTj6_7+FIHNXu3fb2rKZ|Km)0~*?qW%tI8(kCCKuVvNsdI7~>PpF@^zO9r1Iup2 zT>PJjB@tZ4se{#h#N=dNk&2wDQiDozw~EMlO(jK!7Z*KyA<_txMe`QEm=o|P3;tkT z^XXN>!|L^5w`KiY1s<58#o+OUKww>SXx^uD|KwbIxJS0*HpFDj6N+fPAu_u?x zfy~jHux@yN5W{jkwb6*7>}Y6}l&tA2b}j&jdk4>0tHiBx!V+-0JU)(bXAJ9jCpMn| z-Rit~hF*vCfxYv6x;E94A8t{Xn&b|_Ija$izrNmkF@^G1T6_gai&-vBO@8lYt5&jx zA@tSNO%=srjCiO;e>?PXPj2TDpfySs#Nck^hn{HV8|Aa^ND3or%FcgUxe4K3e*jeZ z`K75ByHf=KhA`8rvTHJPF6osDa=$o831j#y%jyr6Y9k7^vDG`!<&eoGiC@ zTv~p(S<4YP+{%Wxbei)q6PKmc4&& zS<7XI@G#f9j=fQo8A=B~kooKy}(XZi^R? z8OuD#WC$^LTZ#eG6TCO32IryyNvy2Z42(C1+v^Km*-qGNzJ*YoyJ+q)kM&%c>*$Ud z(R9A=R*kF*>c-TFyfk%*t|ZO-{=`Xpy(o68-Yb)4U___j;NYMqy&}lv?lRR%{F$qbx9|fMiKov)X<1`7 zFc>&APK7xWG+u4yL^9I4iEKf1PHf%Ja{rD64Da=W1^2+hVBJ7uad_bG-!J^z5U1+X zABPAn-o5@75zIT^gxHC4KC?+!S$ifgqpaLwbzQX6>}LGLqDeOe;d%D9);zVkW?{os zA*9>EGSk!cO#_Xy)||uS+Lv?9vY?vkG3LX|igD5M$`kuRZVYn zHsELO7Wzkd9vA66KliciEiP+?pN^@i2E5Chtq|k(7{6YajgZ(|J2qu6RU3FXdyg?} zZDs`=S6H~=ihjjxwTB8}Kav9`8C4q`T8;ZfewJs4&Fqq1x}{6@))Xt_Mwq5)JT*G= z$}g~$8uNX9-%zwuYvMNZYLE0AxW!(|HhPjdvVl~moO%@VwRL%4C54{zP>6J5Gn*sA zMbEqsd*Q&eZ-qoBsQ5FbnmTp!hyyoi^Ly<~lJ4QJTIG}G zYe*hkC2rcgCs)QLOF~K6J+>YkT#qvT}9@^CH=GwpEO^aiM&T+*K#2GVK4^RmF?-w{BbitZnj> ze75K1)HQQ2gt7nIz4qH1ziaE)_RW9zxBB+8THr>c%^O{dZ41^1{CD+Unl&@!a$)uT zN4Y2VH5)c=F;3U32;t|@J`-&@Wrk2%#LlB@e-yn<@Hq7_XPJLV1SnTniHJrXHp~6d z@>)@)aKGi7b8oG8ZS(aFjg9y+?QhxKYwLPAPoJ<5y#}nJyFuF|V%lH$epI|%uW*Jd z^{-v?*1#U;XxZ~8uCHCI@FF;y*D&$-SSunH5fQaw5o@i82qGdPB8d2hhzKI$T6Lu&B0{YoZq~YP%ww~%b;VlL zx^9fF?`K^%8nbqdub3EPj4?*@PUexxJCn)7U(ff<{f#Gg?o4tgsddfy!H>+`b6<1r z=lovh+(eNUE$>jGbQfsRz-iIIY0>gQ0QaVwszn3WW5_z*1Z%sYR&5$S4O~R9nE`8i z^M+c*7oSP74Q=fjIt^S;VN)S%5kxf$ZBi89z3u)sp9wq-oCeM|Y=FpXz}3*!L3OQu zt@Zg8pRv8E&A%T**P)@)z(oQZg9f;&g}Pfh$mwk-hfw^*caH&HqXl#tI1QXF*Z>kh z16-BO?Nr{>PDOPsbU(j{9=!t6r^5`$8Z_;0d-h7fzB?fe` zboBzdX2Z(0YvB3@aDXi#A%S9JW98qjG(J9FXadCvjg5<^J#h*2d2Bp=wkMAMCNw%G zj!viiNVy&_UCGR&k5AmBX(zIz{`tfWx|y9%r2;xvOS|97DZq7T;y!%fV6_0-ix)2f zmdojKE1%!0gRPp-a>KH{5|%B$+(9{|Rg_s=MfYA;(*4qEx{#4a>ymHKq~nih(BVv} z6O$g%N8kQHX}K?{O1Rt_pFfsUfz!-==)egV3Cjh@%yl#_bFixA4kQOPM!Z%gVzoly zLZ8*PQkL6GXARi?V89l2Fhl4=`sIOpH1Vq|l$3U#Dw|rRTeSmRU0oeryLOGPUcE{g z85uGh2qh;^o}{R#D4IWi{(JX;&YwST``&y$Uy!!7wf($+!^4H;f}4c(GS|_(23&!9 zTHD)l2LgY@Vx>)O61H3c+ap)Agl+9{6Kwx@Nd3M}r?FpNrq9paq&!EhJhrDDW z=fF9;is6!yl4Pf%bH|S#Ppej~qIK)m(XwUBXuyC0a{IJt(}JM;P=T8{b0#fXv?!pH zCr=La&#+;`C?_Z9{kL!c4%wzx0j3&B0$s1jOXlsW(!tlIOsR(ew7qX&TPQ9i9Z zo?;DK;w9QCV0&2Rp+W&D&Via-osp%6DvQ9faYygmxijegF`@w>+5ur-04^mZ#j+o! zPoFN^XV0Gfegem}G>5Qku>!a2w&_#(Z&!qR-r*yQLlpD9%%5ltmhiI$Ws2FFFsM2&)!K($dlbuBD=)qE7+`!FJx~ zUB`CzfDZ{dHeuO55wQKIq*}UN01N9DswAQUm!F>>=)l6l!mz((#E21czvSd(OW^PTVq#)w z#*7&6 z)Kpr&e7V$uf`V=Xhu^~cSp6>a0e%y%iTfKla-$Owtz#K1NF3G0UT$YfbDu#9&PyU7A-iFDeGtFM0|Ev0G94-q1z5G-KuP+XLwlt>*CI!vn_*8Z?NmU%wu748RyYdUW6z#8TLozvJGz16+D~x*QN_0~~fN93bF( zG-vNlr<0~knG!e$?r-qm!GZ5cILxwP!v@(lb?Vek+ud%r>=U%@+qciYg{w4xE2?zL zn613gCoS8@CsOJ6$1~|SM;}X|)(V%I{2-4~${XqXvL^cG{&QL@VEbbj*wTtzlwRzj z=QS-d?qgSqOxJ6`7AiaCAG~DAl8DSa1IN&+BNY#a18u;n%7O(8L zw{G1U^4x5pPn|jyvY+r5?$yc~Mij%bg)47vqbC&}Su-1xcsU5V-+h}UwJX^2MMnC# zq)N`O7FIZI!Pc7=E);NVdDIM;I~48|?PguLaG`9UJ9lp27@k0)Eu*AaK)WcO5BkDmZ+9YNBHncE@Tq%7Vei1A}LE)Ou&+Q(FQGOwQMu zR)FNz`shxH-_l9RW?KAAmU4SQrq=(j%T}2p3Fa z^#}*eY8Dm=aJzQx3K^%cm@_#pm*Bx#$A(=#bFHsJz| zOE^!Tox4d7%4_5_7xv+zu9}SkVw@XLN3zZh^(CI5-@bi&P&+FB9JHGQ-bjE$ft1~< zRaOTphL{MY1QukOTtvk+%@upL3aI^cRrrOgX0Xil!EnIg9@vt>g{lJ&7L-9W_aWMN zP$SzmyHYL|t64jeIBZ+Ic(HxpAXpE_%ai!6D~1l1E-+ayELdiFHSN80i~fG~N6N0O zk)WXsD@Pm_bvB2w^a;R4DsYoL0uj$4qXHywJ-i*CyQeXQ+aTtov z)yDg#^{sE;HC3mpdJ8xfOcbN$gon$)_Wx3FJ(L0N-MiQA6&QGUaC==PI{z=hZ$kfd zwPL#0SBsc|a~W}#3Z435Gq00V72BHH-&!^E+^DOUfz$GSO2jYGxYQSBocNP?CD}nJc(+sD)pZRz`r#VK@(uaWy z{UWrx(@W3(R|i9X$G-9y(|K_2-ij5pd;q}NsoCj&DyZe10jEWa22P6xPKyRkixv%> t77d&hEgCp28aORlG;mrpa9a9^{1g8Bx^~MWGyR6l1Q?WM3N+lBuNrU zk|dHO$;oHl_j}BpJ9F+ibI)#TMZ3{$^k$&w}@BoI^w!M%I;j8MBp>%VN- zvZl7<$B&OI-)GOBHSguqrca+f<$T_}d9!egA3uKNvUB0W1ylF@`STn^jMXt9zye6) z_!b+)0u0&#Mgl>5APCWvDO1d|xS{`=*k|8C;RIp+2A=g++U z^XJdm*RNkY%N<&|a;0Gw?H{81_wSo$&;lPneoP>kz#zDC({vzc>DHkVTbPSZu1T#_wYwwUtf&6~FQV(oVB+?mapGspD7mB3vX zD-e|B5tl>reDdT;(>T|!UpH+CD#0sb@LQIjPk!54pM7S3X}@;unwP&XU%upS6AD!H z>eZ{9pLXW;@Zm!<#;H@Mykl(Lx;1F2kWu=Y_(ZXQCfkY-9D+LBCl>_EmoLv&tXPq2 z2yG|@OXCve5J8r8nKf%x-e>C6so9-7cbfVjtaIni&HK!pInz9=-|$uj1WaC=$bz@a z7sADcX};5@O>6M)>jptp9{23oW7_)q`kDllzOaU5(WU|^DFsO zfCPibjvX`g2)J!QXj`~&p=l#nX9HD#{`~oT;m|ZiAi!cUHubzK<}8FY<38f(+&s}n1WiE4;4F@R`w+p1O$J?C446?@SRr1@TH(Q zWTEN?K@5+!=9I>5rTEH%K(QJ=J9P5o$wJQ}1cKOk>HUWe9m-=7+ug;200iP7Txr^o z`34XOxfDCIQglvW=Z0fIAk*eEm#q$7>$kL6ysQfAcjXb zNJk+ksI||0VnCp)5eOQJg+P>kzEpA%2x8|Y!N;{zT9$nmF&=e*#Rf$1#5fc%Lfk5q znX?Cp0f7RlBA?VvyD3fP24U_IJ?Yb;6e$}eFuPYoV)#;lZG>%JWBB6T;tN2y z>xMwo34$0Naf1}V+u0Xf7V0)^*w8c%*)H1fxm%I4G%7y6T7e*DULxjHblX*=H3wW4NG!8|l&IFupj#=@GvIrdX!KdN{_Z>yo zCgd8p@j(n<()JVrGx)$wVjOL3orh&rdDL8qU+n!uu_z#Q-Aq}20ijj)P)d?w$Bbn` z5WDv7n7BPIaT8YU?$wdt{|O}Y_DL|gU*92BEC}>Ixne538<&RkTPQfUgF79txYr+A zfuJZph~bNbf!r)T&zw;%V{vz=ERS-7Xh*PJQcmCJ7RkK{39U_d5K;m~R0M+9wMQ-i zv+M7R%=L)>6`o7MS>aQ06pg_7(p+^D?;~BuJ&&^gSRyZt8EzHKk2hbqmTdHR{Sz#P z$EtxR>pb39pT~M$EkTed(L|vHfJK#(ZW#HPPgXq?k&E{VVZ0000< KMNUMnLSTZqR~a4v literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/Date.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/Date.png new file mode 100644 index 0000000000000000000000000000000000000000..896fda742bbe6deadfd2431a4e01095f6e14de5a GIT binary patch literal 1269 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 O4TLncF?nZ<#s3Q;KgsF< literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ExpandableListView.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ExpandableListView.png new file mode 100644 index 0000000000000000000000000000000000000000..cc32b77e7d45fe701fb036a3f5a06f40f121988b GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!qd3@rBvWCwERg!@>EaktaqI0BLtX|3p2HhH zso$M+!}w&|1ZB+w!V?(`bQlgZ@o*p5z`(-|W*g{$*+Akj6OoccE5vIB^-O8-X8vg& Ww0CNu2oEp-7(8A5T-G@yGywo|G*k}& literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/LargeText.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/LargeText.png new file mode 100644 index 0000000000000000000000000000000000000000..d55d3ed7d4dc7ed3a6081bbd194efc6490d3f079 GIT binary patch literal 1277 zcmV*`@000EUNklV+ zHdS9=uSaWZtD2skR`>V!p7-wV?y7}_1wF9y@$sQ%W@c1#bF;QHH8tgU-`(Av8XFrk zdiQqDjweHx51p4m{7^d$;M{rNK8z0 z1%lMp)*9XQ^>tNJQewLwNTD(}H>Z-4k{qAMyKud~zu$buoZSTYH8nM^@1K^IrX9t1 zn4O)Swg(p%7wgG4H8rW6oE+OVyfhrltgNh0lL>{1x5(@9@$q^Au#=LKVm{Bz%nS?j z>gvj-#{%J%4Gj&S-erD%-anWtD=WrMdV0D#I5_yEGdw(O^BAWsBVjUF1c05LovEj% zCv|>)Zgej%FSVyzx@^hNFoGB1P12?lOu|V)L4ncf=;%-{FE2J7!j0TvR=9{cOzySp ztgWrN>Qz)!7(Eui3uazko_c(IbhXvh)n#<6s;XS|SXeyP3+DLvxVg?wa+9HO5iQ=H{B~YEJI8mJ`}_Oa zOM82Jbz-uH+~(21WG8rK_()(%Ta}fSI!t+uva&LxzrDTf4@|b+$jFGw$jERlE#!y> zCfU@|W09hPDHBViL-UI@%-7dfo7Y*T5yd)_C0PKEL=g*^)Q(FHGxwN!oD`TR8Dc^~CkYv6(NVYMBi9xI0qtK-u^g98`_Xbp~VkSH3TYK}Pqa$O3 zj^TG?bG$+}0L1J63zLSxx|W@t{k<@CM*Gi3QBjenE}1tLFcFzmStPH-NCV(iXUgt} zcpOe-T^m!Fv|X~paDy-~Fc7nBZncWCg_W(Ql=k-auVRB>^dLk7%I0=$R zd2TTAI_VT%1MqKeZ~nkUXsvpBdQ9&sSDBZj=VdEepQ9Jr$43g&dM=9;`dt2|Y+|9k z5|Gmg7_r}J-i3vQy0ddkKz;~-_V)Jl;VxUw>8Q;Q!Bco1&t-ecg^~vyB+ReK!^4BN zM+?bM{`Sn~|ALUs<>`N{7x%}&B+1BA?{Kv(vD3FN)c$56lvpJhXQNg^kg~eEYWseO zZYO~0Ah)--w(n-x$|O1tR;UGKA?{X+1u#QOqj2R6S)K2n{E{D+fGD{r*eQXicPU}` noi2s{^z&1K|IZ9y{+aR%qIsB;5)3EB00000NkvXXu0mjfzvzHV literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ListView.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ListView.png new file mode 100644 index 0000000000000000000000000000000000000000..cc32b77e7d45fe701fb036a3f5a06f40f121988b GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!qd3@rBvWCwERg!@>EaktaqI0BLtX|3p2HhH zso$M+!}w&|1ZB+w!V?(`bQlgZ@o*p5z`(-|W*g{$*+Akj6OoccE5vIB^-O8-X8vg& Ww0CNu2oEp-7(8A5T-G@yGywo|G*k}& literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/MediumText.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/MediumText.png new file mode 100644 index 0000000000000000000000000000000000000000..53a8c957d9f9038564a4b0aef8bc0b7243984e92 GIT binary patch literal 1245 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 S%_o!q00009LMn~Ns^=_$x2BUlARPft(H z^767-T3WKN`u`_fUS67&l@)tjy`G$$a25arR&r3}<>i?~B4NtP%0jnOpw-pY+3mhI zEk8Os%IN*?@9#}pTU+39>+9>y`T03#13+N?uc@iY3y845Qjf=NQ(j(f`uh6J;NYO? z?d>)B`T2IaUibI+W4-sw%ZsV5uD1ItG`qXIz2g=Z7TV>drKRTj`kFHW$o0UQnVI>e zM-voS>H!rM71{Ob2`Oa!E-o%?h-rOoZEdXgA0HpL`xO)vB=yj4Zf;CPMTK48)6>Hl z0pxOE-QM1s;^Ja&=oJ=NlarHP59;ypG4NQkv$J04X^0t>3#8G}(ZKa{b8}wr>*?u< zvjWJ~z-n)Aw_%_mm|9q1X_%&U+CGdX-d$jAZEZz*fA!4VK6`t6f!jPkKYQD(uC8)c z0J#`gx)P@lP!C5vmsEkZv$JF7=jTI1MGg-SysCMG5#@26gyn{ZFXl|1zK_j6VNxfEENo16B>Us6(H?(Xh>B(Mes2JF6- zm6b_X5D6@Rz{-fiM4_S|zplRdWg1xivIrHH#z9~K1Xd``0qKX|($bQ&E|b9WPnu6n zO~w8^1QtMG1#(yMG{Jp!b@lDQQboIhM*9p84`=k52rPiWN}`g1nwlD~ccq~C+FDy% z?Ru3ExMg8CLhIf>-7fRp3UpUmp`y@K+=PCn!3ZFW0!xLQK{pnsYwC4nG*f$LS*<%X(J3sM2( zcwlvQc6zl|8WzT((g)p-xW2xgv~FQx!RtXyPf!1{PBmk0I5;*o#u)(+Sm^^xLqiuT znjlw*q-*YeLd|ixeKq%$Dh$=Cs;X=SzI%Fvnr_Yc?(h>pjs%vwnir?}uQ0lM0rgP6 zAR6jv=%?y?|1ng8p(}$tRt6xjekA9nJkhFHpw7aBuRR1 z&r|2kkN5Su_a4_(pHDsEyys9(eLFv%a|!|AhbZ_L0D=V|Sb$&w2o``~0fGe}SO9_r z2o``~0SFc#SO9_r@Dqb|e0&^sc6P%4{(i-EkB*MQ%F0SuUS3XL+9>q zzcV*CXK#XFea`gsbUJ!^JFEe!EAFIyI09rIGWfS;|`-QDeuAPCm?sB{hM;o%`g zDtnboxn~Li!TR=K4Gatv=UTP#ZLBmrPY8nbEy2njl>VLZ znO7|Xf(0O0fM5X#7Jy&@f(0O00ACrbjg1Ze9pIn)s6B!O2o``~0fHr1z>f}=VHn1D tjNc9x!2d?D0KozfEI_aT1PdT1zW_)a&H(%0IJp1-002ovPDHLkV1lu}l4t+` literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/Password.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/Password.png new file mode 100644 index 0000000000000000000000000000000000000000..243abd20c61e7043c8481821766308fae2846d58 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!%{kbBtAQZ zpOAB6eQnWa)A#uIexJ)GPe0qd<-X~>B7u=ZOd*1yiB%z@0mKFpAU03{%&xJFxV`OX zX@mUtz-p*3SiCnhTsT;CZs+|S{_NZj)(b*>1@_Pnwfux7Q{CS%C%giN9fPNri#e` literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/PasswordNumeric.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/PasswordNumeric.png new file mode 100644 index 0000000000000000000000000000000000000000..54271df2960060e8e630e1f1913cee23430f9a38 GIT binary patch literal 1155 zcmV-}1bq96P)gu4*{{H@;PSyYT_{gUj1XiZT#>Nst zs-&dE&aQk4tcQmOTbF9;=;$ynFE0tNUtV6?5YX%O_4Sd}`TYEBN=r*^9o^mC=JoY8 z;q~k5Yg1lcZeLf30R&ct^u;PDD6o&3#e95x*qMP(fi*KT6U?9#3dzjR&j+C!)mqWg z(vto6^?s(BK}}9h+GF%f0U)q`u-@|Y^px+I?2v2`{#H}h!*ftAa^3bz;}Tky`- zG3n^ksqf3) zT$jB3C1+=6k@t%M1XhmdG9ArMTqCJE^L?RO)LWIVCe5l`VCha10D+aKfu+lGTx)^) zn8G`PQS0sPwY8};KNZ#N0!wRf0D+Zis%x>~iHsBntEp`T`m;S0_I0xM4fOSc$K*0h;!s0S)4+6ioLZx4dYjk2;b zd)nyR+8gkv0}I)q9YdW4Zf|dAbg2U;!Yo0D!;(KwuGA0RD7fF&GR+6eHun0s!9-SO5qt03fgc5Lf^}U;#ju`~x8^ Vi;c_;{eb`g002ovPDHLkV1kOFEdKxi literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/PersonName.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/PersonName.png new file mode 100644 index 0000000000000000000000000000000000000000..17bfa8e3b5bd3b572e57da20111fa16369d50b7f GIT binary patch literal 1865 zcmaKtc{Cg78ph+6ikwnZNs17=BeqdXt)*0T+|to%P!W}BO{bRHTO_vDZM8`y*Vcxp z+7l9{X^OGLQZ*zgC2B%dRgq{gqhcw!G1K02|GNKt=l#z2eCK=5^Ss~r-SI!;tq3{- z0ssJtKBqi?003m*(%KHVU%IAyS2_a#^2$D*?&nf||3t!iBEz)$^@+Z!#1iz2HE+Ti z7ftXqA{r3Tgj3ihJQ__{^R9H;(uWX-hCHhYl~@AW=sTi8KAO;LU}G~cOy9UzvrXd1 zFUOO0#GC7w>&|7V+?~}lSMs*&d>W_452u&&01nGF(#`Rw17SH?UckpF6%U|Xp0bAt zB1ajd4*UNH2E;5zTN{NpKAv9GiIq6^W471-nf_(tY$y^rViR<)7vQRJ=PAn8*0zpB z(wd$V2u|yW=earsMMX8t#N_1HUo`_DR@R1d%8G8Z3d_TfQeJ*shd(}E6sW(nv{YMI zs2=(O^KwcBzD3R|@TWtywd?x&`ZRlb6X?y&@7FdgEG)o>lYQw6SWsY~qCA+cwx>M2 z@rJ>$)pkxzO|^ff-+Akk3D6{sOeSBTg>~}ylO!@(xO3vf2?6_&z2J3?pI~k6Xf;%| z#{q*z_bR;MlHG(+VVxKTQnIxb9OLBR;J^H~Jz!^N=j!FlC(|XnE~4da@iKY$en3FL z)^qXlG^L@zoV!(=_CR==c1Ud4&tK{8I?Wc74rBm^}`}gZo#iBj~aeRFI=Ns%9 zqqs;UQASZwktd`zHr6*bS_rL~b8oFi%}q_4pcjII>Tq~`1a4w-GC}Zerk+Ci1&Z&I zea_51sPke;notKuIVQC$BqXF^zOkX4cmx409WVYqzxLbpQ$n2Y)wQ+L`D<~+a z<8aQ@yyY`vN^i!B78YtPq#<(FaX6(K*T(F36dEmgoylYhqh@DkdBX2sxnOrMeqLK! zXsxQM;$WUWjMi;#?yRWrU@p{(1!HDcF00Ky;PKVz8&kD>9yMQLziqB|Rmd^qC`SPf>Yei9+kQ>9>+(J)bMIt&MtMoR`z2~{ebhSub*wp&Jfk-1 z{;m}Q2FG${kUDCXxicNE!QUTp_;Y}0d{gqv6>jvB%@sEl*=RdEJ5u};P0?XGUdJua z*x1;9{mGn}g+-D;mp(Zq(Q(5#B)R*yvG(0d$3tE2{xo-;I_Y#9T!+iF`a2h@8XOGn zo;`1+#u8DJ;%JR%sI+;uZ? zF~26?ad2>u=V%$$F}l6F$O(Gc^fK|ygD*dM_5pyAM3kA^y0LzDaj%s1iyDs*;M^cM^%jolPr%jm3WIh~#Wtx+V?|^|3 zUx#xO2zJnLpJl{>d*lo>qF%Sv9YDYZMBZ4QuN>7N)H>(%N5@B=5xUfd1xe%vIcrWI zg?3SBWg>MWubC0p84Pw#jsoJtIdm((@Lpf=krrBlJoQ+EIi;!{^Jse9sk`?$_-jvt z-d*KC7C3@qo_N{1i@MX=yJfMKdfO`&=j(6Frqp6~w&s?4S|RZTN8=!i2N19Le4!TJ z*8bzD!!;9O8r@`gIibC`D^J6c`n!S*5ocvWV-os@cbGeje<>#9t_I8F;t!eKUWdwV&zwY0VPV^zu(>EMoXrTvGj7jNXn($*h7YgboY%VFzJw2RT&27Die~T zUqkn3A|(t=4ZcShX*F<_btybNe85uyF1@L0`@hK96Ya6+6k+3F<7cm2+-1WgDIx(r MUS~WTJy2Qy0ew=UrT_o{ literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/Phone.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/Phone.png new file mode 100644 index 0000000000000000000000000000000000000000..6777ef97a78e61c06de9fb8029cbf83d32be51ca GIT binary patch literal 1661 zcmZ{leKgx=8^>cONaBQ0jc8E6#7j#Qwe~1clM^I01ffx?=|(l%gqB8a6qB9e&#)Qd`WWdJcH0M(BriyQ=aHw(8D z4k=@pED=fIFp6;#kP47w2l7}=;0cG)dHvOejA4{khYB1@s{<{_f_eP==Xb-_=F*ps z4Bx9fa_@a{#E9^(q1kgUa+15&&oJ`?ApijILO+4rrkfKWh6M;hH-?LVAptH$3IQx} zg#R}2#X=c3nwq>E=X16< zBXZ2l%=}j?rl*fD>2$h~!BA=?)H71bOih(kRM@y4IyC9y?VV;Ldl)h|H}~z6qj)^c zKWCddoylS~E2}#?e9mM!Iyz1b3|y^!`C6@xRjbu8K|y(wQ&Z&==XXUX6ZpvbygZ}T zNHaLRx6|L#Q^OdA_OLEoh(77QZy%-VfE@4V7t7=EURfhFeSJaVs;UQHFc=X%xl1!M zGgAu-NuPcbzt_$#X5q<_b+|NRa8lw0+(y)IZEgMfh=1cK5(U_sap6(u+P7Nm8GcG^ ztgz7*jeaxdl$)D7h}_0E7gvhKuCDIx;d7}>=5{}F+y5?UOQ*qNP#SPZZMunYSy%9(bMBdn;%7|M-4ysj`cxc~dR!Jo_JK1>6KhlWt6T|4FS z;1zqwbxvS62H0IcJUmQF{(Ww4a!(!k{tr*iI`4~H=clKqTjF3ysF*&pM5WRS*(oYZDrR)Z<(WfQM)}8qx9BSiZ69`A1vW8d z2oJ~%&kU9q*VXOs$2S(k#hFgO!Ms^c3E=jdCB70-LVUb#PvzI z|NdxgZO!*ZfODCYL!(<_Yb}Vu*Nl_Uek+$fHiXQ`e2LldinUwN(3Xw23S3dbmM zSJ%;S#T%C$Ydbzzd!A_-Gc&sx{3mG4I*ocPJNw={ryF6lHXQ4v47)No49 zX0(~J4DBByqZB{CegEe*w4O5LpXkryjvuz#ST6;aeJc-%v3~HbEJ@EroBIj)jOG0N z{M1oOBStGMI|c>vOpqnR5C40PauckQAo?g&D$&>rcp5EzEHi&&=}sF@Oml#%_-RGH zIktHvsW=))6AD4!Cs&@{jjOkdtcR?dfkSjdsp~?{Q}_h8#2s1R(sHQP6qtW>ZrpB% z#~eMXcX(`Apzok9bWeR5mR>T^kG?nhUvU5Xkc`MN_+{c1*F{kNoBmq?kpshs4Fo#p E9}0y5Q~&?~ literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/PlainText.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/PlainText.png new file mode 100644 index 0000000000000000000000000000000000000000..326057cefa4b4cbc4734c24cdd76530671aa51db GIT binary patch literal 1104 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!%{bVAWUc!W8wLgzaZeY=kcwMx@A_-3b(A^w zF?f=Sr>EGYDLN`A-6pA6dv2NtWQ0x1(NVb>apI7Z=cG3iRir&PP1aG-Rc6|~`vQgxAADVYh%zW_U}!kNx1)tSU2=jmKw29PD8aNS zY^bZOtTc>{j!sKUJI2GqGvnva%FWxiPY+3W`~LmxmoGD`|9<+kY3H6jHP<)u^YNXz zb7#(8zw`cIVi+{#B37?ny==pV3+w?UtJkbC5f>NdWX?`ZJZNHKawK;4v}tK->gvw( ztE;NAR;^wQWE2%0Qs)zh*srUn_iMt66)OyqlatFzu3o;JY-D8g=HsG8N}oS`5Ri(9 zjEwx29UMIQ*mdwC(oYU`uEqW=P!5e-MbfP{Be1HE^h`+ ziHP&(&#PHm-)?g*FE5Yzf9_l#|J<85Z(cZX$+oP#Jo(rA_wRjUW9PmN{}3A=fBZ{$ zXz0y-mo8n}v2XQiZRts`@-s6Z2D5YMB=`08`MA5c=N>^o)eeyP6$t z?z6;R%~`opvp(kGvvr{wY(PhTyzCWvl{vxd$FghJ!lY$#b8{CqPJN-9SX;Z-cKP1D zcjcv}q&6Mr;^J~zAMBBNW%;ovF^7bs7WVerUq|Ngp6cCmC+Uwnvv+oo)$%1vj>uo$ z+w_jJ;eeM%wy$1@(AIvoXnb&}g_*DB8^y85OnZ@5`4jro&Dz(MyA*5Yn69ixR{}) zuYca}>YeYaT*_~k9b!5iy7qO=+ECa0(--${neczsJ-=&LuKf7?Mdq*0)2C1W&B)rZ z$XURli+$R%Xers9wax3UUb}Y7tKzM0iRkl-(HV=Fz4JxCwq1P7*mLi|n*B!v+!9T! ztfb24GWpM5cKF(Mh9wyZmR#(;Ehe_VU)WE*VEbiT;P(KQ zO<22j?Z?}UAFivOk^|;BXy)ra!1Q4)bGO^#i~n4`tu`<`SgnZ2R-la9VE=?&PF~QdYuZnscBXh-7;jwB6*ahVHESy^vDdmrf|LOxk=qj zUdmfzp^P%@$-HGX*{*7A7BUvI`=jUnb??*DKcDAw&i9=2eLLrTC@0-fdaF0C27y3& zXjkMZ5J&?C@NAu*0K9;$=>dU$8bKqSJ+BSP-u`ya2yfOra+GdKu|%&!(PfwDDBV~Y=ntfd1^#A)b&m-!Z-WexyY>j#ZLyzsj&{ynANfAk}d@utur zdP+9^kymU7o?~d++`Xz^R7po(+_F&Q`9CAQN={CmvVFeSH}Hn~dZj`p@YWQKa&yR9 zX;h4tSSc5^=o$k>k(ewsdZjd%m45Ef=Q|2=@Udxi2bXXD32C zZtqae?hg|h!Em8kHc$aSvoFia<1rAzhhbD}UaC#ZK!ra~f0JXbxkD7}mjJ3oHT1QF z7^)mQ?`V}i+z=fmlV6(|!$eJrIF2trb{BGsoZ^N)#Zd+hMSeQDSa*&cgP8w3@?x{8 zHo33)RhHHC_Rd0w{pwk9JB`YJ;lXesnycTpB!#x6ZE!i;V;9_AAQiG>&6E0ggW)gX z=UBJ9^7mKF%_i%a4vDG=;*+%UFAg_(KdDspr%t{ef_%|JkG}G}q zs%rx8j4nOELPPu}pQN0zBHY_U5VbBmtt!4URJ}t`6^L3SKEJu@%{_G1rKCRjV0dLu zgoyZo$6(;!v4}opr#hh?MFn_4t!=~Akt2(UbZUE3g4#(cw$O1QX4~TBE=}UYl^at}H&^dv$IaK`KVmC!&h3*_ux$s!#CyHCnkiMy&$`T&l9#QTo zZvsk~w9nrdr4bY+Y}^r5nc{l~McZV|dq{1263nwM-un{BWGn+@ktjL1o8dY7>2UAZ@+;<7#a45EPfKyh2d$8L$S4k60y#o zm`(&oY~x*CrZOiIHe3kJ!j(`Ixr_#qGJF)ASsqh3Wf_N@?|pbWz1&*ips&fik>Vmf zJ3dgsOX_8DjH~zUG(54wx1O68Aq@;LFE(c zY-g5^pyuM_LANrPevcrLs$;>wSFts1pc5A0ceSOI&$+HNW@`Tauq)UY1C$5xtGPBA zW6`yhW8ir4p?pQMPGf3>9v70e^n(tGpliA_C-R3WP58e0j#qrG#)Zo&Kha zyrM$6W2{0dnQP3=^~h0UcMdQPM%>R`dHEc-*A||XCJX9e^T)j@%p8Jo1>Bl2l+&NV z>GvLJ9!^AXR~{zT_qwQ+(oq!>(1ZZC;@6c;Jx;Dabl)9$e_cNnmcwL!RdE{K&XiRgM;T)XlIT!= z{$2jYCxZc9nCnWU*<>p_KBOj=6?A_gA^l|gbVq=`^`T9dD@ujMer-TJYq=&pjh@n0 zHx4^)Hxx?8dI&mZr#P(gZ6~sg#v6JrDN5_VIMjwzLN@Ncg^5?y+dqw&8G|J6z7-Ap zA{|P0H9fv75237&ylI5(%^lqp z-`Fw*2BhIf`OmdHg1{Rvj>Y&<7Nl{!LMq)umZS ZsoftR_qR9JC=<{;5Zc8ZS$+gZ{s)uyW`h6# literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ProgressBarHorizontal.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ProgressBarHorizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..68c9e2661dc8ea8bff94e110569c407a5488e9f3 GIT binary patch literal 820 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 literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ProgressBarNormal.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ProgressBarNormal.png new file mode 100644 index 0000000000000000000000000000000000000000..194aa8a2d074a9ddfc53b1aaf719544a5c372c8e GIT binary patch literal 1284 zcmV+f1^fDmP)f)C^sjV zO#%6^j*gCcR}q4_K)KvtzQ4c!1f%ir@X&`7IygA!-2#YpkPwa{Uy-MZ24sQoD*XjU zgWn~;Ai{@y!xtxU1Hl3l90{No7Z?5C6$!|PG6ZPsX9Epji^ZZ3Egz80Pft%z$wJQM zgcA#9XkX+UlJxQM@vo}{2mui1aSXEq8gh*QMI)XWJ`Nz)TL z&d0~c9*R111T>dkR`+Ope0=m(O>htwwV}uFLgN`I>+Xu5EryGmdOA? zTW|!Z^zib_K2QXR?wZgG`3^2Lyeyzv!poju!pgdc#xW!cTu6BN?x`ib>`7*N#5#z) z#P>-K2-Or`8Z?fC8E_Egp3sX1RD1sMFFyoGGmp`L077FW@pFwsmG?*l;yUM*5e3}AeEYn zI9?h->mIg4=b|?Tq-1Sfgn(9JsBv7Ba-awjxhLzbXXPRb2$dFUoJi)N1xFgQn97Zb zYq^L7h)ROQ@sWhdH5LxQ#x%I27En>*Eg(UfyYvGGmjFis4xu*L0xCb$EF?X6G6y6% zhdg5e@pH_w;HWi!6(lE2G<}92yvGp^)qD2ABR$(BuK#V zMYYkk9A+z_{+8bp6br@TX5VA!s} uJoJIzxkmf1DH@;#r~zt#8lVPfYsU|&^C`D{bsx?E00009IZa49LUtHH6h>D^Z30Wl|e9oK` z_g&XXmSu82pT+Y$c|M=p2mr=;4t#1v6$HT$QB_sT1X|hF0%`*of+&hUd`AR;?@@0G zqu`{AF0&HwCpu!UdTq2WQKV@)5~$4FL$Fu9=^w}ON1BwG9#kA9zz_A;>vf)hj`%G> z7>3IPM{9r|1IV!wa7nwZjsDV}LOqjiEi#ux0LhUy&GUT7KNyR1ptt2754SrM4ajN+3}6n#{I=HCYHOG1HLkbq)+YF_kNy#R1NbKBYD!N%mjD0&07*qoM6N<$ Ef)WF}*#H0l literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/QuickContactBadge.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/QuickContactBadge.png new file mode 100644 index 0000000000000000000000000000000000000000..eacbb59226069901465dfc6694483a181912c0ed GIT binary patch literal 1045 zcmV+w1nT>VP)?djNVw+qH@w_B|5`dW0a@?5q~Hm{y* z@QYknU(?sMF&(2kXDZKI*GJ~Hx1*k;(QfOxJfk`rGCZR?P^v;9b1J&;o!Y2i_Zuun zP{}qc`p-KCI+(MJ@tnz?>tH^D>zECmigEJ#X0v&JR-mDc_M8|q4B{=i-|v^x>9kxf zm*sZ5y~h21e|=uB*X4XZr;cXu)X$BKSu#4sI3ABL10Rpa$9O)Ut7{l=2>;=!bn;Fc zLJ_R6<1mJXVYj^@pP_Sb8gmdszla- zVG;?U>P|<=EsGso$C~;CEGI_P?L0=@`!OC3v~xL-ulkDu~wx)B`n;l2n#NRqL&t#o=*nxvagrS$Y9L29R^#K5>*W{ z5^d=Sb~`d0_wWo2mwj(0_O|mt_AX4b4jsXFunUZo199Qa@AbdgD=)X4_PpgnFb3Gg z&^1eSFbC*)q9&#t#Fh#z#a!8ZfEKM7(aw>Hw3rapQN6~;i+&{sM#FOVy$L?-yA%ABly{!>!XPDts!+z&|o zf7XCs4R&YVyS3rHd68A;tdZ3|I#RHC5-d+vFZrw!(8XG(m#t_-RYlt?+ueR3gHA=2 z{zml8oB%WF1UjrzIg&#?k2jgTd;tTUDoW|*j?859QD!elqLvXhXpui3&_X3CN@_Uwfa zgCS%rAxuVIOJwWQd*1V%@5gt}U4GvCJkL4zKF?5wdR(W0rvU%}*A0DLqvKw4obqfe z$JO*ItOEex(7K@uH+eM4$aOK`HRtR0ivO(cX{=mj^ zzEYtQEM#wI*$K2aIGC;Kif2P?#&CQJ#9T+~B6V5daXqTA9(%LUX5CFp37&+><>u9$e&e=xsDA?pG%X4m>*x zCWU$?^~zjXvE37kjmHzKV%Qq_f~<WPN zz{FpUf?`E`C zYNThHdDrDu^4AL_!R4-Re6b173Qrj;-c?aHF8g&2f|;!V2^G;>c1)&WHyy5}vUm3c zD#=UG3*7Gp^L)s0H!^S)g4B=)1XhQJ&^gLb=(qIL?35IQrlux2aK}BTnm`bJRbEbI z)H#mShbE)mejFMbk~WC3c)7Fe<`1rU-pyQff$tH%F_aLIVB70PCwkBWbvqO`P*Lh6 zJe13-IW0&sJ&vzR5>mTg$|f>=(|c*4`YfPZt%lA8*T50;S5+7DqndR95!% z(~%Q=!JG7(izn}veoJ2wF>=gSS#%Sh-`EVn@aNUR6F$-rg}}_&lK?RtAD9B9l;?%WF)xiP5y!= z|Ih8V*`zg;PQRm)ta-IA^%)+&38Xe!w>|8N52`GRt~eZmALhrNR@BuU&Z)gRx8AN9 zrFPzVs3nyB20_ayZ75@Zl&reKn$2%v;B6QC?~G`jR&F;6pP{&@cuhqfFYqEfeRT9< zI1o46b^^`%vjzhM0+&}O-jcoMuVd;xFI8Y_ViSa65(X@RMy95E-HBl0VqYd6`rL11 zWQ2jRaufVA*BOl*=GJzS7tn=m)wxb6s{1S_bt>FeS!-{Hy9f)tU07Pe|2{7uK$;l9 zD#zl26w7y80=Aup_%;7NTplViOdouZyN;yrPZr1?ZH`q~d?;^nr>Qr3&UK`{QRCVk z-&LiB?oz%AO%uloZ*Xz&F!^n~q3G^SZKZ^S5+g!*OcCC3$c3VtJvxH)AonZhj`0Pv zxw)-ues9{5qSf%qgX zIh@1ZZ`bsvaDkv^eYUKdp@@jirGfg9;oPPVnFERBZug4k2#9y0Bu)CV6 zUezh%H7@*aGcB}9Iqo{+Y*Ry>_!5ujtb?ul_uuE9C&*yIrL%ECd-J0?TTQR~dgNN( zvpD)9@v;5l3U2U;^JayKgp9qf`Sj5*LO91 z>1jRD5@@CqZYORhD2~&Gth7V)^<%bM>zN=z*B0gpwqrK!Tu(U?t7m6zGP~l$1#oK+o;&O6>5Yo){Pb1Q$xZaR*9=x@j%zD z)U_vK;Rxx&E2UTr3C-#|#Nsx@x`)WWJX&LSLpTt*71`L(U=E1FJwGibCT8qvn3kvJ z-Bl{A?dS#&G3VyyF0YayUdspz17sG2tj~t`JgFVQ*(s#1y8>p~vX;BEAui>>+g#+j z0zdy;PRK@0N2=?+4o)wi^LYLEb6x@7zcQL_Puim|mmLWUb14o>MhRtuj5TB_xhVcW z$`;6NnIG0>Md%=2mhI>D`PDSz@jrqjb&O?x;G80fcT3oD>$C7=|FtQ#Od(_->aDrY z(ZS=U-}a2j8o~gr$v-dF*c)LWWZby-ZIgw%mf)@44f-bDJ2$h;QuCS_P)$|dhe+XZJeq)7dexe@q^!8>~KM4B!D>C`)IR?9- zA}p9fuVUC>+Dzs`(orrCe`INM$xWj}6KuS?GH2gN@9+HCa>O3hiB|6F!U%onkWR2m z`Y^G-1%9S1`HJ$e0L||fVUi%~x6zJ%Kkd@&Nllq+PanXzYOH&Vk7c+14MqgS zxDYs#0ay>&!2TD(<;)PBh#c*+q@6XI%!d0^y{&(c>vdfua)mqpzgu?6%EIn&h@Aw$^+1oDWN#;65idiIr_JFKn`Wv&Jlwp~0H!2;qc{}0} zx%nxFX~A_ij>l%hwRJt61C;^B8A>uQg?ddYi*e#ic>V-ei)(*4zW8)^Ex6j*!31lni~|MUH-p*HO%p&APYZ|o6#FjDOrT*u_UBQb&*HHN zMJO2+<+~7NG@jXYF{(7FKeMBJS6L*S&pKE;Khp7^C$fUcB^6CmB0r&*dG2&RveV(= zAam0J4@&%OSXoM0It;@Eq0kOnPAm>rT?%#l^n@qY58DZSCxe$WQ=LVM^aIRx=Po~5 zxI`_v(2TC^FT5%lhirf;z+hiW8Apfv6}DP&pvf$LJym*96fmJ)kx+bpBfoMg&ntk_ znFVBV$Ae~A_u!u8|q%Yr(nwhCh!Q*!i6UGyu|RdRK$QFj)DvFgp6&mw}w zgG_Hxh&bq15CF4ve6RdIv1yZB=banM=C@R-2T5(MgrcYRpKX>dort7Y|1lG9h+uAt zPLZo${LrI=AuScU)j*Rf7l8Q99Q zZkUEbIQB7zs{CQTbg#;&kKGM%U%e{%e&rH)f50nFfq*&Scfki+Sur-M+p~-j%U`n< zX%oyf!@P5*;<`wXw6ez3UhJuIjj>uXKJxQrkwKq8x(qkvUW+Kaw>&(%-LZnEBERhb zW#O0|mx+kv{~~hMVZ#AxR=XXcr6pk_ksw-KU4`52#=U#@P+wn<&dyFee*74IzaR7S^MW}Z8X7`J zM~9H1?8wN7&`mTY+J9a2;Mv3ze*nb_V9x2YQB~J~0pA3C3(7BHaUEl!HH-wem}Aay zZNNK$s@i&?Q*x~g6M?|9-6-C~kIN5US62t8(LtXwmQKSX` zbFH_lOKfj%$IQ%3MEL<_sYBi7=4LUDH)+LxUF6^a#wYwD3|%d|j*-b( zcth&~91aC2*2!g9CKk~!HitXI(}FqX9M>pAS?ah0Gq_w@27>~kt(_=7;f%jretfId ziX|nCMoZM~>gp1Igm~^mTJk?)05Rub*y7IPR>0#?fY3j;3ft5Qn#V&ZbBrPDRx5rf zEW=N^MS?lz9M>pAS?YM6g2;5yjMB0)krSy6AjW;>0{rzIPdIIDZQ>6RkDN$r z{_7&!eKyhAWraRFM}#f!Q}A$SsddjF>$U}_{xsv~!g8cm-^cGweS$gW+>go{WhhG> z>e2?o8Ex9^-KvK&CY($pV;Od6i#C~6KmOi_8o7ys8%`Zn%(g zp$Bi}+i=Ke70fZ`xJH>T^%sQ>b(vuEq&DF5L!Xn22QHUt0P=V|q9(%PTC9mV1Z}g< zg4f9ZumQBD906}sR49q_4fujvI|suM^O|q;ML210#fPO1yi;JuA%hjVUCcSIQRbxC zB6O%r8)6qyY+ku`9hFs8qGGK^g_cD&o6YvWN8M<7mUfs5ix65|iung( zDW6+3i)?BUi**)@MU`Y)tNw=#peZHM(r0C(_tB6j3^Mf8kIv!y^Tl{C<0jrM?8X~L z>%IV@3}vZ9UD}{6+O)d{#I*sY6}bpe@>Tjd+lesYhUPD&~0*V?6JL zSVK{Zc$%rLtyL{Y(W3t`0nlLu4B>)jn-9N&0GgehO=)`X*(wP6G3Xl9+zp>9_kkMVZ9J*kiJTJ%4nLSk=U zpC}{_?J6W@-m>6CssV53Ht!1_%A80w3Y`}f5*po#;j3 zjC0(1j-NIN**#YocjZ+^GWs9&WvbIX2Co95otLSZw^~JLI+j|9l(fHbL|-eIW6phg zwm``2zD(uCEN!w&QSHlA<`BtznW{DaqiW~4T3iC7sR+aV>Ame7eWN&6-GUzsCHOi$ zUogj<{y(bDRbEv-rF|ACt7xf5+S)mPWu z6(^~%n(FHsG}BbiaKHkc%jMd)DV=LtYpPGQ|1o>kb3V_Y9K&;-J?mk`dcgZcFrWBv z&RqQbvmWYd^;r)qzT3}YIOZJJlI2-Xy!?;Z!@}A5=N}ekDPZE=8JUj^Imb1vJ}hKD zu=8OaKlJX0d0eB679SQS%74|KHuLVxAD9%p^|U#Zluw(<$^5igZU5!}TtSiqkR%Bp zNfJPkB!DDIk^qt<0VGKRNRkAQBuNrLlGLUD06b{vtzv8pT>t<807*qoM6N<$f`&V{ AeEPh%g}`x)9wcA)-!%(R&Qh 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 MUGG7$s&&wR14x|I=l}o! literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/SeekBar.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/SeekBar.png new file mode 100644 index 0000000000000000000000000000000000000000..87d9b93273f1e576d769d781f5626711ea43f120 GIT binary patch literal 1634 zcmV-o2A%ndP)mim4JkxtY8tf8-$RMkYLlm3YI{Hs-mQk5Jfx|6)b=am5N~7mQ*Amp`nxo zkkF!{oe4`C*=|f+}5W6G+OX?e_SS1x)(rmimxw&1n`OUITCW`jW zTHd}`&e`duE&KRJ);?JDjc4BRjW)EU4}BSfu^3a}k_0TNXP_dCBec6$s@d{Z)n<}K zJF}9vkFIC!-K!Zp`8$?=fMvY4^r0_fFcxDnc11VHF=tWGk_0TNU04B(^@3wliK3Tt zI@w29wXU|9i#gd*6tpA(OKK|&WR(Lr*y-y(sCL?i4QSzm!b3^Gl6DnbAn8pWiO|en zS*7>Im>VDP1)sz$Nx+hJh=ZK$)RFuqpEQ^-aPROCAMgdA91%+ru%y;dkR&@t7uc~I z-&a`ulZeL`d@3k3lmslPDNdVnfRl4p{?UbWC=6dXr-g6$C`kfV#03Ue!EoyQ^W|J< zVAV8y!Z&;rvLpd3;vzr9kCItk`6t-J1uT5RH+)nsOA@dmE-EMR)0i_WxvmrKW3Ih3 zpSI%-<9VzH33z);4h>D%JM8WZDRRswL#~QGD=DUOkr-SEqH@?w^w!v0f8P7+2 z)o!6AU`058MK#c%yMu&!N2ZeZg;guGXiJ}3sNzulOurNdlIDC16RCfEDhL zkgK@3-9{myBneod1{PI4m%2#09}SRnKdPj=B=sLy)Mt9w?DUd)B`$6Q!FIgzlZE+*U+ zSHgzf71guT343`qZm-YXwl@R93LCw0%O)1r?D~p;B@?g&tX_fZyuacaa^XdJnG-!K zFY~3!%SZ|dm2}5GagD3Bj{UM}FU_R_CEs_mUKa5CUIqLl0ZT&73n>2Fs)V*gGQQ~| z3Q53{JhfgzaVkV*l20|uBkK|hNx+i+y~^TBt+T7T=1Y zE?~vnMZroEu%vdOMWUNk4&fpBq<$vi#~V2-!a(L!l3fz8q(I@}-IC)azu7(P$B_rd zWNhYOE`@=TfF%Wn7D;b*>NsA&iSy5vbB!zQGhKy$jKQH$&RH=wb1;`+B?(wkVAWef zL=JFr>Kw>$eLOiQ{{q%bTacnHedx;=jK!GE5Kyd=1T3j%;NrA7aN!1KevC{QM`Hf# zwY;}lqADommf7jUc;+47XhU22(3de7i!lW%Nx+i&1}+YAQaK@Ct$RO8ju#wT$yL2_ z%hZSmN*K?);~Q;gOCS0=T2V;?mNZBa#x?U?K!~FVToS>}Hl8{DJH9pZQ_4|El7JPO g)z@w&NzzXJ4PgoXZ#jQC1ONa407*qoM6N<$f)vLR`v3p{ literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/SmallButton.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/SmallButton.png new file mode 100644 index 0000000000000000000000000000000000000000..22e9bf7f78af91ef97aa3d4857ab001012fe0d4c GIT binary patch literal 1071 zcmV+~1kn45P)$h z++3NMnE3Cw{r&wqr>d%|Pusp7E>>uMe!fmLB_%~FD=VeFyXzEy4 zSom;7%*@Pa-`d*Rr*l9*#!XI6>ifF}x3siWC)wNE>)5}su_435!!kcVudgdADs+5D zM~7r&WLP;Gk(!z++uPeRHZ~@4adE%(6%-WcM(O?DxEk#55gHn*`QH_|fWRbUV`Fut zeKp?TBFf9lWn^SThK7bDD=W*&+vcRvH#j&bX=!QNR$E(Zz0d0EszgRcYF@|Hft8Cd zF)=Yw$98vj|9o5oPTGKFXJ_ll`nr@2Ze3m7Z|$e2rxFnnp?!^wjUQG&+L6CaTXl7{ zgoTAElJ{7o8H`1x;tE_-H{yi6FHyWkyA!Tcjz-<-Yx4sut%Sjc8G^A~q-Z|_4NQh*cg`1rV%f5pYcQdCr=;aXhpn4O)~T#S=2`8Zg(2L}h% z7nq!!tW^tYYlJIsv3mn)Zf@?&IvAT*FmY>YYJA?HxB?gTs{KUlfgK-XP_hLR*Hjfw zzhSs0Etp&1=H_O{e$=O?t_>z`W@e_2wcmW;bI^_w?Z@My=ub#Uu&M)GrkFUe)6>(n z9fkhc*;!C=4I*-SLqmhKwY5oJUY_-%k@wgiy`f=qK}BFTFB4HwQCiP>-&qB-T4-r$ zk?`+_P5l4NRXN;f#X#*K!nss+HHO4!}q{U<-lAm=VGFYAp4|B2u~5e(uIm$<|w zE^&!VT;dX!xWpwcafwS@;u4oZT;dX!5p3N3{e9y35pW6!7thIBTwIi+qa(Sxx+0=O zzy&^V3h23Fc*5J()|T}2^hjS{p9~BPFl+%A_-t-&2KGcevwHEY!pFx)d3bnW*a9x_ p@wICC6jDComAE{JOI+6+zW_x`9;67#Fn9m}002ovPDHLkV1j;Z7l8l( literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/SmallText.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/SmallText.png new file mode 100644 index 0000000000000000000000000000000000000000..665dd3cc764e70bee3bf5a674e172e929f6de003 GIT binary patch literal 783 zcmV+q1MvKbP)lMCCncj97tCZbtS+b9v=8AHX4nw=P-YLea&-^kB`3$7V}tladE->D~8$H z+G1y^RFXZY)9Fy9QlY!MJN~`9yUXkI`8>H?E~&;aoK7coyIrbQt7NfQ#^!>-APdW= zA={IC=yW=+UqvuD7*4a<%y05{CSWjjc6R9O?2O9gGI=~6sqVxfm^(c^rM0y+_Qm6I zX`fcBMT?7zT$ji`GJ}_9x7&Gbu~?iP28KgKfL^bcH=lMj1WY2481oMX12P(oJeN!+ zKV=tw)Ss~Z{e9Bw^&Hfw;o4#?lvELn&~0omnsWSxUk*mD#-RJt!~&oQ{wsz(OeT|Z z7-8*pn=|9{`6MV&{9lFX_xqpbaHZs6YPA}-gU!uN3WviyRD&6{o0}W1B|IeRNiCS? z=V$4Kt*orDs-m}HD1w2yAgJ5h+o?dJ524uAgo(vsQya1(81#$D2PX}Rgf)|K+wJDHlg$?Azz@lu83s+xX0u7^g|uTK;MUjI*^kCH z91c~55kaFS4-XG1m&;Kg5Rg7{N7v3I04PQ%mMC^HmX?;dpNw{HHPtMW$&kTdkj`^B z9CUek$%262XsmyvW(Wi-_Vo1hS3V+9GxzuR+*s%TH0LmLm^q9h`v5e!JD$cs(cS<6 N002ovPDHLkV1nAxcHjU2 literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/Switch.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/Switch.png new file mode 100644 index 0000000000000000000000000000000000000000..85c3be134fa90a711d1ee2dea92d129e39e8b85e GIT binary patch literal 741 zcmV-G($r{d%d2t+iht!o6I$+1!_WU8lm<3 zeJK`;lFQ{Jo6SlllX>f)2B<}$P*AlYAWhI(t(GJb2}!5Zl1inRYfuZ+1fv@PX@Z7g z#$qu7GX*svG(saZLL)RnBQ!#DBQ#8^v63S+LemZnxUdJc+wJ6Xxu~4aXIU&3Y8%De zzgn%z>2!LS!{Ok#KcTr08b+_xYNc@P_j{R4CMwJ2Qhf#lwOZ}l&){o(4=|_Gsbz2t zr~L`dh0t(4AehZ&KW>=-VvIQ05H-V@&*v}w4!ivc&1KN?`TT99xi>HCcDt(2U@#yw zLUR@a5sqyh-C8kU!)=w&2+dJ&y95C99L$`}W~2HUqaL9Vnyp|}2>_K!#a2H94i*tu zQJQ1Ep56Y0=2B?oa`|CDj6~=M6kp-o3lRi29kB0Zwe>-0g!b#;@Eo_y|M-tDgvKXq360PQjnD{<&!1dxh2QU2wILu)&~O+Y3Wdbu@rc*!6`#-d)ViAWNOC?1I9fxLJi5f2j4xqYVQ zwC6ZKe#eh{-R}9;#+jYno&E0Y%q+jG0N;XN0R;iE0kHx817aT^AO8-qGcz+*LPA2= z?QdXUU_jRH?(Tk9@A&vw^s=+F<$HR1+KP&bvU+=a|2(nV+uK%seZ8Zlr>BcSB_$M>FIG0xxBn=MMp#Ozr{QO4l?&Bv- ziPdk##KeTiTU%Q_ZP?%6m;Qo+g0R;9$ZoZXIot>}r#U7fVjmtJtd^D*xo+sw;^X73 zv9U2*=j!T8;vRB-H&IbhA!DYdrbI{QFq@KldwVPEBqb$zZnmSNL-fbT$8Fid!h*=? z^K19w;-bh+nH~n?%mY-EmzT?!>+9>th%GBCv%P3zW5ZfmS+Vl+@@%pcBuHd+b#=B3 zU1X)DrSiSHx+*bI3Fdd2Nn%Y+jr8GRZqLWl*)Rw25wYRe%{+WpR#rO3&dtr)hhaJj zHpIllSo!(+k%a=yxSgGy4*C84y=*cqEzR>ZiIJ2*BuKpE;^HE#7z@_d*QKwyx!ED# z+1U|!b#=8v?nSI0yYWiMavv@_%)wj=_Jyp!zdtf!i;Igz=jP_-OLZm@HBI7Hp_u|#a=IB{n&kYc4>%Q8di1llCN=l0D z1bDR8(prTqEiKueY}WaoCYIBJ1V8BN>XLb5V`Jqik)8b#3vzRFWg}D!YzBQ^UEvVx z*Y1Xf1{s5`iHV6;dwaXx2g$6jF&>g5CRVd3u`?X#2@~UHXJ_Si(?~zWj*gCs4jCGP zxx!xXBG#|nR3>^O%y>5@vA4Hpjf{*qLO@nlmMqTm z6mY$~UQ$Y|SFNg`PGl}Ng|4~QN5uNETWem{B4N6drg|zd9*6momlq50w*>TfZqCoo z%jt5m7(zV`%mLHRb5cH TV2i3v00000NkvXXu0mjf_RdRU literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/Time.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/Time.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c71092731c958fb41e2eed0ea2f4a277b85b72 GIT binary patch literal 1521 zcmZXUeKgYx7{`AqGD|d>EH68G>1Aqp=jO0P45LJ*vXV>WWyzT3iks1Ol{&huOnEIc z^D-mDm|ENtH)FB9jvI-EledXY_jgbC{&CNJ{&>#wJ+a$U07_)i(v_3e^`+5 zK)ZVmc25w=T+1@|5G=@K+7zqP@!HQqtHUeD-QwP@fp#xghjH%I{Q5#t%hVE|5$8Ss zjkLW$<4(z|D-0e0 zK!r3+kEc+kS7b8LTq})a(T0iS@2>eVSIXSSD3k(>IvuoMkDby0?dY35S zQ(&UyrlzJ_`O_mjGGRDvt4395xKqjoNn2Zcbol}L{O<@TKsi*=-+vmd)x)qTWwB5J zfq|3~_Hj2i#kQG=3FEr%iHRp@=gPfLv#^uPQgM-(!C-)?r6sF+Jn%X$I6{49b=7X1 zN1{Gu($?zg>ReWO1UyJ&bo9aT!L~Lk`Of6zWMpn`dsI{ubyW8GbJu)rUENO4sJkiO zHX6GNoRYfj4j kw?-SD!aZ@yYaQEud4;^<1uEwXxBjoS67fvjlhhj-gZ2_;|3b zmDPmfPpemEB}zc>)1yBKdQ<)@GGw$^{i0G6Br44QbNuB^f??>j z*fs<#+~42-(+!1);nNZkYB5;Gc3jgatf?`#B3y(OI3_PxzL=P9;G6@f+O_Q7qq-S$ zi=TRo(2{ULWkH47qr9Q9hwkq~(A1h##{*a#{U#(eRml2<^ zjrEuN5V`R6XFE=wIWu#fYkdqWvf2MmJXg)UY%010c28qll|^&CMfvQAfQ9EeFzP`% zL+}QEqdPGVADT>~q$@@Tr>&;Fa5z^r&m)zs*A*TORqAR(sV7*Kl`S@kQ_S=qLwz@6 z@b)`tmm5hMBPhyNb8WJTnRds4p;KAqqH7!SMji3MfbRZ^vi&1NT%y8}#bOmD4-O7C zOV_r5g)kaUIU2WDYt92dEgT)4YmcZ!df+?qpc&<}l|Bng?}dx_Tvb5u=4bW|s3asL zMEBKH8r#pWeA(=58mFrh{(*?9*ry3cR_LjDN*(GGhb5ANzJlZjg5Gz1r5q+guxa0w z;D`}7H$u!=*O<*`p+Y8GSy8x)sD+}_>GF~zMn*=2r_DAhetU}G;@>obl>|-4f+KXg zW`6Z^zubOrK=YCBaepDSbHXY<%jk4`D4fUT>L4z)b5x;)m~<2K_d^KKECzRMJ2s@S zVVe{l&d$zu)>$TMv5LJrtBS#=RyM21%7Xg%t{lkq3&fc^B&~Gu7;kMeikc3g_+F#2 zoi;0fo;DbKLV5_L!w^+DYqEXSS-4OkEzE?5wS=-54`4H1ugGMVRLGVl86Z zRT$Lr+TPrk7akoLo^9&qXu>f{5Kp4^Go>=un9Q-#uqnu?$0lC1BKjMMF+~3XBww0E zzaF-G_bt&E1O5G+fZ0!%{L6-F^r^}xFaovh&q;YI^*iEeLLmt!;*QxnXx&VZ`L-ZT zhwwP%`;4y0uqQyrCA4!dJ{TH)7QXh-2Kowk8#6i@F)~YJ_}&pVkZqi68^(JfioUBArut%gxB%Hb)g^vCE(fq3r$U}Z%SfU V4}w!vv=fMO0PE`QQssQ%#$QI?&+-5O literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ToggleButton.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ToggleButton.png new file mode 100644 index 0000000000000000000000000000000000000000..89b84d95e0b311f1892e1f45f5580fd959d0826c GIT binary patch literal 760 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<@!3HEb(?29LFfi@+ba4!+xb^nV#?^(1GVBGa zClxd&`-_L%JK7Z(Z=>7AS=XSRDH7VLlv1$P=5dh+!sSLaC_N~31z3pz^#(5D}6iYQZ zA5_@b)d(u-vJ_g#9AREi^HcfCN+%DViS_zG4Fte}-OLxhFZ*)u`DaOn`%^E!JhJJg zj`2(%pM?P*mIkeyar|-O{SR3}cK$53T|NMSYhQ0lVA3j(r-RmaC)f%B9 zl&Cko+kRQt>d388d#ilchCMzn7@;7rWA}^qHKqU7GAz2Np@01O=Z$~s>c7V9jZ2s6 zZOdQSee}_?fc4k4U)e4>x1aYwjots7atXx(wfa8*>@HpVR!=Pu|R7YY1<#yRJX~qgZ#Vst{+GhRBbvlDib#`@^-S zF6UxBpuVtv!=#fcmtU5IFK;iocklJrd3quYLQdj$*_s<47(T4$+b76OAlmkGDa`fT zpTY=M*2g%X`N6)0pWH9iI=>9(JpEK??MabWL6_zhYu?S9-s`4pHq&PVB&~=zGVFS3 w^4Dg={rAbX8&^2L3Nm8&WD7E;;ZMRp24=gR=MRT|EC(6u>FVdQ&MBb@0BvDEJ^%m! literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ZoomButton.png b/.metadata/.plugins/com.android.ide.eclipse.adt/palette-preview-r16b-21-apptheme-nexus10/ZoomButton.png new file mode 100644 index 0000000000000000000000000000000000000000..1c177a9792e0e12aa3bca11c06834cb1ba670567 GIT binary patch literal 5192 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 + + + + + + + + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1/70b49fdad98700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/1/70b49fdad98700141885aa2aa9523af4 new file mode 100644 index 0000000..6ce89c7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1/70b49fdad98700141885aa2aa9523af4 @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1/d0e8eaf4df8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/1/d0e8eaf4df8700141885aa2aa9523af4 new file mode 100644 index 0000000..5d3fcec --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1/d0e8eaf4df8700141885aa2aa9523af4 @@ -0,0 +1,46 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + mMiBand.connectGatt(this, false, this); + } + + @Override + public void onResume() { + super.onResume(); + + } + + @Override + public void onPause() { + super.onPause(); + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/10/c07a171bed870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/10/c07a171bed870014196aa5e86be5823c new file mode 100644 index 0000000..317cbfc --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/10/c07a171bed870014196aa5e86be5823c @@ -0,0 +1,36 @@ + + + + + + + + + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/13/603c9935db8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/13/603c9935db8700141885aa2aa9523af4 new file mode 100644 index 0000000..f1f0eee --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/13/603c9935db8700141885aa2aa9523af4 @@ -0,0 +1,26 @@ + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/14/20df9f7bdb8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/14/20df9f7bdb8700141885aa2aa9523af4 new file mode 100644 index 0000000..97b9890 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/14/20df9f7bdb8700141885aa2aa9523af4 @@ -0,0 +1,25 @@ + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/14/809d9b59f7870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/14/809d9b59f7870014196aa5e86be5823c new file mode 100644 index 0000000..73780c0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/14/809d9b59f7870014196aa5e86be5823c @@ -0,0 +1,208 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.LeParams; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_LE_PARAMS = UUID + .fromString("0000ff09-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService().getCharacteristic( + UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + // setColor((byte)127, (byte)0, (byte)0); + // request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + + //handle value + if (characteristic.getUuid().equals(UUID_CHAR_REALTIME_STEPS)) + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + else if (characteristic.getUuid().equals(UUID_CHAR_BATTERY)) { + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + } else if (characteristic.getUuid().equals(UUID_CHAR_DEVICE_NAME)) { + mMiBand.setName(new String(b)); + } else if (characteristic.getUuid().equals(UUID_CHAR_LE_PARAMS)) { + LeParams params = LeParams.fromByte(b); + mMiBand.setLeParams(params); + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + request(UUID_CHAR_LE_PARAMS); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/16/201cc50ff9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/16/201cc50ff9870014196aa5e86be5823c new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/17/a07453a4e9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/17/a07453a4e9870014196aa5e86be5823c new file mode 100644 index 0000000..fbdb723 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/17/a07453a4e9870014196aa5e86be5823c @@ -0,0 +1,15 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class MiBand { + + public String mBTAddress; + public int mSteps; + public Battery mBattery; + + public void setBattery(Battery battery) { + mBattery = battery; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/18/a0833b17ee870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/18/a0833b17ee870014196aa5e86be5823c new file mode 100644 index 0000000..8444dc2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/18/a0833b17ee870014196aa5e86be5823c @@ -0,0 +1,182 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.ProgressBar; +import android.widget.Spinner; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + //BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + + private MiBand mMiBand = new MiBand(); + + //UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mLoading = (Spinner) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + mLoading.setVisibility(View.GONE); + mTVSteps.setText(mMiBand.mSteps); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/18/d0598389d88700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/18/d0598389d88700141885aa2aa9523af4 new file mode 100644 index 0000000..e6f9ee5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/18/d0598389d88700141885aa2aa9523af4 @@ -0,0 +1,70 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private Handler mHandler = new Handler(); + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter(); + } + + @Override + public void onResume() { + super.onResume(); + scanLeDevice(true); + } + + + + @SuppressWarnings("deprecation") // L Apis are buggy and crap! + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(MiActivity.this); + scanLeDevice(true); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + scanLeDevice(false); // we only care about one miband so that's enough + } + } + + @Override + public void onPause() { + super.onPause(); + scanLeDevice(false); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/19/20314991de8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/19/20314991de8700141885aa2aa9523af4 new file mode 100644 index 0000000..4a7195e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/19/20314991de8700141885aa2aa9523af4 @@ -0,0 +1,17 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/19/50ab4003f3870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/19/50ab4003f3870014196aa5e86be5823c new file mode 100644 index 0000000..4568304 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/19/50ab4003f3870014196aa5e86be5823c @@ -0,0 +1,193 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1a/a0e36e87d68700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/1a/a0e36e87d68700141885aa2aa9523af4 new file mode 100644 index 0000000..2acfdf9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1a/a0e36e87d68700141885aa2aa9523af4 @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1c/4025d149f8870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/1c/4025d149f8870014196aa5e86be5823c new file mode 100644 index 0000000..38104d0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1c/4025d149f8870014196aa5e86be5823c @@ -0,0 +1,235 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.debugging.L; +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.LeParams; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_LE_PARAMS = UUID + .fromString("0000ff09-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.menu_overview, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_leparams: + if(mMiBand.mLeParams == null) { + L.toast(this, "No LE params received yet"); + return true; + } + Intent intent = new Intent(getApplicationContext(), MiLeParamsActivity.class); + intent.putExtra("params", mMiBand.mLeParams); + break; + } + return true; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService().getCharacteristic( + UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + // setColor((byte)127, (byte)0, (byte)0); + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + + // handle value + if (characteristic.getUuid().equals(UUID_CHAR_REALTIME_STEPS)) + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + else if (characteristic.getUuid().equals(UUID_CHAR_BATTERY)) { + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + } else if (characteristic.getUuid().equals(UUID_CHAR_DEVICE_NAME)) { + mMiBand.setName(new String(b)); + } else if (characteristic.getUuid().equals(UUID_CHAR_LE_PARAMS)) { + LeParams params = LeParams.fromByte(b); + mMiBand.setLeParams(params); + } + + // proceed with state machine (called in the beginning) + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + request(UUID_CHAR_LE_PARAMS); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1c/40b86b85e4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/1c/40b86b85e4870014196aa5e86be5823c new file mode 100644 index 0000000..1f11d6d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1c/40b86b85e4870014196aa5e86be5823c @@ -0,0 +1,31 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class MiBand { + + String mBTAddress; + int mSteps; + + + static class Battery { + int mBatteryLevel; + int mCycles; + Calendar mLastCharged; + + static enum Status { + LOW, FULL, CHARGING, NOT_CHARGING + + public static Status fromByte(byte b) { + switch (b) { + case 1: return LOW; + case 2: return CHARGING; + case 3: return FULL; + case 4: return NOT_CHARGING; + + default: return null; + } + } + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1c/d0973b39d88700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/1c/d0973b39d88700141885aa2aa9523af4 new file mode 100644 index 0000000..be4065a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1c/d0973b39d88700141885aa2aa9523af4 @@ -0,0 +1,68 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private Handler mHandler; + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter(); + } + + @Override + public void onResume() { + super.onResume(); + scanLeDevice(true); + } + + + + + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(MiActivity.this); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + scanLeDevice(false); // we only care about one miband so that's enough + } + } + + @Override + public void onPause() { + super.onPause(); + scanLeDevice(false); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1e/0005cc07e18700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/1e/0005cc07e18700141885aa2aa9523af4 new file mode 100644 index 0000000..4d3a6d8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1e/0005cc07e18700141885aa2aa9523af4 @@ -0,0 +1,78 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + for(BluetoothGattService service : gatt.getServices()) { + for (BluetoothGattCharacteristic character : service.get()) {} + } + } + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if(status == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1e/40866795ce8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/1e/40866795ce8700141885aa2aa9523af4 new file mode 100644 index 0000000..548ca95 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1e/40866795ce8700141885aa2aa9523af4 @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1f/c0f5aeb9e18700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/1f/c0f5aeb9e18700141885aa2aa9523af4 new file mode 100644 index 0000000..eb852a8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1f/c0f5aeb9e18700141885aa2aa9523af4 @@ -0,0 +1,82 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + for (BluetoothGattService srvs : gatt.getServices()) { + System.out.println("Service: "+srvs.getUuid()); + for (BluetoothGattCharacteristic chrt : srvs + .getCharacteristics()) { + System.out.println("Characteristic: "+chrt.getUuid()+" permissions: "+chrt.getPermissions()); + } + } + } + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (status == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1f/d0aee612f6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/1f/d0aee612f6870014196aa5e86be5823c new file mode 100644 index 0000000..076ed47 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1f/d0aee612f6870014196aa5e86be5823c @@ -0,0 +1,65 @@ +package com.motioncoding.miband.model; + +public class LeParams implements Parcelable { + public int connIntMin; + public int connIntMax; + public int latency; + public int timeout; + public int connInt; + public int advInt; + + public static LeParams fromByte(byte[] b) { + LeParams params = new LeParams(); + + params.connIntMax = 0xffff & (0xff & b[0] | (0xff & b[1]) << 8); + params.connIntMax = 0xffff & (0xff & b[2] | (0xff & b[3]) << 8); + params.latency = 0xffff & (0xff & b[4] | (0xff & b[5]) << 8); + params.timeout = 0xffff & (0xff & b[6] | (0xff & b[7]) << 8); + params.connInt = 0xffff & (0xff & b[8] | (0xff & b[9]) << 8); + params.advInt = 0xffff & (0xff & b[10] | (0xff & b[11]) << 8); + + params.connIntMin *= 1.25; + params.connIntMax *= 1.25; + params.advInt *= 0.625; + params.timeout *= 10; + + return params; + } + + protected LeParams(Parcel in) { + connIntMin = in.readInt(); + connIntMax = in.readInt(); + latency = in.readInt(); + timeout = in.readInt(); + connInt = in.readInt(); + advInt = in.readInt(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(connIntMin); + dest.writeInt(connIntMax); + dest.writeInt(latency); + dest.writeInt(timeout); + dest.writeInt(connInt); + dest.writeInt(advInt); + } + + @SuppressWarnings("unused") + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public LeParams createFromParcel(Parcel in) { + return new LeParams(in); + } + + @Override + public LeParams[] newArray(int size) { + return new LeParams[size]; + } + }; +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/21/b0e8e801e18700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/21/b0e8e801e18700141885aa2aa9523af4 new file mode 100644 index 0000000..5d1f05d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/21/b0e8e801e18700141885aa2aa9523af4 @@ -0,0 +1,78 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + for(BluetoothGattService service : gatt.getServices())) { + + } + } + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if(status == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/22/10c7d4c0e8870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/22/10c7d4c0e8870014196aa5e86be5823c new file mode 100644 index 0000000..43f39e4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/22/10c7d4c0e8870014196aa5e86be5823c @@ -0,0 +1,38 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class Battery { + public int mBatteryLevel; + public int mCycles; + public Calendar mLastCharged; + public Status mStatus; + + public static Battery fromByte(byte[] b) { + Battery battery = new Battery(); + battery.mBatteryLevel = b[0]; + battery.status = Status.fromByte(b[9]) + + return battery; + } + + static enum Status { + LOW, FULL, CHARGING, NOT_CHARGING; + + public static Status fromByte(byte b) { + switch (b) { + case 1: + return LOW; + case 2: + return CHARGING; + case 3: + return FULL; + case 4: + return NOT_CHARGING; + + default: + return null; + } + } + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/23/3008771ee7870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/23/3008771ee7870014196aa5e86be5823c new file mode 100644 index 0000000..5b46776 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/23/3008771ee7870014196aa5e86be5823c @@ -0,0 +1,129 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void request(BluetoothGattCharacteristic chrt) + mGatt.readCharacteristic(chrt); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + switch (state) { + case 0: + requestSteps(); + break; + } + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(characteristic.getValue())); + switch (state) { + case 0: + System.out.println(characteristic.getIntValue(0, 0)); + break; + } + state++; + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/24/60a7b01fec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/24/60a7b01fec870014196aa5e86be5823c new file mode 100644 index 0000000..883afb6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/24/60a7b01fec870014196aa5e86be5823c @@ -0,0 +1,65 @@ +package com.motioncoding.debugging; + +import android.content.Context; +import android.util.Log; +import android.widget.Toast; + +public class L { + + public static enum LogType { + CLASS, CLASS_AND_METHOD, CLASS_AND_METHOD_AND_LINE, CLASS_AND_LINE + } + + private static LogType mType = LogType.CLASS_AND_METHOD; + + + public static void toast(Context context, String msg) { + Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); + } + + public static void setLogType(LogType type) { + mType = type; + } + + public static void e(String msg) { + Log.e(getTag(), msg); + } + + public static void i(String msg) { + Log.i(getTag(), msg); + } + + public static void d(String msg) { + Log.d(getTag(), msg); + } + + public static void v(String msg) { + Log.v(getTag(), msg); + } + + public static void w(String msg) { + Log.w(getTag(), msg); + } + + public static void wtf(String msg) { + Log.wtf(getTag(), msg); + } + + private static String getTag() { + StackTraceElement[] s = Thread.currentThread().getStackTrace(); + switch (mType) { + case CLASS: + return s[4].getClassName(); + case CLASS_AND_LINE: + return s[4].getClassName()+":"+s[4].getLineNumber(); + case CLASS_AND_METHOD: + return s[4].getClassName()+"."+s[4].getMethodName(); + case CLASS_AND_METHOD_AND_LINE: + return s[4].getClassName()+"."+s[4].getMethodName()+":"+s[4].getLineNumber(); + default: + break; + } + return null; + } +} + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/24/b052e324dc8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/24/b052e324dc8700141885aa2aa9523af4 new file mode 100644 index 0000000..58c5b24 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/24/b052e324dc8700141885aa2aa9523af4 @@ -0,0 +1,7 @@ + + + + MiBand + Hello world! + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/25/b0895a09e08700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/25/b0895a09e08700141885aa2aa9523af4 new file mode 100644 index 0000000..d381f87 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/25/b0895a09e08700141885aa2aa9523af4 @@ -0,0 +1,46 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + mMiBand.connectGatt(this, false, mGattCallback); + } + + @Override + public void onResume() { + super.onResume(); + + } + + @Override + public void onPause() { + super.onPause(); + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/26/00c411b9e4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/26/00c411b9e4870014196aa5e86be5823c new file mode 100644 index 0000000..bb76ec7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/26/00c411b9e4870014196aa5e86be5823c @@ -0,0 +1,12 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class MiBand { + + String mBTAddress; + int mSteps; + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/26/d07ddf9bf5870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/26/d07ddf9bf5870014196aa5e86be5823c new file mode 100644 index 0000000..d8ed867 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/26/d07ddf9bf5870014196aa5e86be5823c @@ -0,0 +1,211 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.LeParams; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_LE_PARAMS = UUID + .fromString("0000ff09-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService() + .getCharacteristic(UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() +// setColor((byte)127, (byte)0, (byte)0); +// request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + case 3: + LeParams params = LeParams.fromByte(b); + mMiBand.setLeParams(params); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + request(UUID_LE_PARAMS); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/27/10e7f38fee870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/27/10e7f38fee870014196aa5e86be5823c new file mode 100644 index 0000000..841dc46 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/27/10e7f38fee870014196aa5e86be5823c @@ -0,0 +1,37 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/28/6086e11adc8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/28/6086e11adc8700141885aa2aa9523af4 new file mode 100644 index 0000000..319bddf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/28/6086e11adc8700141885aa2aa9523af4 @@ -0,0 +1,73 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private Handler mHandler = new Handler(); + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + + + setContentView(R.layout.activity_mi); + mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter(); + } + + @Override + public void onResume() { + super.onResume(); + scanLeDevice(true); + } + + + + @SuppressWarnings("deprecation") // L Apis are buggy and crap! + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(MiActivity.this); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + System.out.println(device.getName()+" "+device.getAddress()); + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + scanLeDevice(false); // we only care about one miband so that's enough + } + } + + @Override + public void onPause() { + super.onPause(); + scanLeDevice(false); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/28/b0074003f6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/28/b0074003f6870014196aa5e86be5823c new file mode 100644 index 0000000..16b0ed8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/28/b0074003f6870014196aa5e86be5823c @@ -0,0 +1,93 @@ +package com.motioncoding.miband.model; + +public class LeParams { + public int connIntMin; + public int connIntMax; + public int latency; + public int timeout; + public int connInt; + public int advInt; + + public static LeParams fromByte(byte[] b) { + LeParams params = new LeParams(); + + params.connIntMax = 0xffff & (0xff & b[0] | (0xff & b[1]) << 8); + params.connIntMax = 0xffff & (0xff & b[2] | (0xff & b[3]) << 8); + params.latency = 0xffff & (0xff & b[4] | (0xff & b[5]) << 8); + params.timeout = 0xffff & (0xff & b[6] | (0xff & b[7]) << 8); + params.connInt = 0xffff & (0xff & b[8] | (0xff & b[9]) << 8); + params.advInt = 0xffff & (0xff & b[10] | (0xff & b[11]) << 8); + + params.connIntMin *= 1.25; + params.connIntMax *= 1.25; + params.advInt *= 0.625; + params.timeout *= 10; + + return params; + } +} +package com.motioncoding.miband.model; + +public class LeParams implements Parcelable { + public int connIntMin; + public int connIntMax; + public int latency; + public int timeout; + public int connInt; + public int advInt; + + public static LeParams fromByte(byte[] b) { + LeParams params = new LeParams(); + + params.connIntMax = 0xffff & (0xff & b[0] | (0xff & b[1]) << 8); + params.connIntMax = 0xffff & (0xff & b[2] | (0xff & b[3]) << 8); + params.latency = 0xffff & (0xff & b[4] | (0xff & b[5]) << 8); + params.timeout = 0xffff & (0xff & b[6] | (0xff & b[7]) << 8); + params.connInt = 0xffff & (0xff & b[8] | (0xff & b[9]) << 8); + params.advInt = 0xffff & (0xff & b[10] | (0xff & b[11]) << 8); + + params.connIntMin *= 1.25; + params.connIntMax *= 1.25; + params.advInt *= 0.625; + params.timeout *= 10; + + return params; + } + + protected LeParams(Parcel in) { + connIntMin = in.readInt(); + connIntMax = in.readInt(); + latency = in.readInt(); + timeout = in.readInt(); + connInt = in.readInt(); + advInt = in.readInt(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(connIntMin); + dest.writeInt(connIntMax); + dest.writeInt(latency); + dest.writeInt(timeout); + dest.writeInt(connInt); + dest.writeInt(advInt); + } + + @SuppressWarnings("unused") + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public LeParams createFromParcel(Parcel in) { + return new LeParams(in); + } + + @Override + public LeParams[] newArray(int size) { + return new LeParams[size]; + } + }; +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/28/b07ee274f7870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/28/b07ee274f7870014196aa5e86be5823c new file mode 100644 index 0000000..3c1112f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/28/b07ee274f7870014196aa5e86be5823c @@ -0,0 +1,218 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.LeParams; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_LE_PARAMS = UUID + .fromString("0000ff09-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.menu_overview, menu); + return true; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService().getCharacteristic( + UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + // setColor((byte)127, (byte)0, (byte)0); + // request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + + // handle value + if (characteristic.getUuid().equals(UUID_CHAR_REALTIME_STEPS)) + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + else if (characteristic.getUuid().equals(UUID_CHAR_BATTERY)) { + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + } else if (characteristic.getUuid().equals(UUID_CHAR_DEVICE_NAME)) { + mMiBand.setName(new String(b)); + } else if (characteristic.getUuid().equals(UUID_CHAR_LE_PARAMS)) { + LeParams params = LeParams.fromByte(b); + mMiBand.setLeParams(params); + } + + // proceed with state machine (called in the beginning) + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + request(UUID_CHAR_LE_PARAMS); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/28/c0c02d64e8870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/28/c0c02d64e8870014196aa5e86be5823c new file mode 100644 index 0000000..c64122d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/28/c0c02d64e8870014196aa5e86be5823c @@ -0,0 +1,145 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after auth() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(characteristic.getValue())); + switch (state) { + case 0: + System.out.println(characteristic.getIntValue(0, 0)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_ACTIVITY); + break; + case 3: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/29/b0ac3b10ee870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/29/b0ac3b10ee870014196aa5e86be5823c new file mode 100644 index 0000000..98d0a92 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/29/b0ac3b10ee870014196aa5e86be5823c @@ -0,0 +1,181 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.Spinner; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + //BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + + private MiBand mMiBand = new MiBand(); + + //UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private Progressbar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mLoading = (Spinner) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + mLoading.setVisibility(View.GONE); + mTVSteps.setText(mMiBand.mSteps); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2d/50070725dc8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/2d/50070725dc8700141885aa2aa9523af4 new file mode 100644 index 0000000..086aad0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2d/50070725dc8700141885aa2aa9523af4 @@ -0,0 +1,77 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.widget.TextView; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private TextView mTextView; + private Handler mHandler = new Handler(); + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + setContentView(R.layout.activity_mi); + mTextView = (TextView) findViewById(R.id.text_search); + mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)) + .getAdapter(); + } + + @Override + public void onResume() { + super.onResume(); + scanLeDevice(true); + } + + @SuppressWarnings("deprecation") + // L Apis are buggy and crap! + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(MiActivity.this); + mTextView.setText("MiBand not found. Is it in range?"); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + System.out.println(device.getName() + " " + device.getAddress()); + if (device != null && device.getName() != null + & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + scanLeDevice(false); // we only care about one miband so that's + // enough + } + } + + @Override + public void onPause() { + super.onPause(); + scanLeDevice(false); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2f/00d29edfdc8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/2f/00d29edfdc8700141885aa2aa9523af4 new file mode 100644 index 0000000..c7c6ac3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2f/00d29edfdc8700141885aa2aa9523af4 @@ -0,0 +1,77 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.widget.TextView; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private TextView mTextView; + private Handler mHandler = new Handler(); + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + setContentView(R.layout.activity_mi); + mTextView = (TextView) findViewById(R.id.text_search); + mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)) + .getAdapter(); + } + + @Override + public void onResume() { + super.onResume(); + scanLeDevice(true); + } + + @SuppressWarnings("deprecation") + // L Apis are buggy and crap! + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(MiActivity.this); + mTextView.setText(R.string.not_found); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + System.out.println(device.getName() + " " + device.getAddress()); + if (device != null && device.getName() != null + & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + scanLeDevice(false); // we only care about one miband so that's + // enough + } + } + + @Override + public void onPause() { + super.onPause(); + scanLeDevice(false); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3/00eab3efea870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/3/00eab3efea870014196aa5e86be5823c new file mode 100644 index 0000000..2ddb557 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3/00eab3efea870014196aa5e86be5823c @@ -0,0 +1,23 @@ +package com.motioncoding.miband.model; + +import java.util.Observable; + + +public class MiBand extends Observable { + + public String mBTAddress; + public int mSteps; + public Battery mBattery; + + + public void setSteps(int steps) { + mSteps = steps; + notifyObservers(); + } + + public void setBattery(Battery battery) { + mBattery = battery; + notifyObservers(); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3/b0314761df8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/3/b0314761df8700141885aa2aa9523af4 new file mode 100644 index 0000000..b51b94f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3/b0314761df8700141885aa2aa9523af4 @@ -0,0 +1,39 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothAdapter mBluetoothAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)) + .getAdapter(); + } + + + @Override + public void onResume() { + super.onResume(); + + } + + @Override + public void onPause() { + super.onPause(); + } + + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3/c016be3cf7870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/3/c016be3cf7870014196aa5e86be5823c new file mode 100644 index 0000000..ad6e3c3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3/c016be3cf7870014196aa5e86be5823c @@ -0,0 +1,25 @@ +package com.motioncoding.miband; + +import android.app.ListActivity; +import android.os.Bundle; +import android.widget.ArrayAdapter; + +import com.motioncoding.miband.model.LeParams; + +public class MiLeParamsActivity extends ListActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + setContentView(R.layout.activity_mi_le_params); + + LeParams params = (LeParams) getIntent().getParcelableExtra("params"); + + String[] values = new String[]; + + ArrayAdapter adapter = new ArrayAdapter(getActivity(), + android.R.layout.simple_list_item_1, values); + this.setListAdapter(adapter); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3/f06b8a09e38700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/3/f06b8a09e38700141885aa2aa9523af4 new file mode 100644 index 0000000..4904d96 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3/f06b8a09e38700141885aa2aa9523af4 @@ -0,0 +1,97 @@ +package com.motioncoding.miband; + +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + BluetoothGattService service = mGatt.getService(UUID.fromString("00001800-0000-1000-8000-00805f9b34fb")); + BluetoothGattCharacteristic chrt = service.getCharacteristic(UUID.fromString("0000ff0f-0000-1000-8000-00805f9b34fb")); + + chrt.setValue(new byte[] {2}); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { +// if (status == BluetoothGatt.GATT_SUCCESS) { +// for (BluetoothGattService srvs : gatt.getServices()) { +// System.out.println("Service: "+srvs.getUuid()); +// for (BluetoothGattCharacteristic chrt : srvs +// .getCharacteristics()) { +// System.out.println("Characteristic: "+chrt.getUuid()+" with "+chrt.getProperties()); +// } +// } +// } + + auth(); + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/30/c043bdede28700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/30/c043bdede28700141885aa2aa9523af4 new file mode 100644 index 0000000..efbf140 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/30/c043bdede28700141885aa2aa9523af4 @@ -0,0 +1,97 @@ +package com.motioncoding.miband; + +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + BluetoothGattService service = mGatt.getService(UUID.fromString("00001800-0000-1000-8000-00805f9b34fb")); + BluetoothGattCharacteristic chrt = service.getCharacteristic(UUID.fromString("0000ff0f-0000-1000-8000-00805f9b34fb")); + + chrt.setValue(new byte[] {2}); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth1"); + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { +// if (status == BluetoothGatt.GATT_SUCCESS) { +// for (BluetoothGattService srvs : gatt.getServices()) { +// System.out.println("Service: "+srvs.getUuid()); +// for (BluetoothGattCharacteristic chrt : srvs +// .getCharacteristics()) { +// System.out.println("Characteristic: "+chrt.getUuid()+" with "+chrt.getProperties()); +// } +// } +// } + + auth(); + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/31/e04a80c6e38700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/31/e04a80c6e38700141885aa2aa9523af4 new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/31/f05462bcec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/31/f05462bcec870014196aa5e86be5823c new file mode 100644 index 0000000..33f8d6a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/31/f05462bcec870014196aa5e86be5823c @@ -0,0 +1,7 @@ + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/32/40ab3976ec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/32/40ab3976ec870014196aa5e86be5823c new file mode 100644 index 0000000..57a5154 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/32/40ab3976ec870014196aa5e86be5823c @@ -0,0 +1,55 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class Battery { + public int mBatteryLevel; + public int mCycles; + public Calendar mLastCharged; + public Status mStatus; + + public static Battery fromByte(byte[] b) { + Battery battery = new Battery(); + battery.mBatteryLevel = b[0]; + battery.mStatus = Status.fromByte(b[9]); + battery.mLastCharged = Calendar.getInstance(); + + battery.mLastCharged.set(Calendar.YEAR, b[1]+2000); + battery.mLastCharged.set(Calendar.MONTH, b[2]); + battery.mLastCharged.set(Calendar.DATE, b[3]); + + battery.mLastCharged.set(Calendar.HOUR_OF_DAY, b[4]); + battery.mLastCharged.set(Calendar.MINUTE, b[5]); + battery.mLastCharged.set(Calendar.SECOND, b[6]); + + + + battery.mCycles = 0xffff & (0xff & b[7] | (0xff & b[8]) << 8); + return battery; + } + + @Override + public String toString() { + return String.format("Level: %s percent Cycles: %s State: %s Last Charged: %s", mBatteryLevel, mCycles, mStatus.toString(), mLastCharged.toString()); + } + + static enum Status { + LOW, FULL, CHARGING, NOT_CHARGING; + + public static Status fromByte(byte b) { + switch (b) { + case 1: + return LOW; + case 2: + return CHARGING; + case 3: + return FULL; + case 4: + return NOT_CHARGING; + + default: + return null; + } + } + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/32/a0709064dc8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/32/a0709064dc8700141885aa2aa9523af4 new file mode 100644 index 0000000..4f16ff7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/32/a0709064dc8700141885aa2aa9523af4 @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/34/0002d7f1f3870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/34/0002d7f1f3870014196aa5e86be5823c new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/34/509de358e5870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/34/509de358e5870014196aa5e86be5823c new file mode 100644 index 0000000..d8ad6ac --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/34/509de358e5870014196aa5e86be5823c @@ -0,0 +1,109 @@ +package com.motioncoding.miband; + +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void requestSteps() { + int steps = getMiliService().getCharacteristic(UUID_CHAR_REALTIME_STEPS).getIntValue(0, 0); + System.out.println(steps); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/35/60c49bf8f6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/35/60c49bf8f6870014196aa5e86be5823c new file mode 100644 index 0000000..8a65044 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/35/60c49bf8f6870014196aa5e86be5823c @@ -0,0 +1,22 @@ +package com.motioncoding.miband; + +import android.app.ListActivity; +import android.os.Bundle; + +import com.motioncoding.miband.model.LeParams; + +public class MiLeParamsActivity extends ListActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + setContentView(R.layout.activity_mi_le_params); + + LeParams params = (LeParams) getIntent().getParcelableExtra("params"); + + final StableArrayAdapter adapter = new StableArrayAdapter(this, + android.R.layout.simple_list_item_1, list); + this.setListAdapter(adapter); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/35/c0ed5f6df8870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/35/c0ed5f6df8870014196aa5e86be5823c new file mode 100644 index 0000000..50fe8d0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/35/c0ed5f6df8870014196aa5e86be5823c @@ -0,0 +1,12 @@ + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/35/d0746695ce8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/35/d0746695ce8700141885aa2aa9523af4 new file mode 100644 index 0000000..d45dd56 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/35/d0746695ce8700141885aa2aa9523af4 @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/35/e03e5dcfe6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/35/e03e5dcfe6870014196aa5e86be5823c new file mode 100644 index 0000000..79048e5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/35/e03e5dcfe6870014196aa5e86be5823c @@ -0,0 +1,131 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void requestSteps() { + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_REALTIME_STEPS); + mGatt.readCharacteristic(chrt); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + switch (state) { + case 0: + requestSteps(); + break; + } + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + Log.i(characteristic.getUuid().toString(),"state: "+state+" value:" + Arrays.toString(characteristic.getValue())); + switch (state) { + case 0: + + break; + } + state++; + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/37/700c4f98e7870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/37/700c4f98e7870014196aa5e86be5823c new file mode 100644 index 0000000..c6dd0b4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/37/700c4f98e7870014196aa5e86be5823c @@ -0,0 +1,139 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after auth() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(characteristic.getValue())); + switch (state) { + case 0: + System.out.println(characteristic.getIntValue(0, 0)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + } + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/38/4028145fe38700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/38/4028145fe38700141885aa2aa9523af4 new file mode 100644 index 0000000..ed3ae48 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/38/4028145fe38700141885aa2aa9523af4 @@ -0,0 +1,97 @@ +package com.motioncoding.miband; + +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + BluetoothGattService service = mGatt.getService(UUID.fromString("00001800-0000-1000-8000-00805f9b34fb")); + BluetoothGattCharacteristic chrt = service.getCharacteristic(UUID.fromString("0000ff0f-0000-1000-8000-00805f9b34fb")); + + chrt.setValue(new byte[] {2}); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + for (BluetoothGattService srvs : gatt.getServices()) { + System.out.println("Service: "+srvs.getUuid()); + for (BluetoothGattCharacteristic chrt : srvs + .getCharacteristics()) { + System.out.println("Characteristic: "+chrt.getUuid()+" with "+chrt.getProperties()); + } + } + } + + auth(); + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/38/602c3f93ec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/38/602c3f93ec870014196aa5e86be5823c new file mode 100644 index 0000000..0296466 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/38/602c3f93ec870014196aa5e86be5823c @@ -0,0 +1,55 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class Battery { + public int mBatteryLevel; + public int mCycles; + public Calendar mLastCharged; + public Status mStatus; + + public static Battery fromByte(byte[] b) { + Battery battery = new Battery(); + battery.mBatteryLevel = b[0]; + battery.mStatus = Status.fromByte(b[9]); + battery.mLastCharged = Calendar.getInstance(); + + battery.mLastCharged.set(Calendar.YEAR, b[1]+2000); + battery.mLastCharged.set(Calendar.MONTH, b[2]); + battery.mLastCharged.set(Calendar.DATE, b[3]); + + battery.mLastCharged.set(Calendar.HOUR_OF_DAY, b[4]); + battery.mLastCharged.set(Calendar.MINUTE, b[5]); + battery.mLastCharged.set(Calendar.SECOND, b[6]); + + + + battery.mCycles = 0xffff & (0xff & b[7] | (0xff & b[8]) << 8); + return battery; + } + + @Override + public String toString() { + return String.format("Level: %s Cycles: %s State: %s Last Charged: %s", mBatteryLevel, mCycles, mStatus.toString(), mLastCharged.toString()); + } + + static enum Status { + LOW, FULL, CHARGING, NOT_CHARGING; + + public static Status fromByte(byte b) { + switch (b) { + case 1: + return LOW; + case 2: + return CHARGING; + case 3: + return FULL; + case 4: + return NOT_CHARGING; + + default: + return null; + } + } + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3e/40798e9de8870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/3e/40798e9de8870014196aa5e86be5823c new file mode 100644 index 0000000..8ea85a1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3e/40798e9de8870014196aa5e86be5823c @@ -0,0 +1,33 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class Battery { + public int mBatteryLevel; + public int mCycles; + public Calendar mLastCharged; + + public static Battery fromByte(byte[] b) { + return this; + } + + static enum Status { + LOW, FULL, CHARGING, NOT_CHARGING; + + public static Status fromByte(byte b) { + switch (b) { + case 1: + return LOW; + case 2: + return CHARGING; + case 3: + return FULL; + case 4: + return NOT_CHARGING; + + default: + return null; + } + } + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3e/e05675d7d68700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/3e/e05675d7d68700141885aa2aa9523af4 new file mode 100644 index 0000000..b308209 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3e/e05675d7d68700141885aa2aa9523af4 @@ -0,0 +1,26 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; + +public class MiActivity extends Activity { + + private BluetoothManager bluetoothManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + + bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); + + lookForMiBand(); + } + + private void lookForMiBand() { + // TODO Auto-generated method stub + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3f/70518c37e9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/3f/70518c37e9870014196aa5e86be5823c new file mode 100644 index 0000000..7738674 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3f/70518c37e9870014196aa5e86be5823c @@ -0,0 +1,152 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.UUID; + +import com.motioncoding.miband.model.MiBand; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand. + + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after auth() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(characteristic.getValue())); + switch (state) { + case 0: + System.out.println(characteristic.getIntValue(0, 0)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_ACTIVITY); + break; + case 3: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3f/f0677c5af4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/3f/f0677c5af4870014196aa5e86be5823c new file mode 100644 index 0000000..989f389 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3f/f0677c5af4870014196aa5e86be5823c @@ -0,0 +1,206 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_LE_PARAMS = UUID + .fromString("0000ff09-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService() + .getCharacteristic(UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() +// setColor((byte)127, (byte)0, (byte)0); +// request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/43/008907e5ee870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/43/008907e5ee870014196aa5e86be5823c new file mode 100644 index 0000000..b63a5b2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/43/008907e5ee870014196aa5e86be5823c @@ -0,0 +1,190 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + //BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + + private MiBand mMiBand = new MiBand(); + + //UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)).setVisibility(View.GONE); + mTVSteps.setText(mMiBand.mSteps+""); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/44/30d2e947f9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/44/30d2e947f9870014196aa5e86be5823c new file mode 100644 index 0000000..0c49be6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/44/30d2e947f9870014196aa5e86be5823c @@ -0,0 +1,6 @@ + +

+ + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/44/70b159bde5870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/44/70b159bde5870014196aa5e86be5823c new file mode 100644 index 0000000..2553edc --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/44/70b159bde5870014196aa5e86be5823c @@ -0,0 +1,111 @@ +package com.motioncoding.miband; + +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void requestSteps() { + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic(UUID_CHAR_REALTIME_STEPS); + int steps = chrt.getIntValue(0, 0); + System.out.println(steps); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + requestSteps(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/46/30832483eb870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/46/30832483eb870014196aa5e86be5823c new file mode 100644 index 0000000..c31c567 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/46/30832483eb870014196aa5e86be5823c @@ -0,0 +1,158 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_ACTIVITY); + break; + case 3: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/48/000f1098e4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/48/000f1098e4870014196aa5e86be5823c new file mode 100644 index 0000000..b86c879 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/48/000f1098e4870014196aa5e86be5823c @@ -0,0 +1,31 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class MiBand { + + String mBTAddress; + int mSteps; + + + static class Battery { + int mBatteryLevel; + int mCycles; + Calendar mLastCharged; + + static enum Status { + LOW, FULL, CHARGING, NOT_CHARGING; + + public static Status fromByte(byte b) { + switch (b) { + case 1: return LOW; + case 2: return CHARGING; + case 3: return FULL; + case 4: return NOT_CHARGING; + + default: return null; + } + } + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4b/3076006dd88700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/3076006dd88700141885aa2aa9523af4 new file mode 100644 index 0000000..9a823a5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/3076006dd88700141885aa2aa9523af4 @@ -0,0 +1,69 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private Handler mHandler = new Handler(); + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter(); + } + + @Override + public void onResume() { + super.onResume(); + scanLeDevice(true); + } + + + + @SuppressWarnings("deprecation") // L Apis are buggy and crap! + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(MiActivity.this); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + scanLeDevice(false); // we only care about one miband so that's enough + } + } + + @Override + public void onPause() { + super.onPause(); + scanLeDevice(false); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4b/30818ae5d98700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/30818ae5d98700141885aa2aa9523af4 new file mode 100644 index 0000000..3c02242 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/30818ae5d98700141885aa2aa9523af4 @@ -0,0 +1,11 @@ + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4b/80e7dddbde8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/80e7dddbde8700141885aa2aa9523af4 new file mode 100644 index 0000000..bb40e7f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/80e7dddbde8700141885aa2aa9523af4 @@ -0,0 +1,23 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothAdapter mBluetoothAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)) + .getAdapter(); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4e/c0adfb16e9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/4e/c0adfb16e9870014196aa5e86be5823c new file mode 100644 index 0000000..fc73b9f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4e/c0adfb16e9870014196aa5e86be5823c @@ -0,0 +1,149 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.UUID; + +import com.motioncoding.miband.model.MiBand; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after auth() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(characteristic.getValue())); + switch (state) { + case 0: + System.out.println(characteristic.getIntValue(0, 0)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_ACTIVITY); + break; + case 3: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5/605fa0fbd68700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/5/605fa0fbd68700141885aa2aa9523af4 new file mode 100644 index 0000000..d472406 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5/605fa0fbd68700141885aa2aa9523af4 @@ -0,0 +1,30 @@ +package com.motioncoding.miband; + +import android.annotation.TargetApi; +import android.app.Activity; +import android.bluetooth.BluetoothManager; +import android.bluetooth.le.ScanCallback; +import android.content.Context; +import android.os.Build; +import android.os.Bundle; + +@TargetApi(21) public class MiActivity extends Activity { + + private BluetoothManager bluetoothManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + + bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); + + lookForMiBand(); + } + + private void lookForMiBand() { + bluetoothManager.getAdapter().getBluetoothLeScanner() + .startScan(new ScanCallback() { + }); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/51/70dbab7cdc8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/51/70dbab7cdc8700141885aa2aa9523af4 new file mode 100644 index 0000000..7f70228 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/51/70dbab7cdc8700141885aa2aa9523af4 @@ -0,0 +1,27 @@ + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/51/907d51def4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/51/907d51def4870014196aa5e86be5823c new file mode 100644 index 0000000..c9c648d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/51/907d51def4870014196aa5e86be5823c @@ -0,0 +1,24 @@ +package com.motioncoding.miband.model; + +public class LeParams { + public int connIntMin, connIntMax, latency, timeout, connInt, advInt; + + public static LeParams fromByte(byte[] b) { + LeParams params = new LeParams(); + + params.connIntMax = 0xffff & (0xff & b[0] | (0xff & b[1]) << 8); + params.connIntMax = 0xffff & (0xff & b[2] | (0xff & b[3]) << 8); + params.latency = 0xffff & (0xff & b[4] | (0xff & b[5]) << 8); + params.timeout = 0xffff & (0xff & b[6] | (0xff & b[7]) << 8); + params.connInt = 0xffff & (0xff & b[8] | (0xff & b[9]) << 8); + params.advInt = 0xffff & (0xff & b[10] | (0xff & b[11]) << 8); + + params.connIntMin *= 1.25; + params.connIntMax *= 1.25; + params.advInt *= 0.625; + params.timeout *= 10; + + + return params; + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/51/a01ed591f8870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/51/a01ed591f8870014196aa5e86be5823c new file mode 100644 index 0000000..81b6403 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/51/a01ed591f8870014196aa5e86be5823c @@ -0,0 +1,33 @@ +package com.motioncoding.miband; + +import android.app.ListActivity; +import android.os.Bundle; +import android.widget.ArrayAdapter; + +import com.motioncoding.miband.model.LeParams; + +public class MiLeParamsActivity extends ListActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + + LeParams params = (LeParams) getIntent().getParcelableExtra("params"); + + String[] values = new String[6]; + + values[0] = String.format("Connection Intervall\n %s ms", params.connInt); + values[1] = String.format("Connection Intervall Min\n %s ms", params.connIntMin); + values[2] = String.format("Connection Intervall Max\n %s ms", params.connIntMax); + + values[3] = String.format("Advertising Intervall\n %s ms", params.advInt); + values[4] = String.format("Latency\n %s ms", params.latency); + values[5] = String.format("Timeout\n %s ms", params.timeout); + + + ArrayAdapter adapter = new ArrayAdapter(this, + android.R.layout.simple_list_item_1, values); + this.setListAdapter(adapter); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/52/00e855d0ec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/52/00e855d0ec870014196aa5e86be5823c new file mode 100644 index 0000000..a479ff4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/52/00e855d0ec870014196aa5e86be5823c @@ -0,0 +1,23 @@ + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/52/20689590f7870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/52/20689590f7870014196aa5e86be5823c new file mode 100644 index 0000000..416afb8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/52/20689590f7870014196aa5e86be5823c @@ -0,0 +1,228 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.LeParams; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_LE_PARAMS = UUID + .fromString("0000ff09-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.menu_overview, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_leparams: + break; + } + return true; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService().getCharacteristic( + UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + // setColor((byte)127, (byte)0, (byte)0); + // request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + + // handle value + if (characteristic.getUuid().equals(UUID_CHAR_REALTIME_STEPS)) + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + else if (characteristic.getUuid().equals(UUID_CHAR_BATTERY)) { + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + } else if (characteristic.getUuid().equals(UUID_CHAR_DEVICE_NAME)) { + mMiBand.setName(new String(b)); + } else if (characteristic.getUuid().equals(UUID_CHAR_LE_PARAMS)) { + LeParams params = LeParams.fromByte(b); + mMiBand.setLeParams(params); + } + + // proceed with state machine (called in the beginning) + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + request(UUID_CHAR_LE_PARAMS); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/53/50ba50e2d68700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/53/50ba50e2d68700141885aa2aa9523af4 new file mode 100644 index 0000000..7a8ff49 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/53/50ba50e2d68700141885aa2aa9523af4 @@ -0,0 +1,28 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothManager; +import android.bluetooth.le.ScanCallback; +import android.content.Context; +import android.os.Bundle; + +public class MiActivity extends Activity { + + private BluetoothManager bluetoothManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + + bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); + + lookForMiBand(); + } + + private void lookForMiBand() { + bluetoothManager.getAdapter().getBluetoothLeScanner() + .startScan(new ScanCallback() { + }); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/53/b0d5fc67de8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/53/b0d5fc67de8700141885aa2aa9523af4 new file mode 100644 index 0000000..eec0329 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/53/b0d5fc67de8700141885aa2aa9523af4 @@ -0,0 +1,13 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi_overview); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/55/70e4f6dfd98700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/55/70e4f6dfd98700141885aa2aa9523af4 new file mode 100644 index 0000000..a91fd03 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/55/70e4f6dfd98700141885aa2aa9523af4 @@ -0,0 +1,12 @@ + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/57/005656c7d78700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/57/005656c7d78700141885aa2aa9523af4 new file mode 100644 index 0000000..206bf7b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/57/005656c7d78700141885aa2aa9523af4 @@ -0,0 +1,68 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothManager bluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private Handler mHandler; + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); + } + + @Override + public void onResume() { + super.onResume(); + } + + + + + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + bluetoothManager.getAdapter().stopLeScan(this); + } + } + + @Override + public void onPause() { + super.onPause(); + bluetoothManager.getAdapter().stopLeScan(this); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/57/10e23bc9db8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/57/10e23bc9db8700141885aa2aa9523af4 new file mode 100644 index 0000000..81c318c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/57/10e23bc9db8700141885aa2aa9523af4 @@ -0,0 +1,26 @@ + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/57/b0c31529da8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/57/b0c31529da8700141885aa2aa9523af4 new file mode 100644 index 0000000..3e61a52 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/57/b0c31529da8700141885aa2aa9523af4 @@ -0,0 +1,12 @@ + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/57/c03bfee9e9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/57/c03bfee9e9870014196aa5e86be5823c new file mode 100644 index 0000000..59b7aaa --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/57/c03bfee9e9870014196aa5e86be5823c @@ -0,0 +1,155 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after auth() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(characteristic.getValue())); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(characteristic.getValue()); + mMiBand.setBattery(battery); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_ACTIVITY); + break; + case 3: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/58/b02315c3f4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/58/b02315c3f4870014196aa5e86be5823c new file mode 100644 index 0000000..ce29091 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/58/b02315c3f4870014196aa5e86be5823c @@ -0,0 +1,20 @@ +package com.motioncoding.miband.model; + +public class LeParams { + public int connIntMin, connIntMax, latency, timeout, connInt, advInt; + + public static LeParams fromByte(byte[] b) { + LeParams params = new LeParams(); + + params.connIntMax = 0xffff & (0xff & b[0] | (0xff & b[1]) << 8); + params.connIntMax = 0xffff & (0xff & b[2] | (0xff & b[3]) << 8); + params.latency = 0xffff & (0xff & b[4] | (0xff & b[5]) << 8); + params.timeout = 0xffff & (0xff & b[6] | (0xff & b[7]) << 8); + params.connInt = 0xffff & (0xff & b[8] | (0xff & b[9]) << 8); + params.advInt = 0xffff & (0xff & b[10] | (0xff & b[11]) << 8); + + params.connIntMin *= 1.25f; + + return params; + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/59/0087ef07eb870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/59/0087ef07eb870014196aa5e86be5823c new file mode 100644 index 0000000..77a16e5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/59/0087ef07eb870014196aa5e86be5823c @@ -0,0 +1,156 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after auth() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_ACTIVITY); + break; + case 3: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/59/407870a9dd8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/59/407870a9dd8700141885aa2aa9523af4 new file mode 100644 index 0000000..6beafe7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/59/407870a9dd8700141885aa2aa9523af4 @@ -0,0 +1,82 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.widget.TextView; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private TextView mTextView; + private Handler mHandler = new Handler(); + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + setContentView(R.layout.activity_mi); + mTextView = (TextView) findViewById(R.id.text_search); + mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)) + .getAdapter(); + } + + @Override + public void onResume() { + super.onResume(); + scanLeDevice(true); + } + + @SuppressWarnings("deprecation") + // L Apis are buggy and crap! + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(MiActivity.this); + scanLeDevice(true); +// mTextView.setText(R.string.not_found); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + System.out.println(device.getName() + " " + device.getAddress()); + if (device != null && device.getName() != null + & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + scanLeDevice(false); // we only care about one miband so that's + // enough + Intent intent = new Intent(getApplicationContext(), MiOverviewActivity.class); + intent.putExtra("address", device.getAddress()); + startActivity(intent); + } + } + + @Override + public void onPause() { + super.onPause(); + scanLeDevice(false); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/59/60488e56f5870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/59/60488e56f5870014196aa5e86be5823c new file mode 100644 index 0000000..1d122d5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/59/60488e56f5870014196aa5e86be5823c @@ -0,0 +1,206 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_LE_PARAMS = UUID + .fromString("0000ff09-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService() + .getCharacteristic(UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() +// setColor((byte)127, (byte)0, (byte)0); +// request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + request(UUID_LE_PARAMS); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/59/80f225b8e6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/59/80f225b8e6870014196aa5e86be5823c new file mode 100644 index 0000000..74c2704 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/59/80f225b8e6870014196aa5e86be5823c @@ -0,0 +1,117 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void requestSteps() { + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_REALTIME_STEPS); + mGatt.readCharacteristic(chrt); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + requestSteps(); + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + Log.i(characteristic.getUuid().toString(), + Arrays.toString(characteristic.getValue())); + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/59/d05cba9eed870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/59/d05cba9eed870014196aa5e86be5823c new file mode 100644 index 0000000..e9c937c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/59/d05cba9eed870014196aa5e86be5823c @@ -0,0 +1,158 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5d/4051e238f9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/5d/4051e238f9870014196aa5e86be5823c new file mode 100644 index 0000000..403bb1d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5d/4051e238f9870014196aa5e86be5823c @@ -0,0 +1,307 @@ +package com.motioncoding.miband.view; + +import android.R; +import android.app.Dialog; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.LinearGradient; +import android.graphics.Paint; +import android.graphics.Shader; +import android.os.Bundle; +import android.view.MotionEvent; +import android.view.View; + +public class ColorPickerDialog extends Dialog { + + public interface OnColorChangedListener { + void colorChanged(String key, int color); + } + + private OnColorChangedListener mListener; + private int mInitialColor, mDefaultColor; + private String mKey; + + private static class ColorPickerView extends View { + private Paint mPaint; + private float mCurrentHue = 0; + private int mCurrentX = 0, mCurrentY = 0; + private int mCurrentColor, mDefaultColor; + private final int[] mHueBarColors = new int[258]; + private int[] mMainColors = new int[65536]; + private OnColorChangedListener mListener; + + ColorPickerView(Context c, OnColorChangedListener l, int color, + int defaultColor) { + super(c); + mListener = l; + mDefaultColor = defaultColor; + + // Get the current hue from the current color and update the main + // color field + float[] hsv = new float[3]; + Color.colorToHSV(color, hsv); + mCurrentHue = hsv[0]; + updateMainColors(); + + mCurrentColor = color; + + // Initialize the colors of the hue slider bar + int index = 0; + for (float i = 0; i < 256; i += 256 / 42) // Red (#f00) to pink + // (#f0f) + { + mHueBarColors[index] = Color.rgb(255, 0, (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Pink (#f0f) to blue + // (#00f) + { + mHueBarColors[index] = Color.rgb(255 - (int) i, 0, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Blue (#00f) to light + // blue (#0ff) + { + mHueBarColors[index] = Color.rgb(0, (int) i, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Light blue (#0ff) to + // green (#0f0) + { + mHueBarColors[index] = Color.rgb(0, 255, 255 - (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Green (#0f0) to yellow + // (#ff0) + { + mHueBarColors[index] = Color.rgb((int) i, 255, 0); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Yellow (#ff0) to red + // (#f00) + { + mHueBarColors[index] = Color.rgb(255, 255 - (int) i, 0); + index++; + } + + // Initializes the Paint that will draw the View + mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mPaint.setTextAlign(Paint.Align.CENTER); + mPaint.setTextSize(12); + } + + // Get the current selected color from the hue bar + private int getCurrentMainColor() { + int translatedHue = 255 - (int) (mCurrentHue * 255 / 360); + int index = 0; + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(255, 0, (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(255 - (int) i, 0, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(0, (int) i, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(0, 255, 255 - (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb((int) i, 255, 0); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(255, 255 - (int) i, 0); + index++; + } + return Color.RED; + } + + // Update the main field colors depending on the current selected hue + private void updateMainColors() { + int mainColor = getCurrentMainColor(); + int index = 0; + int[] topColors = new int[256]; + for (int y = 0; y < 256; y++) { + for (int x = 0; x < 256; x++) { + if (y == 0) { + mMainColors[index] = Color.rgb( + 255 - (255 - Color.red(mainColor)) * x / 255, + 255 - (255 - Color.green(mainColor)) * x / 255, + 255 - (255 - Color.blue(mainColor)) * x / 255); + topColors[x] = mMainColors[index]; + } else + mMainColors[index] = Color.rgb( + (255 - y) * Color.red(topColors[x]) / 255, + (255 - y) * Color.green(topColors[x]) / 255, + (255 - y) * Color.blue(topColors[x]) / 255); + index++; + } + } + } + + @Override + protected void onDraw(Canvas canvas) { + int translatedHue = 255 - (int) (mCurrentHue * 255 / 360); + // Display all the colors of the hue bar with lines + for (int x = 0; x < 256; x++) { + // If this is not the current selected hue, display the actual + // color + if (translatedHue != x) { + mPaint.setColor(mHueBarColors[x]); + mPaint.setStrokeWidth(1); + } else // else display a slightly larger black line + { + mPaint.setColor(Color.BLACK); + mPaint.setStrokeWidth(3); + } + canvas.drawLine(x + 10, 0, x + 10, 40, mPaint); + // canvas.drawLine(0, x+10, 40, x+10, mPaint); + } + + // Display the main field colors using LinearGradient + for (int x = 0; x < 256; x++) { + int[] colors = new int[2]; + colors[0] = mMainColors[x]; + colors[1] = Color.BLACK; + Shader shader = new LinearGradient(0, 50, 0, 306, colors, null, + Shader.TileMode.REPEAT); + mPaint.setShader(shader); + canvas.drawLine(x + 10, 50, x + 10, 306, mPaint); + } + mPaint.setShader(null); + + // Display the circle around the currently selected color in the + // main field + if (mCurrentX != 0 && mCurrentY != 0) { + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setColor(Color.BLACK); + canvas.drawCircle(mCurrentX, mCurrentY, 10, mPaint); + } + + // Draw a 'button' with the currently selected color + mPaint.setStyle(Paint.Style.FILL); + mPaint.setColor(mCurrentColor); + canvas.drawRect(10, 316, 138, 356, mPaint); + + // Set the text color according to the brightness of the color + if (Color.red(mCurrentColor) + Color.green(mCurrentColor) + + Color.blue(mCurrentColor) < 384) + mPaint.setColor(Color.WHITE); + else + mPaint.setColor(Color.BLACK); + canvas.drawText( + "bg", 74, + 340, mPaint); + + // Draw a 'button' with the default color + mPaint.setStyle(Paint.Style.FILL); + mPaint.setColor(mDefaultColor); + canvas.drawRect(138, 316, 266, 356, mPaint); + + // Set the text color according to the brightness of the color + if (Color.red(mDefaultColor) + Color.green(mDefaultColor) + + Color.blue(mDefaultColor) < 384) + mPaint.setColor(Color.WHITE); + else + mPaint.setColor(Color.BLACK); + canvas.drawText( + "edf", 202, 340, + mPaint); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(276, 366); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (event.getAction() != MotionEvent.ACTION_DOWN) + return true; + float x = event.getX(); + float y = event.getY(); + + // If the touch event is located in the hue bar + if (x > 10 && x < 266 && y > 0 && y < 40) { + // Update the main field colors + mCurrentHue = (255 - x) * 360 / 255; + updateMainColors(); + + // Update the current selected color + int transX = mCurrentX - 10; + int transY = mCurrentY - 60; + int index = 256 * (transY - 1) + transX; + if (index > 0 && index < mMainColors.length) + mCurrentColor = mMainColors[256 * (transY - 1) + transX]; + + // Force the redraw of the dialog + invalidate(); + } + + // If the touch event is located in the main field + if (x > 10 && x < 266 && y > 50 && y < 306) { + mCurrentX = (int) x; + mCurrentY = (int) y; + int transX = mCurrentX - 10; + int transY = mCurrentY - 60; + int index = 256 * (transY - 1) + transX; + if (index > 0 && index < mMainColors.length) { + // Update the current color + mCurrentColor = mMainColors[index]; + // Force the redraw of the dialog + invalidate(); + } + } + + // If the touch event is located in the left button, notify the + // listener with the current color + if (x > 10 && x < 138 && y > 316 && y < 356) + mListener.colorChanged("", mCurrentColor); + + // If the touch event is located in the right button, notify the + // listener with the default color + if (x > 138 && x < 266 && y > 316 && y < 356) + mListener.colorChanged("", mDefaultColor); + + return true; + } + } + + public ColorPickerDialog(Context context, OnColorChangedListener listener, + String key, int initialColor, int defaultColor) { + super(context); + + mListener = listener; + mKey = key; + mInitialColor = initialColor; + mDefaultColor = defaultColor; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + OnColorChangedListener l = new OnColorChangedListener() { + public void colorChanged(String key, int color) { + mListener.colorChanged(mKey, color); + dismiss(); + } + }; + + setContentView(new ColorPickerView(getContext(), l, mInitialColor, + mDefaultColor)); + setTitle("Set LED Color"); + + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5d/6096e2b5df8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/5d/6096e2b5df8700141885aa2aa9523af4 new file mode 100644 index 0000000..968bce4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5d/6096e2b5df8700141885aa2aa9523af4 @@ -0,0 +1,44 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + + } + + + @Override + public void onResume() { + super.onResume(); + + } + + @Override + public void onPause() { + super.onPause(); + } + + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5d/b0dfbaa8e4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/5d/b0dfbaa8e4870014196aa5e86be5823c new file mode 100644 index 0000000..55b425b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5d/b0dfbaa8e4870014196aa5e86be5823c @@ -0,0 +1,35 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class MiBand { + + String mBTAddress; + int mSteps; + + + static class Battery { + int mBatteryLevel; + int mCycles; + Calendar mLastCharged; + + public static Battery fromByte(byte[] b) { + return null; + } + + static enum Status { + LOW, FULL, CHARGING, NOT_CHARGING; + + public static Status fromByte(byte b) { + switch (b) { + case 1: return LOW; + case 2: return CHARGING; + case 3: return FULL; + case 4: return NOT_CHARGING; + + default: return null; + } + } + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5e/5082c18adc8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/5082c18adc8700141885aa2aa9523af4 new file mode 100644 index 0000000..a2374b4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/5082c18adc8700141885aa2aa9523af4 @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5f/1015cee3e28700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/5f/1015cee3e28700141885aa2aa9523af4 new file mode 100644 index 0000000..475ac9c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5f/1015cee3e28700141885aa2aa9523af4 @@ -0,0 +1,96 @@ +package com.motioncoding.miband; + +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + BluetoothGattService service = mGatt.getService(UUID.fromString("00001800-0000-1000-8000-00805f9b34fb")); + BluetoothGattCharacteristic chrt = service.getCharacteristic(UUID.fromString("0000ff0f-0000-1000-8000-00805f9b34fb")); + + chrt.setValue(new byte[] {2}); + + mGatt.writeCharacteristic(chrt); + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + for (BluetoothGattService srvs : gatt.getServices()) { + System.out.println("Service: "+srvs.getUuid()); + for (BluetoothGattCharacteristic chrt : srvs + .getCharacteristics()) { + System.out.println("Characteristic: "+chrt.getUuid()+" with "+chrt.getProperties()); + } + } + } + + auth(); + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6/a0c491d5e8870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/6/a0c491d5e8870014196aa5e86be5823c new file mode 100644 index 0000000..575092a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6/a0c491d5e8870014196aa5e86be5823c @@ -0,0 +1,38 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class Battery { + public int mBatteryLevel; + public int mCycles; + public Calendar mLastCharged; + public Status mStatus; + + public static Battery fromByte(byte[] b) { + Battery battery = new Battery(); + battery.mBatteryLevel = b[0]; + battery.mStatus = Status.fromByte(b[9]); + + return battery; + } + + static enum Status { + LOW, FULL, CHARGING, NOT_CHARGING; + + public static Status fromByte(byte b) { + switch (b) { + case 1: + return LOW; + case 2: + return CHARGING; + case 3: + return FULL; + case 4: + return NOT_CHARGING; + + default: + return null; + } + } + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/61/c0b48cf8ec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/61/c0b48cf8ec870014196aa5e86be5823c new file mode 100644 index 0000000..d9871f1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/61/c0b48cf8ec870014196aa5e86be5823c @@ -0,0 +1,38 @@ + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/62/4005706df6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/62/4005706df6870014196aa5e86be5823c new file mode 100644 index 0000000..dadf73f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/62/4005706df6870014196aa5e86be5823c @@ -0,0 +1,15 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; + +public class MiLeParamsActivity extends ListActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi_le_params); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/62/80b62d30da8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/62/80b62d30da8700141885aa2aa9523af4 new file mode 100644 index 0000000..b0ce582 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/62/80b62d30da8700141885aa2aa9523af4 @@ -0,0 +1,76 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private Handler mHandler = new Handler(); + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if(Build.VERSION.SDK_INT >= 14) { + getActionBar().hide(); + } + + setContentView(R.layout.activity_mi); + mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter(); + } + + @Override + public void onResume() { + super.onResume(); + scanLeDevice(true); + } + + + + @SuppressWarnings("deprecation") // L Apis are buggy and crap! + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(MiActivity.this); + scanLeDevice(true); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + System.out.println(device.getName()+" "+device.getAddress()); + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + scanLeDevice(false); // we only care about one miband so that's enough + } + } + + @Override + public void onPause() { + super.onPause(); + scanLeDevice(false); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/63/f058ef1cf6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/63/f058ef1cf6870014196aa5e86be5823c new file mode 100644 index 0000000..a0fa936 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/63/f058ef1cf6870014196aa5e86be5823c @@ -0,0 +1,68 @@ +package com.motioncoding.miband.model; + +import android.os.Parcel; +import android.os.Parcelable; + +public class LeParams implements Parcelable { + public int connIntMin; + public int connIntMax; + public int latency; + public int timeout; + public int connInt; + public int advInt; + + public static LeParams fromByte(byte[] b) { + LeParams params = new LeParams(); + + params.connIntMax = 0xffff & (0xff & b[0] | (0xff & b[1]) << 8); + params.connIntMax = 0xffff & (0xff & b[2] | (0xff & b[3]) << 8); + params.latency = 0xffff & (0xff & b[4] | (0xff & b[5]) << 8); + params.timeout = 0xffff & (0xff & b[6] | (0xff & b[7]) << 8); + params.connInt = 0xffff & (0xff & b[8] | (0xff & b[9]) << 8); + params.advInt = 0xffff & (0xff & b[10] | (0xff & b[11]) << 8); + + params.connIntMin *= 1.25; + params.connIntMax *= 1.25; + params.advInt *= 0.625; + params.timeout *= 10; + + return params; + } + + protected LeParams(Parcel in) { + connIntMin = in.readInt(); + connIntMax = in.readInt(); + latency = in.readInt(); + timeout = in.readInt(); + connInt = in.readInt(); + advInt = in.readInt(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(connIntMin); + dest.writeInt(connIntMax); + dest.writeInt(latency); + dest.writeInt(timeout); + dest.writeInt(connInt); + dest.writeInt(advInt); + } + + @SuppressWarnings("unused") + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public LeParams createFromParcel(Parcel in) { + return new LeParams(in); + } + + @Override + public LeParams[] newArray(int size) { + return new LeParams[size]; + } + }; +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/67/105366f2da8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/67/105366f2da8700141885aa2aa9523af4 new file mode 100644 index 0000000..df37681 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/67/105366f2da8700141885aa2aa9523af4 @@ -0,0 +1,8 @@ + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/68/808d3ab6f7870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/68/808d3ab6f7870014196aa5e86be5823c new file mode 100644 index 0000000..add767b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/68/808d3ab6f7870014196aa5e86be5823c @@ -0,0 +1,231 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.LeParams; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_LE_PARAMS = UUID + .fromString("0000ff09-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.menu_overview, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_leparams: + Intent intent = new Intent(getApplicationContext(), MiLeParamsActivity.class); + intent.putExtra("params", mMiBand.mLeParams); + break; + } + return true; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService().getCharacteristic( + UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + // setColor((byte)127, (byte)0, (byte)0); + // request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + + // handle value + if (characteristic.getUuid().equals(UUID_CHAR_REALTIME_STEPS)) + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + else if (characteristic.getUuid().equals(UUID_CHAR_BATTERY)) { + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + } else if (characteristic.getUuid().equals(UUID_CHAR_DEVICE_NAME)) { + mMiBand.setName(new String(b)); + } else if (characteristic.getUuid().equals(UUID_CHAR_LE_PARAMS)) { + LeParams params = LeParams.fromByte(b); + mMiBand.setLeParams(params); + } + + // proceed with state machine (called in the beginning) + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + request(UUID_CHAR_LE_PARAMS); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6b/a008d1b0e4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/6b/a008d1b0e4870014196aa5e86be5823c new file mode 100644 index 0000000..0a3d7e3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6b/a008d1b0e4870014196aa5e86be5823c @@ -0,0 +1,5 @@ +package com.motioncoding.miband.model; + +public class Battery { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6c/00dcede8cf8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/6c/00dcede8cf8700141885aa2aa9523af4 new file mode 100644 index 0000000..a91fd03 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6c/00dcede8cf8700141885aa2aa9523af4 @@ -0,0 +1,12 @@ + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6c/50740a3bec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/6c/50740a3bec870014196aa5e86be5823c new file mode 100644 index 0000000..8a67111 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6c/50740a3bec870014196aa5e86be5823c @@ -0,0 +1,34 @@ +package com.motioncoding.miband.model; + +import java.util.Observable; + +import com.motioncoding.debugging.L; + + +public class MiBand extends Observable { + + public String mBTAddress; + public int mSteps; + public String mName; + public Battery mBattery; + + + + public void setName(String name) { + mName = name; + notifyObservers(); + } + + public void setSteps(int steps) { + mSteps = steps; + L.i("setting "+steps+" steps"); + notifyObservers(); + } + + public void setBattery(Battery battery) { + mBattery = battery; + L.i(battery.toString()); + notifyObservers(); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6e/50cd0ee9d68700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/6e/50cd0ee9d68700141885aa2aa9523af4 new file mode 100644 index 0000000..ead3598 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6e/50cd0ee9d68700141885aa2aa9523af4 @@ -0,0 +1,30 @@ +package com.motioncoding.miband; + +import android.annotation.TargetApi; +import android.app.Activity; +import android.bluetooth.BluetoothManager; +import android.bluetooth.le.ScanCallback; +import android.content.Context; +import android.os.Build; +import android.os.Bundle; + +@TargetApi(Build.VERSION_CODES.L) public class MiActivity extends Activity { + + private BluetoothManager bluetoothManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + + bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); + + lookForMiBand(); + } + + private void lookForMiBand() { + bluetoothManager.getAdapter().getBluetoothLeScanner() + .startScan(new ScanCallback() { + }); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6e/80e6d462f3870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/6e/80e6d462f3870014196aa5e86be5823c new file mode 100644 index 0000000..1bb5350 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6e/80e6d462f3870014196aa5e86be5823c @@ -0,0 +1,204 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService() + .getCharacteristic(UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + setColor(127, 0, 0); +// request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6e/c0192c29f9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/6e/c0192c29f9870014196aa5e86be5823c new file mode 100644 index 0000000..c13b566 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6e/c0192c29f9870014196aa5e86be5823c @@ -0,0 +1,309 @@ +package com.motioncoding.miband.view; + +import android.R; +import android.app.Dialog; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.LinearGradient; +import android.graphics.Paint; +import android.graphics.Shader; +import android.os.Bundle; +import android.view.MotionEvent; +import android.view.View; + +public class ColorPickerDialog extends Dialog { + + public interface OnColorChangedListener { + void colorChanged(String key, int color); + } + + private OnColorChangedListener mListener; + private int mInitialColor, mDefaultColor; + private String mKey; + + private static class ColorPickerView extends View { + private Paint mPaint; + private float mCurrentHue = 0; + private int mCurrentX = 0, mCurrentY = 0; + private int mCurrentColor, mDefaultColor; + private final int[] mHueBarColors = new int[258]; + private int[] mMainColors = new int[65536]; + private OnColorChangedListener mListener; + + ColorPickerView(Context c, OnColorChangedListener l, int color, + int defaultColor) { + super(c); + mListener = l; + mDefaultColor = defaultColor; + + // Get the current hue from the current color and update the main + // color field + float[] hsv = new float[3]; + Color.colorToHSV(color, hsv); + mCurrentHue = hsv[0]; + updateMainColors(); + + mCurrentColor = color; + + // Initialize the colors of the hue slider bar + int index = 0; + for (float i = 0; i < 256; i += 256 / 42) // Red (#f00) to pink + // (#f0f) + { + mHueBarColors[index] = Color.rgb(255, 0, (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Pink (#f0f) to blue + // (#00f) + { + mHueBarColors[index] = Color.rgb(255 - (int) i, 0, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Blue (#00f) to light + // blue (#0ff) + { + mHueBarColors[index] = Color.rgb(0, (int) i, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Light blue (#0ff) to + // green (#0f0) + { + mHueBarColors[index] = Color.rgb(0, 255, 255 - (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Green (#0f0) to yellow + // (#ff0) + { + mHueBarColors[index] = Color.rgb((int) i, 255, 0); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Yellow (#ff0) to red + // (#f00) + { + mHueBarColors[index] = Color.rgb(255, 255 - (int) i, 0); + index++; + } + + // Initializes the Paint that will draw the View + mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mPaint.setTextAlign(Paint.Align.CENTER); + mPaint.setTextSize(12); + } + + // Get the current selected color from the hue bar + private int getCurrentMainColor() { + int translatedHue = 255 - (int) (mCurrentHue * 255 / 360); + int index = 0; + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(255, 0, (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(255 - (int) i, 0, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(0, (int) i, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(0, 255, 255 - (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb((int) i, 255, 0); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(255, 255 - (int) i, 0); + index++; + } + return Color.RED; + } + + // Update the main field colors depending on the current selected hue + private void updateMainColors() { + int mainColor = getCurrentMainColor(); + int index = 0; + int[] topColors = new int[256]; + for (int y = 0; y < 256; y++) { + for (int x = 0; x < 256; x++) { + if (y == 0) { + mMainColors[index] = Color.rgb( + 255 - (255 - Color.red(mainColor)) * x / 255, + 255 - (255 - Color.green(mainColor)) * x / 255, + 255 - (255 - Color.blue(mainColor)) * x / 255); + topColors[x] = mMainColors[index]; + } else + mMainColors[index] = Color.rgb( + (255 - y) * Color.red(topColors[x]) / 255, + (255 - y) * Color.green(topColors[x]) / 255, + (255 - y) * Color.blue(topColors[x]) / 255); + index++; + } + } + } + + @Override + protected void onDraw(Canvas canvas) { + int translatedHue = 255 - (int) (mCurrentHue * 255 / 360); + // Display all the colors of the hue bar with lines + for (int x = 0; x < 256; x++) { + // If this is not the current selected hue, display the actual + // color + if (translatedHue != x) { + mPaint.setColor(mHueBarColors[x]); + mPaint.setStrokeWidth(1); + } else // else display a slightly larger black line + { + mPaint.setColor(Color.BLACK); + mPaint.setStrokeWidth(3); + } + canvas.drawLine(x + 10, 0, x + 10, 40, mPaint); + // canvas.drawLine(0, x+10, 40, x+10, mPaint); + } + + // Display the main field colors using LinearGradient + for (int x = 0; x < 256; x++) { + int[] colors = new int[2]; + colors[0] = mMainColors[x]; + colors[1] = Color.BLACK; + Shader shader = new LinearGradient(0, 50, 0, 306, colors, null, + Shader.TileMode.REPEAT); + mPaint.setShader(shader); + canvas.drawLine(x + 10, 50, x + 10, 306, mPaint); + } + mPaint.setShader(null); + + // Display the circle around the currently selected color in the + // main field + if (mCurrentX != 0 && mCurrentY != 0) { + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setColor(Color.BLACK); + canvas.drawCircle(mCurrentX, mCurrentY, 10, mPaint); + } + + // Draw a 'button' with the currently selected color + mPaint.setStyle(Paint.Style.FILL); + mPaint.setColor(mCurrentColor); + canvas.drawRect(10, 316, 138, 356, mPaint); + + // Set the text color according to the brightness of the color + if (Color.red(mCurrentColor) + Color.green(mCurrentColor) + + Color.blue(mCurrentColor) < 384) + mPaint.setColor(Color.WHITE); + else + mPaint.setColor(Color.BLACK); + canvas.drawText( + getResources() + .getString(R.string.settings_bg_color_confirm), 74, + 340, mPaint); + + // Draw a 'button' with the default color + mPaint.setStyle(Paint.Style.FILL); + mPaint.setColor(mDefaultColor); + canvas.drawRect(138, 316, 266, 356, mPaint); + + // Set the text color according to the brightness of the color + if (Color.red(mDefaultColor) + Color.green(mDefaultColor) + + Color.blue(mDefaultColor) < 384) + mPaint.setColor(Color.WHITE); + else + mPaint.setColor(Color.BLACK); + canvas.drawText( + getResources().getString( + R.string.settings_default_color_confirm), 202, 340, + mPaint); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(276, 366); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (event.getAction() != MotionEvent.ACTION_DOWN) + return true; + float x = event.getX(); + float y = event.getY(); + + // If the touch event is located in the hue bar + if (x > 10 && x < 266 && y > 0 && y < 40) { + // Update the main field colors + mCurrentHue = (255 - x) * 360 / 255; + updateMainColors(); + + // Update the current selected color + int transX = mCurrentX - 10; + int transY = mCurrentY - 60; + int index = 256 * (transY - 1) + transX; + if (index > 0 && index < mMainColors.length) + mCurrentColor = mMainColors[256 * (transY - 1) + transX]; + + // Force the redraw of the dialog + invalidate(); + } + + // If the touch event is located in the main field + if (x > 10 && x < 266 && y > 50 && y < 306) { + mCurrentX = (int) x; + mCurrentY = (int) y; + int transX = mCurrentX - 10; + int transY = mCurrentY - 60; + int index = 256 * (transY - 1) + transX; + if (index > 0 && index < mMainColors.length) { + // Update the current color + mCurrentColor = mMainColors[index]; + // Force the redraw of the dialog + invalidate(); + } + } + + // If the touch event is located in the left button, notify the + // listener with the current color + if (x > 10 && x < 138 && y > 316 && y < 356) + mListener.colorChanged("", mCurrentColor); + + // If the touch event is located in the right button, notify the + // listener with the default color + if (x > 138 && x < 266 && y > 316 && y < 356) + mListener.colorChanged("", mDefaultColor); + + return true; + } + } + + public ColorPickerDialog(Context context, OnColorChangedListener listener, + String key, int initialColor, int defaultColor) { + super(context); + + mListener = listener; + mKey = key; + mInitialColor = initialColor; + mDefaultColor = defaultColor; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + OnColorChangedListener l = new OnColorChangedListener() { + public void colorChanged(String key, int color) { + mListener.colorChanged(mKey, color); + dismiss(); + } + }; + + setContentView(new ColorPickerView(getContext(), l, mInitialColor, + mDefaultColor)); + setTitle("Pick a color"); + + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6f/30114ff0ed870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/6f/30114ff0ed870014196aa5e86be5823c new file mode 100644 index 0000000..151753a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6f/30114ff0ed870014196aa5e86be5823c @@ -0,0 +1,166 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/73/90c89f2dee870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/73/90c89f2dee870014196aa5e86be5823c new file mode 100644 index 0000000..ecbc12a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/73/90c89f2dee870014196aa5e86be5823c @@ -0,0 +1,182 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.ProgressBar; +import android.widget.Spinner; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + //BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + + private MiBand mMiBand = new MiBand(); + + //UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + mLoading.setVisibility(View.GONE); + mTVSteps.setText(mMiBand.mSteps); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/73/d0e350e6ec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/73/d0e350e6ec870014196aa5e86be5823c new file mode 100644 index 0000000..3209d40 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/73/d0e350e6ec870014196aa5e86be5823c @@ -0,0 +1,25 @@ + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/75/d08c2eaeee870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/75/d08c2eaeee870014196aa5e86be5823c new file mode 100644 index 0000000..aa8d0f1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/75/d08c2eaeee870014196aa5e86be5823c @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/76/10d8ee12e9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/76/10d8ee12e9870014196aa5e86be5823c new file mode 100644 index 0000000..baa0ccd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/76/10d8ee12e9870014196aa5e86be5823c @@ -0,0 +1,38 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class Battery { + public int mBatteryLevel; + public int mCycles; + public Calendar mLastCharged; + public Status mStatus; + + public static Battery fromByte(byte[] b) { + Battery battery = new Battery(); + battery.mBatteryLevel = b[0]; + battery.mStatus = Status.fromByte(b[9]); + battery.mCycles = 0xffff & (0xff & b[7] | (0xff & b[8]) << 8); + return battery; + } + + static enum Status { + LOW, FULL, CHARGING, NOT_CHARGING; + + public static Status fromByte(byte b) { + switch (b) { + case 1: + return LOW; + case 2: + return CHARGING; + case 3: + return FULL; + case 4: + return NOT_CHARGING; + + default: + return null; + } + } + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/76/e0ac720ce5870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/76/e0ac720ce5870014196aa5e86be5823c new file mode 100644 index 0000000..c26f1a3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/76/e0ac720ce5870014196aa5e86be5823c @@ -0,0 +1,102 @@ +package com.motioncoding.miband; + +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID.fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH =UUID.fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS=UUID.fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY =UUID.fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + BluetoothGattService service = mGatt.getService(UUID_MILI_SERVICE); + BluetoothGattCharacteristic chrt = service.getCharacteristic(UUID_CHAR_AUTH); + + chrt.setValue(new byte[] {2}); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + for (BluetoothGattService srvs : gatt.getServices()) { + System.out.println("Service: "+srvs.getUuid()); + for (BluetoothGattCharacteristic chrt : srvs + .getCharacteristics()) { + System.out.println("Characteristic: "+chrt.getUuid()+" with "+chrt.getProperties()); + } + } + } + + auth(); + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/77/70327500f7870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/77/70327500f7870014196aa5e86be5823c new file mode 100644 index 0000000..d55d791 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/77/70327500f7870014196aa5e86be5823c @@ -0,0 +1,70 @@ +package com.motioncoding.miband.model; + +import android.os.Parcel; +import android.os.Parcelable; + +public class LeParams implements Parcelable { + public int connIntMin; + public int connIntMax; + public int latency; + public int timeout; + public int connInt; + public int advInt; + + public static LeParams fromByte(byte[] b) { + LeParams params = new LeParams(); + + params.connIntMax = 0xffff & (0xff & b[0] | (0xff & b[1]) << 8); + params.connIntMax = 0xffff & (0xff & b[2] | (0xff & b[3]) << 8); + params.latency = 0xffff & (0xff & b[4] | (0xff & b[5]) << 8); + params.timeout = 0xffff & (0xff & b[6] | (0xff & b[7]) << 8); + params.connInt = 0xffff & (0xff & b[8] | (0xff & b[9]) << 8); + params.advInt = 0xffff & (0xff & b[10] | (0xff & b[11]) << 8); + + params.connIntMin *= 1.25; + params.connIntMax *= 1.25; + params.advInt *= 0.625; + params.timeout *= 10; + + return params; + } + + protected LeParams() {} + + protected LeParams(Parcel in) { + connIntMin = in.readInt(); + connIntMax = in.readInt(); + latency = in.readInt(); + timeout = in.readInt(); + connInt = in.readInt(); + advInt = in.readInt(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(connIntMin); + dest.writeInt(connIntMax); + dest.writeInt(latency); + dest.writeInt(timeout); + dest.writeInt(connInt); + dest.writeInt(advInt); + } + + @SuppressWarnings("unused") + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public LeParams createFromParcel(Parcel in) { + return new LeParams(in); + } + + @Override + public LeParams[] newArray(int size) { + return new LeParams[size]; + } + }; +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/78/308299a3e38700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/78/308299a3e38700141885aa2aa9523af4 new file mode 100644 index 0000000..75b24f6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/78/308299a3e38700141885aa2aa9523af4 @@ -0,0 +1,98 @@ +package com.motioncoding.miband; + +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID.fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + BluetoothGattService service = mGatt.getService(UUID_MILI_SERVICE); + BluetoothGattCharacteristic chrt = service.getCharacteristic(UUID.fromString("0000ff0f-0000-1000-8000-00805f9b34fb")); + + chrt.setValue(new byte[] {2}); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + for (BluetoothGattService srvs : gatt.getServices()) { + System.out.println("Service: "+srvs.getUuid()); + for (BluetoothGattCharacteristic chrt : srvs + .getCharacteristics()) { + System.out.println("Characteristic: "+chrt.getUuid()+" with "+chrt.getProperties()); + } + } + } + + auth(); + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/79/10cae10de18700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/79/10cae10de18700141885aa2aa9523af4 new file mode 100644 index 0000000..c7d2912 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/79/10cae10de18700141885aa2aa9523af4 @@ -0,0 +1,80 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + for (BluetoothGattService service : gatt.getServices()) { + for (BluetoothGattCharacteristic chrt : service + .getCharacteristics()) { + } + } + } + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (status == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/79/e07057f2d88700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/79/e07057f2d88700141885aa2aa9523af4 new file mode 100644 index 0000000..2c10201 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/79/e07057f2d88700141885aa2aa9523af4 @@ -0,0 +1,71 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private Handler mHandler = new Handler(); + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter(); + } + + @Override + public void onResume() { + super.onResume(); + scanLeDevice(true); + } + + + + @SuppressWarnings("deprecation") // L Apis are buggy and crap! + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(MiActivity.this); + scanLeDevice(true); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + scanLeDevice(false); // we only care about one miband so that's enough + } + } + + @Override + public void onPause() { + super.onPause(); + scanLeDevice(false); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7a/108362d9e5870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/7a/108362d9e5870014196aa5e86be5823c new file mode 100644 index 0000000..dcfdcdb --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7a/108362d9e5870014196aa5e86be5823c @@ -0,0 +1,112 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void requestSteps() { + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic(UUID_CHAR_REALTIME_STEPS); + mGatt.readCharacteristic(chrt); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + requestSteps(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + Log.i(characteristic.getUuid().toString(), Arrays.toString(characteristic.getValue())); + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7b/0005672cef870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/7b/0005672cef870014196aa5e86be5823c new file mode 100644 index 0000000..980c988 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7b/0005672cef870014196aa5e86be5823c @@ -0,0 +1,193 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.GONE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7c/8020c9c3eb870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/7c/8020c9c3eb870014196aa5e86be5823c new file mode 100644 index 0000000..4c96e54 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7c/8020c9c3eb870014196aa5e86be5823c @@ -0,0 +1,155 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7d/005b9164dc8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/7d/005b9164dc8700141885aa2aa9523af4 new file mode 100644 index 0000000..416f1bf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7d/005b9164dc8700141885aa2aa9523af4 @@ -0,0 +1,8 @@ + + + + MiBand + Hello world! + MiBand not found. Is it in range? + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7d/007705efe9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/7d/007705efe9870014196aa5e86be5823c new file mode 100644 index 0000000..ce1fdaf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7d/007705efe9870014196aa5e86be5823c @@ -0,0 +1,14 @@ +package com.motioncoding.miband.model; + + +public class MiBand { + + public String mBTAddress; + public int mSteps; + public Battery mBattery; + + public void setBattery(Battery battery) { + mBattery = battery; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7d/70fdcc1ff6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/7d/70fdcc1ff6870014196aa5e86be5823c new file mode 100644 index 0000000..030d307 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7d/70fdcc1ff6870014196aa5e86be5823c @@ -0,0 +1,70 @@ +package com.motioncoding.miband.model; + +import android.os.Parcel; +import android.os.Parcelable; + +public class LeParams implements Parcelable { + public int connIntMin; + public int connIntMax; + public int latency; + public int timeout; + public int connInt; + public int advInt; + + public static LeParams fromByte(byte[] b) { + LeParams params = new LeParams(); + + params.connIntMax = 0xffff & (0xff & b[0] | (0xff & b[1]) << 8); + params.connIntMax = 0xffff & (0xff & b[2] | (0xff & b[3]) << 8); + params.latency = 0xffff & (0xff & b[4] | (0xff & b[5]) << 8); + params.timeout = 0xffff & (0xff & b[6] | (0xff & b[7]) << 8); + params.connInt = 0xffff & (0xff & b[8] | (0xff & b[9]) << 8); + params.advInt = 0xffff & (0xff & b[10] | (0xff & b[11]) << 8); + + params.connIntMin *= 1.25; + params.connIntMax *= 1.25; + params.advInt *= 0.625; + params.timeout *= 10; + + return params; + } + + protected LeParams() {} + + protected LeParams(Parcel in) { + connIntMin = in.readInt(); + connIntMax = in.readInt(); + latency = in.readInt(); + timeout = in.readInt(); + connInt = in.readInt(); + advInt = in.readInt(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(connIntMin); + dest.writeInt(connIntMax); + dest.writeInt(latency); + dest.writeInt(timeout); + dest.writeInt(connInt); + dest.writeInt(advInt); + } + + @SuppressWarnings("unused") + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public LeParams createFromParcel(Parcel in) { + return new LeParams(in); + } + + @Override + public LeParams[] newArray(int size) { + return new LeParams[size]; + } + }; +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7e/406193bdf4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/7e/406193bdf4870014196aa5e86be5823c new file mode 100644 index 0000000..cacec49 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7e/406193bdf4870014196aa5e86be5823c @@ -0,0 +1,13 @@ +package com.motioncoding.miband.model; + +public class LeParams { + public int connIntMin, connIntMax, latency, timeout, connInt, advInt; + + public static LeParams fromByte(byte[] b) { + LeParams params = new LeParams(); + + + + return params; + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7e/900bfedde28700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/7e/900bfedde28700141885aa2aa9523af4 new file mode 100644 index 0000000..b302808 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7e/900bfedde28700141885aa2aa9523af4 @@ -0,0 +1,94 @@ +package com.motioncoding.miband; + +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + BluetoothGattService service = mGatt.getService(UUID.fromString("00001800-0000-1000-8000-00805f9b34fb")); + BluetoothGattCharacteristic chrt = service.getCharacteristic(UUID.fromString("0000ff0f-0000-1000-8000-00805f9b34fb")); + mGatt.writeCharacteristic(chrt); +// mGatt.writeCharacteristic(); + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + for (BluetoothGattService srvs : gatt.getServices()) { + System.out.println("Service: "+srvs.getUuid()); + for (BluetoothGattCharacteristic chrt : srvs + .getCharacteristics()) { + System.out.println("Characteristic: "+chrt.getUuid()+" with "+chrt.getProperties()); + } + } + } + + auth(); + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8/50195647db8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/8/50195647db8700141885aa2aa9523af4 new file mode 100644 index 0000000..f21631c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8/50195647db8700141885aa2aa9523af4 @@ -0,0 +1,26 @@ + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/80/20e8cf3ee9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/80/20e8cf3ee9870014196aa5e86be5823c new file mode 100644 index 0000000..7b09067 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/80/20e8cf3ee9870014196aa5e86be5823c @@ -0,0 +1,151 @@ +package com.motioncoding.miband; + +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after auth() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(characteristic.getValue())); + switch (state) { + case 0: + System.out.println(characteristic.getIntValue(0, 0)); + break; + case 1: + Battery bat = Battery.fromByte(characteristic.getValue()); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_ACTIVITY); + break; + case 3: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/82/30cbfcb7dc8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/82/30cbfcb7dc8700141885aa2aa9523af4 new file mode 100644 index 0000000..50fe8d0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/82/30cbfcb7dc8700141885aa2aa9523af4 @@ -0,0 +1,12 @@ + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/83/104252ece28700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/83/104252ece28700141885aa2aa9523af4 new file mode 100644 index 0000000..dac96d9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/83/104252ece28700141885aa2aa9523af4 @@ -0,0 +1,96 @@ +package com.motioncoding.miband; + +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + BluetoothGattService service = mGatt.getService(UUID.fromString("00001800-0000-1000-8000-00805f9b34fb")); + BluetoothGattCharacteristic chrt = service.getCharacteristic(UUID.fromString("0000ff0f-0000-1000-8000-00805f9b34fb")); + + chrt.setValue(new byte[] {2}); + + mGatt.writeCharacteristic(chrt); + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { +// if (status == BluetoothGatt.GATT_SUCCESS) { +// for (BluetoothGattService srvs : gatt.getServices()) { +// System.out.println("Service: "+srvs.getUuid()); +// for (BluetoothGattCharacteristic chrt : srvs +// .getCharacteristics()) { +// System.out.println("Characteristic: "+chrt.getUuid()+" with "+chrt.getProperties()); +// } +// } +// } + + auth(); + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/83/6089b2dbec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/83/6089b2dbec870014196aa5e86be5823c new file mode 100644 index 0000000..c9a20c3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/83/6089b2dbec870014196aa5e86be5823c @@ -0,0 +1,25 @@ + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/86/4068d810f6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/86/4068d810f6870014196aa5e86be5823c new file mode 100644 index 0000000..c002108 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/86/4068d810f6870014196aa5e86be5823c @@ -0,0 +1,96 @@ +package com.motioncoding.miband.model; + +import android.os.Parcel; +import android.os.Parcelable; + +public class LeParams { + public int connIntMin; + public int connIntMax; + public int latency; + public int timeout; + public int connInt; + public int advInt; + + public static LeParams fromByte(byte[] b) { + LeParams params = new LeParams(); + + params.connIntMax = 0xffff & (0xff & b[0] | (0xff & b[1]) << 8); + params.connIntMax = 0xffff & (0xff & b[2] | (0xff & b[3]) << 8); + params.latency = 0xffff & (0xff & b[4] | (0xff & b[5]) << 8); + params.timeout = 0xffff & (0xff & b[6] | (0xff & b[7]) << 8); + params.connInt = 0xffff & (0xff & b[8] | (0xff & b[9]) << 8); + params.advInt = 0xffff & (0xff & b[10] | (0xff & b[11]) << 8); + + params.connIntMin *= 1.25; + params.connIntMax *= 1.25; + params.advInt *= 0.625; + params.timeout *= 10; + + return params; + } +} +package com.motioncoding.miband.model; + +public class LeParams implements Parcelable { + public int connIntMin; + public int connIntMax; + public int latency; + public int timeout; + public int connInt; + public int advInt; + + public static LeParams fromByte(byte[] b) { + LeParams params = new LeParams(); + + params.connIntMax = 0xffff & (0xff & b[0] | (0xff & b[1]) << 8); + params.connIntMax = 0xffff & (0xff & b[2] | (0xff & b[3]) << 8); + params.latency = 0xffff & (0xff & b[4] | (0xff & b[5]) << 8); + params.timeout = 0xffff & (0xff & b[6] | (0xff & b[7]) << 8); + params.connInt = 0xffff & (0xff & b[8] | (0xff & b[9]) << 8); + params.advInt = 0xffff & (0xff & b[10] | (0xff & b[11]) << 8); + + params.connIntMin *= 1.25; + params.connIntMax *= 1.25; + params.advInt *= 0.625; + params.timeout *= 10; + + return params; + } + + protected LeParams(Parcel in) { + connIntMin = in.readInt(); + connIntMax = in.readInt(); + latency = in.readInt(); + timeout = in.readInt(); + connInt = in.readInt(); + advInt = in.readInt(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(connIntMin); + dest.writeInt(connIntMax); + dest.writeInt(latency); + dest.writeInt(timeout); + dest.writeInt(connInt); + dest.writeInt(advInt); + } + + @SuppressWarnings("unused") + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public LeParams createFromParcel(Parcel in) { + return new LeParams(in); + } + + @Override + public LeParams[] newArray(int size) { + return new LeParams[size]; + } + }; +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/86/d01d9e4ed08700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/86/d01d9e4ed08700141885aa2aa9523af4 new file mode 100644 index 0000000..439594d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/86/d01d9e4ed08700141885aa2aa9523af4 @@ -0,0 +1,12 @@ + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/87/5053714aec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/87/5053714aec870014196aa5e86be5823c new file mode 100644 index 0000000..0296466 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/87/5053714aec870014196aa5e86be5823c @@ -0,0 +1,55 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class Battery { + public int mBatteryLevel; + public int mCycles; + public Calendar mLastCharged; + public Status mStatus; + + public static Battery fromByte(byte[] b) { + Battery battery = new Battery(); + battery.mBatteryLevel = b[0]; + battery.mStatus = Status.fromByte(b[9]); + battery.mLastCharged = Calendar.getInstance(); + + battery.mLastCharged.set(Calendar.YEAR, b[1]+2000); + battery.mLastCharged.set(Calendar.MONTH, b[2]); + battery.mLastCharged.set(Calendar.DATE, b[3]); + + battery.mLastCharged.set(Calendar.HOUR_OF_DAY, b[4]); + battery.mLastCharged.set(Calendar.MINUTE, b[5]); + battery.mLastCharged.set(Calendar.SECOND, b[6]); + + + + battery.mCycles = 0xffff & (0xff & b[7] | (0xff & b[8]) << 8); + return battery; + } + + @Override + public String toString() { + return String.format("Level: %s Cycles: %s State: %s Last Charged: %s", mBatteryLevel, mCycles, mStatus.toString(), mLastCharged.toString()); + } + + static enum Status { + LOW, FULL, CHARGING, NOT_CHARGING; + + public static Status fromByte(byte b) { + switch (b) { + case 1: + return LOW; + case 2: + return CHARGING; + case 3: + return FULL; + case 4: + return NOT_CHARGING; + + default: + return null; + } + } + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8b/b066a8b4f5870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/8b/b066a8b4f5870014196aa5e86be5823c new file mode 100644 index 0000000..d385310 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8b/b066a8b4f5870014196aa5e86be5823c @@ -0,0 +1,207 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.LeParams; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_LE_PARAMS = UUID + .fromString("0000ff09-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService() + .getCharacteristic(UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() +// setColor((byte)127, (byte)0, (byte)0); +// request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + if(characteristic.getUuid().equals(UUID_CHAR_REALTIME_STEPS)) + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + else if(characteristic.getUuid().equals(UUID_CHAR_BATTERY)) { + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + } else if(characteristic.getUuid().equals(UUID_CHAR_DEVICE_NAME)) { + mMiBand.setName(new String(b)); + } else if(characteristic.getUuid().equals(UUID_CHAR_LE_PARAMS)) { + LeParams params = LeParams.fromByte(b); + mMiBand.setLeParams(params); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + request(UUID_CHAR_LE_PARAMS); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8b/e090d076e8870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/8b/e090d076e8870014196aa5e86be5823c new file mode 100644 index 0000000..3818315 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8b/e090d076e8870014196aa5e86be5823c @@ -0,0 +1,12 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class MiBand { + + String mBTAddress; + int mSteps; + Battery mBattery; + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8b/f07427bfd78700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/8b/f07427bfd78700141885aa2aa9523af4 new file mode 100644 index 0000000..25ac15f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8b/f07427bfd78700141885aa2aa9523af4 @@ -0,0 +1,40 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothManager bluetoothManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); + } + + @Override + public void onResume() { + super.onResume(); + bluetoothManager.getAdapter().startLeScan(this); + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + bluetoothManager.getAdapter().stopLeScan(this); + } + } + + @Override + public void onPause() { + super.onPause(); + bluetoothManager.getAdapter().stopLeScan(this); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9/50b11535d78700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/9/50b11535d78700141885aa2aa9523af4 new file mode 100644 index 0000000..7a8ff49 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9/50b11535d78700141885aa2aa9523af4 @@ -0,0 +1,28 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothManager; +import android.bluetooth.le.ScanCallback; +import android.content.Context; +import android.os.Bundle; + +public class MiActivity extends Activity { + + private BluetoothManager bluetoothManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + + bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); + + lookForMiBand(); + } + + private void lookForMiBand() { + bluetoothManager.getAdapter().getBluetoothLeScanner() + .startScan(new ScanCallback() { + }); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/92/d0e40a4af6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/92/d0e40a4af6870014196aa5e86be5823c new file mode 100644 index 0000000..7899f41 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/92/d0e40a4af6870014196aa5e86be5823c @@ -0,0 +1,10 @@ + + + + MiBand + Hello world! + MiBand not found. Is it in range? + MiOverviewActivity + Looking for MiBand + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/95/10e503dce9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/95/10e503dce9870014196aa5e86be5823c new file mode 100644 index 0000000..787e001 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/95/10e503dce9870014196aa5e86be5823c @@ -0,0 +1,155 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after auth() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(characteristic.getValue())); + switch (state) { + case 0: + System.out.println(characteristic.getIntValue(0, 0)); + break; + case 1: + Battery bat = Battery.fromByte(characteristic.getValue()); + System.out.println(); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_ACTIVITY); + break; + case 3: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/95/50eef3efec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/95/50eef3efec870014196aa5e86be5823c new file mode 100644 index 0000000..adb0f3e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/95/50eef3efec870014196aa5e86be5823c @@ -0,0 +1,26 @@ + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/95/e0119313ea870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/95/e0119313ea870014196aa5e86be5823c new file mode 100644 index 0000000..3a4668f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/95/e0119313ea870014196aa5e86be5823c @@ -0,0 +1,21 @@ +package com.motioncoding.miband.model; + +import java.util.Observable; + + +public class MiBand extends Observable{ + + public String mBTAddress; + public int mSteps; + public Battery mBattery; + + + public void setSteps(int steps) { + mSteps = steps; + } + + public void setBattery(Battery battery) { + mBattery = battery; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/96/30f593a3e9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/96/30f593a3e9870014196aa5e86be5823c new file mode 100644 index 0000000..e1ac145 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/96/30f593a3e9870014196aa5e86be5823c @@ -0,0 +1,12 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class MiBand { + + public String mBTAddress; + public int mSteps; + public Battery mBattery; + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/97/90d345a1f6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/97/90d345a1f6870014196aa5e86be5823c new file mode 100644 index 0000000..a1703d7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/97/90d345a1f6870014196aa5e86be5823c @@ -0,0 +1,6 @@ + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9a/406dce4cd88700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/9a/406dce4cd88700141885aa2aa9523af4 new file mode 100644 index 0000000..ccf79e3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9a/406dce4cd88700141885aa2aa9523af4 @@ -0,0 +1,69 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private Handler mHandler; + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter(); + } + + @Override + public void onResume() { + super.onResume(); + scanLeDevice(true); + } + + + + @SuppressWarnings("deprecation") // L Apis are buggy and crap! + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(MiActivity.this); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + scanLeDevice(false); // we only care about one miband so that's enough + } + } + + @Override + public void onPause() { + super.onPause(); + scanLeDevice(false); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9a/902a44cee28700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/9a/902a44cee28700141885aa2aa9523af4 new file mode 100644 index 0000000..36cfb42 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9a/902a44cee28700141885aa2aa9523af4 @@ -0,0 +1,82 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + for (BluetoothGattService srvs : gatt.getServices()) { + System.out.println("Service: "+srvs.getUuid()); + for (BluetoothGattCharacteristic chrt : srvs + .getCharacteristics()) { + System.out.println("Characteristic: "+chrt.getUuid()+" with "+chrt.getProperties()); + } + } + } + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9a/b086a6bce8870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/9a/b086a6bce8870014196aa5e86be5823c new file mode 100644 index 0000000..19b61c1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9a/b086a6bce8870014196aa5e86be5823c @@ -0,0 +1,36 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class Battery { + public int mBatteryLevel; + public int mCycles; + public Calendar mLastCharged; + + public static Battery fromByte(byte[] b) { + Battery battery = new Battery(); + battery.mBatteryLevel = b[0]; + + return battery; + } + + static enum Status { + LOW, FULL, CHARGING, NOT_CHARGING; + + public static Status fromByte(byte b) { + switch (b) { + case 1: + return LOW; + case 2: + return CHARGING; + case 3: + return FULL; + case 4: + return NOT_CHARGING; + + default: + return null; + } + } + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9a/f0e5928ce7870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/9a/f0e5928ce7870014196aa5e86be5823c new file mode 100644 index 0000000..6ebe536 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9a/f0e5928ce7870014196aa5e86be5823c @@ -0,0 +1,137 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after auth() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(characteristic.getValue())); + switch (state) { + case 0: + System.out.println(characteristic.getIntValue(0, 0)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + } + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9b/301c16a3f5870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/9b/301c16a3f5870014196aa5e86be5823c new file mode 100644 index 0000000..2aef266 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9b/301c16a3f5870014196aa5e86be5823c @@ -0,0 +1,207 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.LeParams; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_LE_PARAMS = UUID + .fromString("0000ff09-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService() + .getCharacteristic(UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() +// setColor((byte)127, (byte)0, (byte)0); +// request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + if(characteristic.getUuid().equals(UUID_CHAR_REALTIME_STEPS)) + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + else if(characteristic.getUuid().equals(UUID_CHAR_BATTERY)) { + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + } else if(characteristic.getUuid().equals(UUID_CHAR_DEVICE_NAME)) { + mMiBand.setName(new String(b)); + } else if(characteristic.getUuid().equals(UUID_CHAR_)) { + LeParams params = LeParams.fromByte(b); + mMiBand.setLeParams(params); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + request(UUID_LE_PARAMS); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9b/80ddf6d3e18700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/9b/80ddf6d3e18700141885aa2aa9523af4 new file mode 100644 index 0000000..05374fa --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9b/80ddf6d3e18700141885aa2aa9523af4 @@ -0,0 +1,82 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + for (BluetoothGattService srvs : gatt.getServices()) { + System.out.println("Service: "+srvs.getUuid()); + for (BluetoothGattCharacteristic chrt : srvs + .getCharacteristics()) { + System.out.println("Characteristic: "+chrt.getUuid()+" rwx: "+chrt.getProperties()); + } + } + } + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9e/1032dea1ed870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/9e/1032dea1ed870014196aa5e86be5823c new file mode 100644 index 0000000..fa7aa41 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9e/1032dea1ed870014196aa5e86be5823c @@ -0,0 +1,167 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + // TODO Auto-generated method stub + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9e/9062150ef4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/9e/9062150ef4870014196aa5e86be5823c new file mode 100644 index 0000000..0f8ffc9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9e/9062150ef4870014196aa5e86be5823c @@ -0,0 +1,5 @@ +package com.motioncoding.miband.model; + +public class LeParams { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a/b0ebe737f9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/a/b0ebe737f9870014196aa5e86be5823c new file mode 100644 index 0000000..eb50bec --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a/b0ebe737f9870014196aa5e86be5823c @@ -0,0 +1,309 @@ +package com.motioncoding.miband.view; + +import android.R; +import android.app.Dialog; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.LinearGradient; +import android.graphics.Paint; +import android.graphics.Shader; +import android.os.Bundle; +import android.view.MotionEvent; +import android.view.View; + +public class ColorPickerDialog extends Dialog { + + public interface OnColorChangedListener { + void colorChanged(String key, int color); + } + + private OnColorChangedListener mListener; + private int mInitialColor, mDefaultColor; + private String mKey; + + private static class ColorPickerView extends View { + private Paint mPaint; + private float mCurrentHue = 0; + private int mCurrentX = 0, mCurrentY = 0; + private int mCurrentColor, mDefaultColor; + private final int[] mHueBarColors = new int[258]; + private int[] mMainColors = new int[65536]; + private OnColorChangedListener mListener; + + ColorPickerView(Context c, OnColorChangedListener l, int color, + int defaultColor) { + super(c); + mListener = l; + mDefaultColor = defaultColor; + + // Get the current hue from the current color and update the main + // color field + float[] hsv = new float[3]; + Color.colorToHSV(color, hsv); + mCurrentHue = hsv[0]; + updateMainColors(); + + mCurrentColor = color; + + // Initialize the colors of the hue slider bar + int index = 0; + for (float i = 0; i < 256; i += 256 / 42) // Red (#f00) to pink + // (#f0f) + { + mHueBarColors[index] = Color.rgb(255, 0, (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Pink (#f0f) to blue + // (#00f) + { + mHueBarColors[index] = Color.rgb(255 - (int) i, 0, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Blue (#00f) to light + // blue (#0ff) + { + mHueBarColors[index] = Color.rgb(0, (int) i, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Light blue (#0ff) to + // green (#0f0) + { + mHueBarColors[index] = Color.rgb(0, 255, 255 - (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Green (#0f0) to yellow + // (#ff0) + { + mHueBarColors[index] = Color.rgb((int) i, 255, 0); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Yellow (#ff0) to red + // (#f00) + { + mHueBarColors[index] = Color.rgb(255, 255 - (int) i, 0); + index++; + } + + // Initializes the Paint that will draw the View + mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mPaint.setTextAlign(Paint.Align.CENTER); + mPaint.setTextSize(12); + } + + // Get the current selected color from the hue bar + private int getCurrentMainColor() { + int translatedHue = 255 - (int) (mCurrentHue * 255 / 360); + int index = 0; + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(255, 0, (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(255 - (int) i, 0, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(0, (int) i, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(0, 255, 255 - (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb((int) i, 255, 0); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(255, 255 - (int) i, 0); + index++; + } + return Color.RED; + } + + // Update the main field colors depending on the current selected hue + private void updateMainColors() { + int mainColor = getCurrentMainColor(); + int index = 0; + int[] topColors = new int[256]; + for (int y = 0; y < 256; y++) { + for (int x = 0; x < 256; x++) { + if (y == 0) { + mMainColors[index] = Color.rgb( + 255 - (255 - Color.red(mainColor)) * x / 255, + 255 - (255 - Color.green(mainColor)) * x / 255, + 255 - (255 - Color.blue(mainColor)) * x / 255); + topColors[x] = mMainColors[index]; + } else + mMainColors[index] = Color.rgb( + (255 - y) * Color.red(topColors[x]) / 255, + (255 - y) * Color.green(topColors[x]) / 255, + (255 - y) * Color.blue(topColors[x]) / 255); + index++; + } + } + } + + @Override + protected void onDraw(Canvas canvas) { + int translatedHue = 255 - (int) (mCurrentHue * 255 / 360); + // Display all the colors of the hue bar with lines + for (int x = 0; x < 256; x++) { + // If this is not the current selected hue, display the actual + // color + if (translatedHue != x) { + mPaint.setColor(mHueBarColors[x]); + mPaint.setStrokeWidth(1); + } else // else display a slightly larger black line + { + mPaint.setColor(Color.BLACK); + mPaint.setStrokeWidth(3); + } + canvas.drawLine(x + 10, 0, x + 10, 40, mPaint); + // canvas.drawLine(0, x+10, 40, x+10, mPaint); + } + + // Display the main field colors using LinearGradient + for (int x = 0; x < 256; x++) { + int[] colors = new int[2]; + colors[0] = mMainColors[x]; + colors[1] = Color.BLACK; + Shader shader = new LinearGradient(0, 50, 0, 306, colors, null, + Shader.TileMode.REPEAT); + mPaint.setShader(shader); + canvas.drawLine(x + 10, 50, x + 10, 306, mPaint); + } + mPaint.setShader(null); + + // Display the circle around the currently selected color in the + // main field + if (mCurrentX != 0 && mCurrentY != 0) { + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setColor(Color.BLACK); + canvas.drawCircle(mCurrentX, mCurrentY, 10, mPaint); + } + + // Draw a 'button' with the currently selected color + mPaint.setStyle(Paint.Style.FILL); + mPaint.setColor(mCurrentColor); + canvas.drawRect(10, 316, 138, 356, mPaint); + + // Set the text color according to the brightness of the color + if (Color.red(mCurrentColor) + Color.green(mCurrentColor) + + Color.blue(mCurrentColor) < 384) + mPaint.setColor(Color.WHITE); + else + mPaint.setColor(Color.BLACK); + canvas.drawText( + getResources() + .getString(R.string.settings_bg_color_confirm), 74, + 340, mPaint); + + // Draw a 'button' with the default color + mPaint.setStyle(Paint.Style.FILL); + mPaint.setColor(mDefaultColor); + canvas.drawRect(138, 316, 266, 356, mPaint); + + // Set the text color according to the brightness of the color + if (Color.red(mDefaultColor) + Color.green(mDefaultColor) + + Color.blue(mDefaultColor) < 384) + mPaint.setColor(Color.WHITE); + else + mPaint.setColor(Color.BLACK); + canvas.drawText( + getResources().getString( + R.string.settings_default_color_confirm), 202, 340, + mPaint); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(276, 366); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (event.getAction() != MotionEvent.ACTION_DOWN) + return true; + float x = event.getX(); + float y = event.getY(); + + // If the touch event is located in the hue bar + if (x > 10 && x < 266 && y > 0 && y < 40) { + // Update the main field colors + mCurrentHue = (255 - x) * 360 / 255; + updateMainColors(); + + // Update the current selected color + int transX = mCurrentX - 10; + int transY = mCurrentY - 60; + int index = 256 * (transY - 1) + transX; + if (index > 0 && index < mMainColors.length) + mCurrentColor = mMainColors[256 * (transY - 1) + transX]; + + // Force the redraw of the dialog + invalidate(); + } + + // If the touch event is located in the main field + if (x > 10 && x < 266 && y > 50 && y < 306) { + mCurrentX = (int) x; + mCurrentY = (int) y; + int transX = mCurrentX - 10; + int transY = mCurrentY - 60; + int index = 256 * (transY - 1) + transX; + if (index > 0 && index < mMainColors.length) { + // Update the current color + mCurrentColor = mMainColors[index]; + // Force the redraw of the dialog + invalidate(); + } + } + + // If the touch event is located in the left button, notify the + // listener with the current color + if (x > 10 && x < 138 && y > 316 && y < 356) + mListener.colorChanged("", mCurrentColor); + + // If the touch event is located in the right button, notify the + // listener with the default color + if (x > 138 && x < 266 && y > 316 && y < 356) + mListener.colorChanged("", mDefaultColor); + + return true; + } + } + + public ColorPickerDialog(Context context, OnColorChangedListener listener, + String key, int initialColor, int defaultColor) { + super(context); + + mListener = listener; + mKey = key; + mInitialColor = initialColor; + mDefaultColor = defaultColor; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + OnColorChangedListener l = new OnColorChangedListener() { + public void colorChanged(String key, int color) { + mListener.colorChanged(mKey, color); + dismiss(); + } + }; + + setContentView(new ColorPickerView(getContext(), l, mInitialColor, + mDefaultColor)); + setTitle("Set LED Color"); + + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a1/9038e59cf6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/a1/9038e59cf6870014196aa5e86be5823c new file mode 100644 index 0000000..82186b3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a1/9038e59cf6870014196aa5e86be5823c @@ -0,0 +1,5 @@ + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a2/004604ade08700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/a2/004604ade08700141885aa2aa9523af4 new file mode 100644 index 0000000..a2874c3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a2/004604ade08700141885aa2aa9523af4 @@ -0,0 +1,50 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a3/c07968d6e18700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/a3/c07968d6e18700141885aa2aa9523af4 new file mode 100644 index 0000000..af98c63 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a3/c07968d6e18700141885aa2aa9523af4 @@ -0,0 +1,82 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + for (BluetoothGattService srvs : gatt.getServices()) { + System.out.println("Service: "+srvs.getUuid()); + for (BluetoothGattCharacteristic chrt : srvs + .getCharacteristics()) { + System.out.println("Characteristic: "+chrt.getUuid()+" with"+chrt.getProperties()); + } + } + } + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a4/10c3906eec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/a4/10c3906eec870014196aa5e86be5823c new file mode 100644 index 0000000..9eccc8b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a4/10c3906eec870014196aa5e86be5823c @@ -0,0 +1,55 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class Battery { + public int mBatteryLevel; + public int mCycles; + public Calendar mLastCharged; + public Status mStatus; + + public static Battery fromByte(byte[] b) { + Battery battery = new Battery(); + battery.mBatteryLevel = b[0]; + battery.mStatus = Status.fromByte(b[9]); + battery.mLastCharged = Calendar.getInstance(); + + battery.mLastCharged.set(Calendar.YEAR, b[1]+2000); + battery.mLastCharged.set(Calendar.MONTH, b[2]); + battery.mLastCharged.set(Calendar.DATE, b[3]); + + battery.mLastCharged.set(Calendar.HOUR_OF_DAY, b[4]); + battery.mLastCharged.set(Calendar.MINUTE, b[5]); + battery.mLastCharged.set(Calendar.SECOND, b[6]); + + + + battery.mCycles = 0xffff & (0xff & b[7] | (0xff & b[8]) << 8); + return battery; + } + + @Override + public String toString() { + return String.format("Level: %s% Cycles: %s State: %s Last Charged: %s", mBatteryLevel, mCycles, mStatus.toString(), mLastCharged.toString()); + } + + static enum Status { + LOW, FULL, CHARGING, NOT_CHARGING; + + public static Status fromByte(byte b) { + switch (b) { + case 1: + return LOW; + case 2: + return CHARGING; + case 3: + return FULL; + case 4: + return NOT_CHARGING; + + default: + return null; + } + } + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a4/9011961af4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/a4/9011961af4870014196aa5e86be5823c new file mode 100644 index 0000000..14f3d2f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a4/9011961af4870014196aa5e86be5823c @@ -0,0 +1,38 @@ +package com.motioncoding.miband.model; + +import java.util.Observable; + +import com.motioncoding.debugging.L; + + +public class MiBand extends Observable { + + public String mBTAddress; + public int mSteps; + public String mName; + public Battery mBattery; + + + + public void setName(String name) { + mName = name; + L.i("setting "+name+" as BLE name"); + setChanged(); + notifyObservers(); + } + + public void setSteps(int steps) { + mSteps = steps; + L.i("setting "+steps+" steps"); + setChanged(); + notifyObservers(); + } + + public void setBattery(Battery battery) { + mBattery = battery; + L.i(battery.toString()); + setChanged(); + notifyObservers(); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a5/504a2a1ced870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/a5/504a2a1ced870014196aa5e86be5823c new file mode 100644 index 0000000..433d6c2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a5/504a2a1ced870014196aa5e86be5823c @@ -0,0 +1,36 @@ + + + + + + + + + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a6/c0c6a60eec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/a6/c0c6a60eec870014196aa5e86be5823c new file mode 100644 index 0000000..f618c1b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a6/c0c6a60eec870014196aa5e86be5823c @@ -0,0 +1,50 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class Battery { + public int mBatteryLevel; + public int mCycles; + public Calendar mLastCharged; + public Status mStatus; + + public static Battery fromByte(byte[] b) { + Battery battery = new Battery(); + battery.mBatteryLevel = b[0]; + battery.mStatus = Status.fromByte(b[9]); + battery.mLastCharged = Calendar.getInstance(); + + battery.mLastCharged.set(Calendar.YEAR, b[1]+2000); + battery.mLastCharged.set(Calendar.MONTH, b[2]); + battery.mLastCharged.set(Calendar.DATE, b[3]); + + battery.mLastCharged.set(Calendar.HOUR_OF_DAY, b[4]); + battery.mLastCharged.set(Calendar.MINUTE, b[5]); + battery.mLastCharged.set(Calendar.SECOND, b[6]); + + + + battery.mCycles = 0xffff & (0xff & b[7] | (0xff & b[8]) << 8); + return battery; + } + + static enum Status { + LOW, FULL, CHARGING, NOT_CHARGING; + + public static Status fromByte(byte b) { + switch (b) { + case 1: + return LOW; + case 2: + return CHARGING; + case 3: + return FULL; + case 4: + return NOT_CHARGING; + + default: + return null; + } + } + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a6/f0cb20ddd78700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/a6/f0cb20ddd78700141885aa2aa9523af4 new file mode 100644 index 0000000..67aa6fa --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a6/f0cb20ddd78700141885aa2aa9523af4 @@ -0,0 +1,69 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothManager bluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private Handler mHandler; + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); + } + + @Override + public void onResume() { + super.onResume(); + scanLeDevice(true); + } + + + + + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(MiActivity.this); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + scanLeDevice(false); + } + } + + @Override + public void onPause() { + super.onPause(); + scanLeDevice(false); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a7/00cafe74db8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/a7/00cafe74db8700141885aa2aa9523af4 new file mode 100644 index 0000000..09a36ce --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a7/00cafe74db8700141885aa2aa9523af4 @@ -0,0 +1,25 @@ + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ab/e06cb73de18700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/ab/e06cb73de18700141885aa2aa9523af4 new file mode 100644 index 0000000..1833528 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ab/e06cb73de18700141885aa2aa9523af4 @@ -0,0 +1,80 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + for (BluetoothGattService srvs : gatt.getServices()) { + for (BluetoothGattCharacteristic chrt : service + .getCharacteristics()) { + } + } + } + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (status == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ac/c0c1f7d7e08700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/ac/c0c1f7d7e08700141885aa2aa9523af4 new file mode 100644 index 0000000..fc11a35 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ac/c0c1f7d7e08700141885aa2aa9523af4 @@ -0,0 +1,71 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + mGatt.discoverServices(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + } + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ad/500115f0e08700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/ad/500115f0e08700141885aa2aa9523af4 new file mode 100644 index 0000000..e2f79c5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ad/500115f0e08700141885aa2aa9523af4 @@ -0,0 +1,74 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + } + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if(status == BluetoothProfile.STATE_CONNECTED) { + mGatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ae/10e22875ed870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/10e22875ed870014196aa5e86be5823c new file mode 100644 index 0000000..1e58e4b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/10e22875ed870014196aa5e86be5823c @@ -0,0 +1,35 @@ +package com.motioncoding.miband.model; + +import java.util.Observable; + +import com.motioncoding.debugging.L; + + +public class MiBand extends Observable { + + public String mBTAddress; + public int mSteps; + public String mName; + public Battery mBattery; + + + + public void setName(String name) { + mName = name; + L.i("setting "+name+" as BLE name"); + notifyObservers(); + } + + public void setSteps(int steps) { + mSteps = steps; + L.i("setting "+steps+" steps"); + notifyObservers(); + } + + public void setBattery(Battery battery) { + mBattery = battery; + L.i(battery.toString()); + notifyObservers(); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ae/e0ff8bd9ec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/e0ff8bd9ec870014196aa5e86be5823c new file mode 100644 index 0000000..7dae85c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/e0ff8bd9ec870014196aa5e86be5823c @@ -0,0 +1,25 @@ + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ae/f046801df9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/f046801df9870014196aa5e86be5823c new file mode 100644 index 0000000..287607e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/f046801df9870014196aa5e86be5823c @@ -0,0 +1,5 @@ +package com.motioncoding.miband.view; + +public class ColorPickerDialog { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/af/90751529da8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/af/90751529da8700141885aa2aa9523af4 new file mode 100644 index 0000000..4460dcf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/af/90751529da8700141885aa2aa9523af4 @@ -0,0 +1,11 @@ + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b/40108f54e5870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/b/40108f54e5870014196aa5e86be5823c new file mode 100644 index 0000000..5c8b2e9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b/40108f54e5870014196aa5e86be5823c @@ -0,0 +1,113 @@ +package com.motioncoding.miband; + +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private BluetoothGattCharacteristic getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + for (BluetoothGattService srvs : gatt.getServices()) { + System.out.println("Service: " + srvs.getUuid()); + for (BluetoothGattCharacteristic chrt : srvs + .getCharacteristics()) { + System.out.println("Characteristic: " + chrt.getUuid() + + " with " + chrt.getProperties()); + } + } + } + + auth(); + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b2/504bc6c0ec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/b2/504bc6c0ec870014196aa5e86be5823c new file mode 100644 index 0000000..01d70ed --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b2/504bc6c0ec870014196aa5e86be5823c @@ -0,0 +1,23 @@ + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b3/409e3627ec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/409e3627ec870014196aa5e86be5823c new file mode 100644 index 0000000..0d4f2a9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/409e3627ec870014196aa5e86be5823c @@ -0,0 +1,30 @@ +package com.motioncoding.miband.model; + +import java.util.Observable; + + +public class MiBand extends Observable { + + public String mBTAddress; + public int mSteps; + public String mName; + public Battery mBattery; + + + + public void setName(String name) { + mName = name; + notifyObservers(); + } + + public void setSteps(int steps) { + mSteps = steps; + notifyObservers(); + } + + public void setBattery(Battery battery) { + mBattery = battery; + notifyObservers(); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b3/c08db071f9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/c08db071f9870014196aa5e86be5823c new file mode 100644 index 0000000..4c5cfe6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/c08db071f9870014196aa5e86be5823c @@ -0,0 +1,33 @@ +package com.motioncoding.miband; + +import android.app.ListActivity; +import android.os.Bundle; +import android.widget.ArrayAdapter; + +import com.motioncoding.miband.model.LeParams; + +public class MiLeParamsActivity extends ListActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + + LeParams params = (LeParams) getIntent().getParcelableExtra("params"); + + String[] values = new String[6]; + + values[0] = String.format("Connection Intervall\n%s ms", params.connInt); + values[1] = String.format("Connection Intervall Min\n%s ms", params.connIntMin); + values[2] = String.format("Connection Intervall Max\n %s ms", params.connIntMax); + + values[3] = String.format("Advertising Intervall\n%s ms", params.advInt); + values[4] = String.format("Latency\n%s ms", params.latency); + values[5] = String.format("Timeout\n%s ms", params.timeout); + + + ArrayAdapter adapter = new ArrayAdapter(this, + android.R.layout.simple_list_item_1, values); + this.setListAdapter(adapter); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b6/60d5d97aee870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/b6/60d5d97aee870014196aa5e86be5823c new file mode 100644 index 0000000..6ec6d98 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b6/60d5d97aee870014196aa5e86be5823c @@ -0,0 +1,35 @@ + + + + + + + + + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b7/30f19140ee870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/b7/30f19140ee870014196aa5e86be5823c new file mode 100644 index 0000000..8bc4cc1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b7/30f19140ee870014196aa5e86be5823c @@ -0,0 +1,188 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.ProgressBar; +import android.widget.Spinner; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + //BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + + private MiBand mMiBand = new MiBand(); + + //UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + mTVSteps.setText(mMiBand.mSteps); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b7/40aac0d4ee870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/b7/40aac0d4ee870014196aa5e86be5823c new file mode 100644 index 0000000..a39fbcc --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b7/40aac0d4ee870014196aa5e86be5823c @@ -0,0 +1,188 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.ProgressBar; +import android.widget.Spinner; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + //BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + + private MiBand mMiBand = new MiBand(); + + //UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + mTVSteps.setText(mMiBand.mSteps+""); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b8/a06f609cdf8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/b8/a06f609cdf8700141885aa2aa9523af4 new file mode 100644 index 0000000..7f6f76d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b8/a06f609cdf8700141885aa2aa9523af4 @@ -0,0 +1,43 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + + } + + + @Override + public void onResume() { + super.onResume(); + + } + + @Override + public void onPause() { + super.onPause(); + } + + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b8/d0769f1bea870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/b8/d0769f1bea870014196aa5e86be5823c new file mode 100644 index 0000000..037affd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b8/d0769f1bea870014196aa5e86be5823c @@ -0,0 +1,23 @@ +package com.motioncoding.miband.model; + +import java.util.Observable; + + +public class MiBand extends Observable{ + + public String mBTAddress; + public int mSteps; + public Battery mBattery; + + + public void setSteps(int steps) { + mSteps = steps; + notifyObservers(); + } + + public void setBattery(Battery battery) { + mBattery = battery; + notifyObservers(); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b9/207b4d2df4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/b9/207b4d2df4870014196aa5e86be5823c new file mode 100644 index 0000000..5b9caa3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b9/207b4d2df4870014196aa5e86be5823c @@ -0,0 +1,204 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService() + .getCharacteristic(UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() +// setColor((byte)127, (byte)0, (byte)0); +// request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b9/d09dfc5adb8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/b9/d09dfc5adb8700141885aa2aa9523af4 new file mode 100644 index 0000000..ae18b77 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b9/d09dfc5adb8700141885aa2aa9523af4 @@ -0,0 +1,27 @@ + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ba/a0036100f6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/ba/a0036100f6870014196aa5e86be5823c new file mode 100644 index 0000000..37dcdc7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ba/a0036100f6870014196aa5e86be5823c @@ -0,0 +1,23 @@ +package com.motioncoding.miband.model; + +public class LeParams { + public int connIntMin, connIntMax, latency, timeout, connInt, advInt; + + public static LeParams fromByte(byte[] b) { + LeParams params = new LeParams(); + + params.connIntMax = 0xffff & (0xff & b[0] | (0xff & b[1]) << 8); + params.connIntMax = 0xffff & (0xff & b[2] | (0xff & b[3]) << 8); + params.latency = 0xffff & (0xff & b[4] | (0xff & b[5]) << 8); + params.timeout = 0xffff & (0xff & b[6] | (0xff & b[7]) << 8); + params.connInt = 0xffff & (0xff & b[8] | (0xff & b[9]) << 8); + params.advInt = 0xffff & (0xff & b[10] | (0xff & b[11]) << 8); + + params.connIntMin *= 1.25; + params.connIntMax *= 1.25; + params.advInt *= 0.625; + params.timeout *= 10; + + return params; + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bb/80158594ce8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/bb/80158594ce8700141885aa2aa9523af4 new file mode 100644 index 0000000..91e3772 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/bb/80158594ce8700141885aa2aa9523af4 @@ -0,0 +1,5 @@ + + + MiBand + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bc/e0f1b249d78700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/bc/e0f1b249d78700141885aa2aa9523af4 new file mode 100644 index 0000000..e066711 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/bc/e0f1b249d78700141885aa2aa9523af4 @@ -0,0 +1,35 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothManager bluetoothManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + + bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); + + lookForMiBand(); + } + + private void lookForMiBand() { + bluetoothManager.getAdapter().startLeScan(this); + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + } + bluetoothManager.getAdapter().stopLeScan(this); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bc/f0b45cafe08700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/bc/f0b45cafe08700141885aa2aa9523af4 new file mode 100644 index 0000000..45cfbe1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/bc/f0b45cafe08700141885aa2aa9523af4 @@ -0,0 +1,71 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + mGatt.discoverServices(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + } + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/be/60a5eb7ef4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/be/60a5eb7ef4870014196aa5e86be5823c new file mode 100644 index 0000000..2c242e9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/be/60a5eb7ef4870014196aa5e86be5823c @@ -0,0 +1,5 @@ +package com.motioncoding.miband.model; + +public class LeParams { + public int connIntMin, connIntMax, latency, timeout, connInt, advInt; +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c0/20425253f3870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/20425253f3870014196aa5e86be5823c new file mode 100644 index 0000000..bdf3967 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/20425253f3870014196aa5e86be5823c @@ -0,0 +1,199 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + BluetoothGattCharacteristic theme = getMiliService() + .getCharacteristic(UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, 127, 0, 127, 0 }); + gatt.writeCharacteristic(theme); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c1/f0a757efe4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/c1/f0a757efe4870014196aa5e86be5823c new file mode 100644 index 0000000..6b5da00 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c1/f0a757efe4870014196aa5e86be5823c @@ -0,0 +1,101 @@ +package com.motioncoding.miband; + +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID.fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH =UUID.fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS=UUID.fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY =UUID.fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + BluetoothGattService service = mGatt.getService(UUID_MILI_SERVICE); + BluetoothGattCharacteristic chrt = service.getCharacteristic(UUID_CHAR_AUTH); + + chrt.setValue(new byte[] {2}); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + for (BluetoothGattService srvs : gatt.getServices()) { + System.out.println("Service: "+srvs.getUuid()); + for (BluetoothGattCharacteristic chrt : srvs + .getCharacteristics()) { + System.out.println("Characteristic: "+chrt.getUuid()+" with "+chrt.getProperties()); + } + } + } + + auth(); + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c3/808fd516e6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/c3/808fd516e6870014196aa5e86be5823c new file mode 100644 index 0000000..55ba225 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c3/808fd516e6870014196aa5e86be5823c @@ -0,0 +1,115 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void requestSteps() { + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_REALTIME_STEPS); + mGatt.readCharacteristic(chrt); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + requestSteps(); + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + Log.i(characteristic.getUuid().toString(), + Arrays.toString(characteristic.getValue())); + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c3/b0274622de8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/c3/b0274622de8700141885aa2aa9523af4 new file mode 100644 index 0000000..87dc7ef --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c3/b0274622de8700141885aa2aa9523af4 @@ -0,0 +1,9 @@ + + + + MiBand + Hello world! + MiBand not found. Is it in range? + MiOverviewActivity + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c4/00bdaf1fec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/c4/00bdaf1fec870014196aa5e86be5823c new file mode 100644 index 0000000..883afb6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c4/00bdaf1fec870014196aa5e86be5823c @@ -0,0 +1,65 @@ +package com.motioncoding.debugging; + +import android.content.Context; +import android.util.Log; +import android.widget.Toast; + +public class L { + + public static enum LogType { + CLASS, CLASS_AND_METHOD, CLASS_AND_METHOD_AND_LINE, CLASS_AND_LINE + } + + private static LogType mType = LogType.CLASS_AND_METHOD; + + + public static void toast(Context context, String msg) { + Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); + } + + public static void setLogType(LogType type) { + mType = type; + } + + public static void e(String msg) { + Log.e(getTag(), msg); + } + + public static void i(String msg) { + Log.i(getTag(), msg); + } + + public static void d(String msg) { + Log.d(getTag(), msg); + } + + public static void v(String msg) { + Log.v(getTag(), msg); + } + + public static void w(String msg) { + Log.w(getTag(), msg); + } + + public static void wtf(String msg) { + Log.wtf(getTag(), msg); + } + + private static String getTag() { + StackTraceElement[] s = Thread.currentThread().getStackTrace(); + switch (mType) { + case CLASS: + return s[4].getClassName(); + case CLASS_AND_LINE: + return s[4].getClassName()+":"+s[4].getLineNumber(); + case CLASS_AND_METHOD: + return s[4].getClassName()+"."+s[4].getMethodName(); + case CLASS_AND_METHOD_AND_LINE: + return s[4].getClassName()+"."+s[4].getMethodName()+":"+s[4].getLineNumber(); + default: + break; + } + return null; + } +} + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c4/2068bc04ee870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/c4/2068bc04ee870014196aa5e86be5823c new file mode 100644 index 0000000..1e496ae --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c4/2068bc04ee870014196aa5e86be5823c @@ -0,0 +1,180 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.Spinner; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + //BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + + private MiBand mMiBand = new MiBand(); + + //UI + private TextView mTVSteps; + private Spinner mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mLoading = (Spinner) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + mLoading.setVisibility(View.GONE); + mTVSteps.setText(mMiBand.mSteps); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c4/60253401e6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/c4/60253401e6870014196aa5e86be5823c new file mode 100644 index 0000000..c9bf44a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c4/60253401e6870014196aa5e86be5823c @@ -0,0 +1,115 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void requestSteps() { + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_REALTIME_STEPS); + mGatt.readCharacteristic(chrt); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + requestSteps(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + Log.i(characteristic.getUuid().toString(), + Arrays.toString(characteristic.getValue())); + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c4/902c54b9d68700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/c4/902c54b9d68700141885aa2aa9523af4 new file mode 100644 index 0000000..3c3dd48 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c4/902c54b9d68700141885aa2aa9523af4 @@ -0,0 +1,15 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; + +public class MiActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c6/f03faa2dda8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/c6/f03faa2dda8700141885aa2aa9523af4 new file mode 100644 index 0000000..bf65b14 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c6/f03faa2dda8700141885aa2aa9523af4 @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c8/60276e25f9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/c8/60276e25f9870014196aa5e86be5823c new file mode 100644 index 0000000..35ea9d9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c8/60276e25f9870014196aa5e86be5823c @@ -0,0 +1,309 @@ +package com.motioncoding.miband.view; + +import android.R; +import android.app.Dialog; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.LinearGradient; +import android.graphics.Paint; +import android.graphics.Shader; +import android.os.Bundle; +import android.view.MotionEvent; +import android.view.View; + +public class ColorPickerDialog extends Dialog { + + public interface OnColorChangedListener { + void colorChanged(String key, int color); + } + + private OnColorChangedListener mListener; + private int mInitialColor, mDefaultColor; + private String mKey; + + private static class ColorPickerView extends View { + private Paint mPaint; + private float mCurrentHue = 0; + private int mCurrentX = 0, mCurrentY = 0; + private int mCurrentColor, mDefaultColor; + private final int[] mHueBarColors = new int[258]; + private int[] mMainColors = new int[65536]; + private OnColorChangedListener mListener; + + ColorPickerView(Context c, OnColorChangedListener l, int color, + int defaultColor) { + super(c); + mListener = l; + mDefaultColor = defaultColor; + + // Get the current hue from the current color and update the main + // color field + float[] hsv = new float[3]; + Color.colorToHSV(color, hsv); + mCurrentHue = hsv[0]; + updateMainColors(); + + mCurrentColor = color; + + // Initialize the colors of the hue slider bar + int index = 0; + for (float i = 0; i < 256; i += 256 / 42) // Red (#f00) to pink + // (#f0f) + { + mHueBarColors[index] = Color.rgb(255, 0, (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Pink (#f0f) to blue + // (#00f) + { + mHueBarColors[index] = Color.rgb(255 - (int) i, 0, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Blue (#00f) to light + // blue (#0ff) + { + mHueBarColors[index] = Color.rgb(0, (int) i, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Light blue (#0ff) to + // green (#0f0) + { + mHueBarColors[index] = Color.rgb(0, 255, 255 - (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Green (#0f0) to yellow + // (#ff0) + { + mHueBarColors[index] = Color.rgb((int) i, 255, 0); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Yellow (#ff0) to red + // (#f00) + { + mHueBarColors[index] = Color.rgb(255, 255 - (int) i, 0); + index++; + } + + // Initializes the Paint that will draw the View + mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mPaint.setTextAlign(Paint.Align.CENTER); + mPaint.setTextSize(12); + } + + // Get the current selected color from the hue bar + private int getCurrentMainColor() { + int translatedHue = 255 - (int) (mCurrentHue * 255 / 360); + int index = 0; + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(255, 0, (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(255 - (int) i, 0, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(0, (int) i, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(0, 255, 255 - (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb((int) i, 255, 0); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(255, 255 - (int) i, 0); + index++; + } + return Color.RED; + } + + // Update the main field colors depending on the current selected hue + private void updateMainColors() { + int mainColor = getCurrentMainColor(); + int index = 0; + int[] topColors = new int[256]; + for (int y = 0; y < 256; y++) { + for (int x = 0; x < 256; x++) { + if (y == 0) { + mMainColors[index] = Color.rgb( + 255 - (255 - Color.red(mainColor)) * x / 255, + 255 - (255 - Color.green(mainColor)) * x / 255, + 255 - (255 - Color.blue(mainColor)) * x / 255); + topColors[x] = mMainColors[index]; + } else + mMainColors[index] = Color.rgb( + (255 - y) * Color.red(topColors[x]) / 255, + (255 - y) * Color.green(topColors[x]) / 255, + (255 - y) * Color.blue(topColors[x]) / 255); + index++; + } + } + } + + @Override + protected void onDraw(Canvas canvas) { + int translatedHue = 255 - (int) (mCurrentHue * 255 / 360); + // Display all the colors of the hue bar with lines + for (int x = 0; x < 256; x++) { + // If this is not the current selected hue, display the actual + // color + if (translatedHue != x) { + mPaint.setColor(mHueBarColors[x]); + mPaint.setStrokeWidth(1); + } else // else display a slightly larger black line + { + mPaint.setColor(Color.BLACK); + mPaint.setStrokeWidth(3); + } + canvas.drawLine(x + 10, 0, x + 10, 40, mPaint); + // canvas.drawLine(0, x+10, 40, x+10, mPaint); + } + + // Display the main field colors using LinearGradient + for (int x = 0; x < 256; x++) { + int[] colors = new int[2]; + colors[0] = mMainColors[x]; + colors[1] = Color.BLACK; + Shader shader = new LinearGradient(0, 50, 0, 306, colors, null, + Shader.TileMode.REPEAT); + mPaint.setShader(shader); + canvas.drawLine(x + 10, 50, x + 10, 306, mPaint); + } + mPaint.setShader(null); + + // Display the circle around the currently selected color in the + // main field + if (mCurrentX != 0 && mCurrentY != 0) { + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setColor(Color.BLACK); + canvas.drawCircle(mCurrentX, mCurrentY, 10, mPaint); + } + + // Draw a 'button' with the currently selected color + mPaint.setStyle(Paint.Style.FILL); + mPaint.setColor(mCurrentColor); + canvas.drawRect(10, 316, 138, 356, mPaint); + + // Set the text color according to the brightness of the color + if (Color.red(mCurrentColor) + Color.green(mCurrentColor) + + Color.blue(mCurrentColor) < 384) + mPaint.setColor(Color.WHITE); + else + mPaint.setColor(Color.BLACK); + canvas.drawText( + getResources() + .getString(R.string.settings_bg_color_confirm), 74, + 340, mPaint); + + // Draw a 'button' with the default color + mPaint.setStyle(Paint.Style.FILL); + mPaint.setColor(mDefaultColor); + canvas.drawRect(138, 316, 266, 356, mPaint); + + // Set the text color according to the brightness of the color + if (Color.red(mDefaultColor) + Color.green(mDefaultColor) + + Color.blue(mDefaultColor) < 384) + mPaint.setColor(Color.WHITE); + else + mPaint.setColor(Color.BLACK); + canvas.drawText( + getResources().getString( + R.string.settings_default_color_confirm), 202, 340, + mPaint); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(276, 366); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (event.getAction() != MotionEvent.ACTION_DOWN) + return true; + float x = event.getX(); + float y = event.getY(); + + // If the touch event is located in the hue bar + if (x > 10 && x < 266 && y > 0 && y < 40) { + // Update the main field colors + mCurrentHue = (255 - x) * 360 / 255; + updateMainColors(); + + // Update the current selected color + int transX = mCurrentX - 10; + int transY = mCurrentY - 60; + int index = 256 * (transY - 1) + transX; + if (index > 0 && index < mMainColors.length) + mCurrentColor = mMainColors[256 * (transY - 1) + transX]; + + // Force the redraw of the dialog + invalidate(); + } + + // If the touch event is located in the main field + if (x > 10 && x < 266 && y > 50 && y < 306) { + mCurrentX = (int) x; + mCurrentY = (int) y; + int transX = mCurrentX - 10; + int transY = mCurrentY - 60; + int index = 256 * (transY - 1) + transX; + if (index > 0 && index < mMainColors.length) { + // Update the current color + mCurrentColor = mMainColors[index]; + // Force the redraw of the dialog + invalidate(); + } + } + + // If the touch event is located in the left button, notify the + // listener with the current color + if (x > 10 && x < 138 && y > 316 && y < 356) + mListener.colorChanged("", mCurrentColor); + + // If the touch event is located in the right button, notify the + // listener with the default color + if (x > 138 && x < 266 && y > 316 && y < 356) + mListener.colorChanged("", mDefaultColor); + + return true; + } + } + + public ColorPickerDialog(Context context, OnColorChangedListener listener, + String key, int initialColor, int defaultColor) { + super(context); + + mListener = listener; + mKey = key; + mInitialColor = initialColor; + mDefaultColor = defaultColor; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + OnColorChangedListener l = new OnColorChangedListener() { + public void colorChanged(String key, int color) { + mListener.colorChanged(mKey, color); + dismiss(); + } + }; + + setContentView(new ColorPickerView(getContext(), l, mInitialColor, + mDefaultColor)); + setTitle(R.string.settings_bg_color_dialog); + + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c8/8095736af3870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/c8/8095736af3870014196aa5e86be5823c new file mode 100644 index 0000000..d18e5a3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c8/8095736af3870014196aa5e86be5823c @@ -0,0 +1,204 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService() + .getCharacteristic(UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + setColor(0, 0, 0); +// request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c8/f0f4152be48700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/c8/f0f4152be48700141885aa2aa9523af4 new file mode 100644 index 0000000..f16c4c6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c8/f0f4152be48700141885aa2aa9523af4 @@ -0,0 +1,16 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class MiBand { + + String mBTAddress; + int mSteps; + + + static class Battery { + int mBatteryLevel; + int mCycles; + Calendar mLastCharged; + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/cb/f0b0df75d78700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/cb/f0b0df75d78700141885aa2aa9523af4 new file mode 100644 index 0000000..722f5a8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/cb/f0b0df75d78700141885aa2aa9523af4 @@ -0,0 +1,37 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothManager bluetoothManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); + } + + public void onResume() { + bluetoothManager.getAdapter().startLeScan(this); + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + bluetoothManager.getAdapter().stopLeScan(this); + } + } + + public void onPause() { + super.onPause(); + bluetoothManager.getAdapter().stopLeScan(this); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/cc/802e23b9f7870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/cc/802e23b9f7870014196aa5e86be5823c new file mode 100644 index 0000000..77d2383 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/cc/802e23b9f7870014196aa5e86be5823c @@ -0,0 +1,236 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.debugging.L; +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.LeParams; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_LE_PARAMS = UUID + .fromString("0000ff09-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.menu_overview, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_leparams: + if(mMiBand.mLeParams == null) { + L.toast(this, "No Params received yet"); + return true; + } + Intent intent = new Intent(getApplicationContext(), MiLeParamsActivity.class); + intent.putExtra("params", mMiBand.mLeParams); + break; + } + return true; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService().getCharacteristic( + UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + // setColor((byte)127, (byte)0, (byte)0); + // request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + + // handle value + if (characteristic.getUuid().equals(UUID_CHAR_REALTIME_STEPS)) + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + else if (characteristic.getUuid().equals(UUID_CHAR_BATTERY)) { + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + } else if (characteristic.getUuid().equals(UUID_CHAR_DEVICE_NAME)) { + mMiBand.setName(new String(b)); + } else if (characteristic.getUuid().equals(UUID_CHAR_LE_PARAMS)) { + LeParams params = LeParams.fromByte(b); + mMiBand.setLeParams(params); + } + + // proceed with state machine (called in the beginning) + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + request(UUID_CHAR_LE_PARAMS); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/cc/f0690e2bdb8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/cc/f0690e2bdb8700141885aa2aa9523af4 new file mode 100644 index 0000000000000000000000000000000000000000..b88df370d8a260ac8075f937e3e64faa5329b2ab GIT binary patch literal 1674 zcmeAS@N?(olHy`uVBq!ia0vp^AbgsG8AzU*ZKA}$z!(tV6XN=R6i_t;_Va(K1O{F!Z|A&>zU3g$uBqU1lw*;A=+h7_)+5Xp zwdOUrhlT`X@2$FdSnl8d`?GE`s0ldro&0>E?EB?OK5;kZ&OQ0=@t-Xb|9Zb2%G&(h zVh+#ak}qGrecjFTi0y{s_T?*iE7vmbYCNoL*PoO8rq0$TujI_)3&)t}gekpVVQ*t7 zxuxxpV4c_@MKg)HE8^w5GnxE+ug~Ay`sh;h$LR-W-a6Y-6<)Z0(vyi#JiNZu-I*`O zGvnqCt0cD{ohNq|RL}mfhrw58h2k=?&cgh#n>xE)&fHNHtxN1kUAH;4ug3iHMeozv z3E!(i&sKz8KTxK+K4+_6PmWf)ZJu&-c*>?D`j%f;>$>eZvd#Pk1M~f5(?s_$8qU6x zRbDNvl&rqgP>^Bsg|teM8#kBkV~r6g%#Yf`JK1Kn`Tz4x$+P$7v2QP|nkb_)?eMZW zx6|4}*Q-?2c@=5$?mT~Dx5+`~OOtwLnS4`joj>zThn|C*rO~%j`X4!FYk2PbdbD>3 zYeKG_x~sj5T{_Q6(Ta|Ep}TR5tJU@SZ%*y0zN{f6^JHEBpBeujJn2!gRPVPGYYo2j zV_l(($fdx2@n(H2^WC#+)4dH|W<}1}|NNcH9g9m$r(d*u@#{TSzW1Qt!z~ZzTJk)J zIc)#ACSR6$=e>%xzMuBWuo)e1R`Y!Cu*HSflw&6IrRLa5F=kHh;}<{tm1O(G6Q=y~ z?T5V_Y@0aV=U!?y7d&@!gX1EPt|ce-^UPcyvikYo87KZ6RlR?2Q^$!@s+r*(C(4;V z?b*W2g z)nD#7PZaS)px7RsJNIMbH_kY5>zGwrhmH8Q|L;HYYl`2kefP7W{+(w0@xXnb zHdYBQU<7MSQ}kU?Wwg+Ydu!7h;g>T5o~JpP&f_#~p8ru>df~q!Ugn=M^_5Mbs;_cF zI%fr(&T>1dn-u%OdF_AJ{Z*EBEuqPKZ+!R^{>7`nn`4@w+umInD~v5dzvf+h)pqOu zBtw-an-{z&W^-St5IA+=3ymd3{32VAo4?%Z9KiqT`jUpOL-%ApADe2d>m{fBYhLbz zgs)p;`gmT3E7rD~YA)uxx_;`dc6Iru?+#?2-Mm~s&*h@-&H9GhlV-K9h<sNYkFri>0WK|{>WV`J?olp7*Zt3E_qxN&io?Gt^a6K^(z zYGw!Kx}D^Yc$Xp`yjHhXr6{BAZH}Z+%VqD|vSv(skK_bSttnDed{M$K`fa0noa1uq zxq+6i`Fj|Ae?R>j5-zM>zxq7qIv3w-Ho`dM}FDX_|G}rc>M>F3+s=HOZ_?Cplm)rzvkVg j;0bdN-Ow+0{LMTi@ORga9mk#m3qS@>S3j3^P6 + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d2/5069d1e7ec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/d2/5069d1e7ec870014196aa5e86be5823c new file mode 100644 index 0000000..5e54d79 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d2/5069d1e7ec870014196aa5e86be5823c @@ -0,0 +1,26 @@ + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d3/a0adcc4cda8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/d3/a0adcc4cda8700141885aa2aa9523af4 new file mode 100644 index 0000000..440b330 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d3/a0adcc4cda8700141885aa2aa9523af4 @@ -0,0 +1,75 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private Handler mHandler = new Handler(); + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + + + setContentView(R.layout.activity_mi); + mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter(); + } + + @Override + public void onResume() { + super.onResume(); + scanLeDevice(true); + } + + + + @SuppressWarnings("deprecation") // L Apis are buggy and crap! + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(MiActivity.this); + scanLeDevice(true); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + System.out.println(device.getName()+" "+device.getAddress()); + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + scanLeDevice(false); // we only care about one miband so that's enough + } + } + + @Override + public void onPause() { + super.onPause(); + scanLeDevice(false); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d5/30ee32ddf4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/d5/30ee32ddf4870014196aa5e86be5823c new file mode 100644 index 0000000..c4d61f4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d5/30ee32ddf4870014196aa5e86be5823c @@ -0,0 +1,20 @@ +package com.motioncoding.miband.model; + +public class LeParams { + public int connIntMin, connIntMax, latency, timeout, connInt, advInt; + + public static LeParams fromByte(byte[] b) { + LeParams params = new LeParams(); + + params.connIntMax = 0xffff & (0xff & b[0] | (0xff & b[1]) << 8); + params.connIntMax = 0xffff & (0xff & b[2] | (0xff & b[3]) << 8); + params.latency = 0xffff & (0xff & b[4] | (0xff & b[5]) << 8); + params.timeout = 0xffff & (0xff & b[6] | (0xff & b[7]) << 8); + params.connInt = 0xffff & (0xff & b[8] | (0xff & b[9]) << 8); + params.advInt = 0xffff & (0xff & b[10] | (0xff & b[11]) << 8); + + params.connIntMin *= 1.25; + + return params; + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d6/d0e9018ee8870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/d6/d0e9018ee8870014196aa5e86be5823c new file mode 100644 index 0000000..a6c6c28 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d6/d0e9018ee8870014196aa5e86be5823c @@ -0,0 +1,33 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class Battery { + public int mBatteryLevel; + public int mCycles; + public Calendar mLastCharged; + + public static Battery fromByte(byte[] b) { + return null; + } + + static enum Status { + LOW, FULL, CHARGING, NOT_CHARGING; + + public static Status fromByte(byte b) { + switch (b) { + case 1: + return LOW; + case 2: + return CHARGING; + case 3: + return FULL; + case 4: + return NOT_CHARGING; + + default: + return null; + } + } + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d7/60888a66db8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/d7/60888a66db8700141885aa2aa9523af4 new file mode 100644 index 0000000..09d0c79 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d7/60888a66db8700141885aa2aa9523af4 @@ -0,0 +1,25 @@ + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d8/b0bd8fd0e18700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/d8/b0bd8fd0e18700141885aa2aa9523af4 new file mode 100644 index 0000000..2fdf7e2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d8/b0bd8fd0e18700141885aa2aa9523af4 @@ -0,0 +1,82 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + for (BluetoothGattService srvs : gatt.getServices()) { + System.out.println("Service: "+srvs.getUuid()); + for (BluetoothGattCharacteristic chrt : srvs + .getCharacteristics()) { + System.out.println("Characteristic: "+chrt.getUuid()+" permissions: "+chrt.getPermissions()); + } + } + } + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/da/00b6a28dec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/da/00b6a28dec870014196aa5e86be5823c new file mode 100644 index 0000000..8d89459 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/da/00b6a28dec870014196aa5e86be5823c @@ -0,0 +1,55 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class Battery { + public int mBatteryLevel; + public int mCycles; + public Calendar mLastCharged; + public Status mStatus; + + public static Battery fromByte(byte[] b) { + Battery battery = new Battery(); + battery.mBatteryLevel = b[0]; + battery.mStatus = Status.fromByte(b[9]); + battery.mLastCharged = Calendar.getInstance(); + + battery.mLastCharged.set(Calendar.YEAR, b[1]+2000); + battery.mLastCharged.set(Calendar.MONTH, b[2]); + battery.mLastCharged.set(Calendar.DATE, b[3]); + + battery.mLastCharged.set(Calendar.HOUR_OF_DAY, b[4]); + battery.mLastCharged.set(Calendar.MINUTE, b[5]); + battery.mLastCharged.set(Calendar.SECOND, b[6]); + + + + battery.mCycles = 0xffff & (0xff & b[7] | (0xff & b[8]) << 8); + return battery; + } + + @Override + public String toString() { + return String.format("Level: %s % Cycles: %s State: %s Last Charged: %s", mBatteryLevel, mCycles, mStatus.toString(), mLastCharged.toString()); + } + + static enum Status { + LOW, FULL, CHARGING, NOT_CHARGING; + + public static Status fromByte(byte b) { + switch (b) { + case 1: + return LOW; + case 2: + return CHARGING; + case 3: + return FULL; + case 4: + return NOT_CHARGING; + + default: + return null; + } + } + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/da/b08df6d4f6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/da/b08df6d4f6870014196aa5e86be5823c new file mode 100644 index 0000000..57597aa --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/da/b08df6d4f6870014196aa5e86be5823c @@ -0,0 +1,18 @@ +package com.motioncoding.miband; + +import android.app.ListActivity; +import android.os.Bundle; + +import com.motioncoding.miband.model.LeParams; + +public class MiLeParamsActivity extends ListActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + setContentView(R.layout.activity_mi_le_params); + + LeParams params = (LeParams) getIntent().getParcelableExtra("params"); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/da/d060735df4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/da/d060735df4870014196aa5e86be5823c new file mode 100644 index 0000000..73550e3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/da/d060735df4870014196aa5e86be5823c @@ -0,0 +1,207 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_LE_PARAMS = UUID + .fromString("0000ff09-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService() + .getCharacteristic(UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() +// setColor((byte)127, (byte)0, (byte)0); +// request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + request(UUID_LE_PARAMS); + break; + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/db/50ac094af6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/db/50ac094af6870014196aa5e86be5823c new file mode 100644 index 0000000..ebbe832 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/db/50ac094af6870014196aa5e86be5823c @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/dc/20348c81e4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/dc/20348c81e4870014196aa5e86be5823c new file mode 100644 index 0000000..2da39f2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/dc/20348c81e4870014196aa5e86be5823c @@ -0,0 +1,17 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class MiBand { + + String mBTAddress; + int mSteps; + + + static class Battery { + int mBatteryLevel; + int mCycles; + Calendar mLastCharged; + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/dc/50c55822de8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/dc/50c55822de8700141885aa2aa9523af4 new file mode 100644 index 0000000..b6c10ad --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/dc/50c55822de8700141885aa2aa9523af4 @@ -0,0 +1,26 @@ + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/df/b0d5dfb7ce8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/df/b0d5dfb7ce8700141885aa2aa9523af4 new file mode 100644 index 0000000..50fe8d0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/df/b0d5dfb7ce8700141885aa2aa9523af4 @@ -0,0 +1,12 @@ + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e/40450240f7870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/e/40450240f7870014196aa5e86be5823c new file mode 100644 index 0000000..dbde3e2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e/40450240f7870014196aa5e86be5823c @@ -0,0 +1,34 @@ +package com.motioncoding.miband; + +import android.app.ListActivity; +import android.os.Bundle; +import android.widget.ArrayAdapter; + +import com.motioncoding.miband.model.LeParams; + +public class MiLeParamsActivity extends ListActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + setContentView(R.layout.activity_mi_le_params); + + LeParams params = (LeParams) getIntent().getParcelableExtra("params"); + + String[] values = new String[6]; + + values[0] = String.format("Connection Intervall\n %s ms", params.connInt); + values[1] = String.format("Connection Intervall Min\n %s ms", params.connIntMin); + values[2] = String.format("Connection Intervall Max\n %s ms", params.connIntMax); + + values[3] = String.format("Advertising Intervall\n %s ms", params.advInt); + values[4] = String.format("Latency\n %s ms", params.latency); + values[5] = String.format("Timeout\n %s ms", params.timeout); + + + ArrayAdapter adapter = new ArrayAdapter(getActivity(), + android.R.layout.simple_list_item_1, values); + this.setListAdapter(adapter); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e/b09a10c4f4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/e/b09a10c4f4870014196aa5e86be5823c new file mode 100644 index 0000000..ce29091 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e/b09a10c4f4870014196aa5e86be5823c @@ -0,0 +1,20 @@ +package com.motioncoding.miband.model; + +public class LeParams { + public int connIntMin, connIntMax, latency, timeout, connInt, advInt; + + public static LeParams fromByte(byte[] b) { + LeParams params = new LeParams(); + + params.connIntMax = 0xffff & (0xff & b[0] | (0xff & b[1]) << 8); + params.connIntMax = 0xffff & (0xff & b[2] | (0xff & b[3]) << 8); + params.latency = 0xffff & (0xff & b[4] | (0xff & b[5]) << 8); + params.timeout = 0xffff & (0xff & b[6] | (0xff & b[7]) << 8); + params.connInt = 0xffff & (0xff & b[8] | (0xff & b[9]) << 8); + params.advInt = 0xffff & (0xff & b[10] | (0xff & b[11]) << 8); + + params.connIntMin *= 1.25f; + + return params; + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e0/0067276ef9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/e0/0067276ef9870014196aa5e86be5823c new file mode 100644 index 0000000..3b9cf70 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e0/0067276ef9870014196aa5e86be5823c @@ -0,0 +1,236 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.debugging.L; +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.LeParams; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_LE_PARAMS = UUID + .fromString("0000ff09-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.menu_overview, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_leparams: + if(mMiBand.mLeParams == null) { + L.toast(this, "No LE params received yet"); + return true; + } + Intent intent = new Intent(getApplicationContext(), MiLeParamsActivity.class); + intent.putExtra("params", mMiBand.mLeParams); + startActivity(intent); + break; + } + return true; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService().getCharacteristic( + UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + // setColor((byte)127, (byte)0, (byte)0); + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + + // handle value + if (characteristic.getUuid().equals(UUID_CHAR_REALTIME_STEPS)) + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + else if (characteristic.getUuid().equals(UUID_CHAR_BATTERY)) { + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + } else if (characteristic.getUuid().equals(UUID_CHAR_DEVICE_NAME)) { + mMiBand.setName(new String(b)); + } else if (characteristic.getUuid().equals(UUID_CHAR_LE_PARAMS)) { + LeParams params = LeParams.fromByte(b); + mMiBand.setLeParams(params); + } + + // proceed with state machine (called in the beginning) + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + request(UUID_CHAR_LE_PARAMS); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e1/c0b7caabe4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/e1/c0b7caabe4870014196aa5e86be5823c new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e2/308b1a57e7870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/e2/308b1a57e7870014196aa5e86be5823c new file mode 100644 index 0000000..0e4b0ac --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e2/308b1a57e7870014196aa5e86be5823c @@ -0,0 +1,132 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + } + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(characteristic.getValue())); + switch (state) { + case 0: + System.out.println(characteristic.getIntValue(0, 0)); + break; + } + state++; + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e2/e063ca1edd8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/e2/e063ca1edd8700141885aa2aa9523af4 new file mode 100644 index 0000000..336b358 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e2/e063ca1edd8700141885aa2aa9523af4 @@ -0,0 +1,81 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.widget.TextView; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private TextView mTextView; + private Handler mHandler = new Handler(); + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + setContentView(R.layout.activity_mi); + mTextView = (TextView) findViewById(R.id.text_search); + mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)) + .getAdapter(); + } + + @Override + public void onResume() { + super.onResume(); + scanLeDevice(true); + } + + @SuppressWarnings("deprecation") + // L Apis are buggy and crap! + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(MiActivity.this); + mTextView.setText(R.string.not_found); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + System.out.println(device.getName() + " " + device.getAddress()); + if (device != null && device.getName() != null + & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + scanLeDevice(false); // we only care about one miband so that's + // enough + Intent intent = new Intent(getApplicationContext(), MiOverviewActivity.class); + intent.putExtra("address", device.getAddress()); + startActivity(intent); + } + } + + @Override + public void onPause() { + super.onPause(); + scanLeDevice(false); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e3/60ffa197ee870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/e3/60ffa197ee870014196aa5e86be5823c new file mode 100644 index 0000000..bbc4cf1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e3/60ffa197ee870014196aa5e86be5823c @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e4/b0a2a807da8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/e4/b0a2a807da8700141885aa2aa9523af4 new file mode 100644 index 0000000..73c1349 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e4/b0a2a807da8700141885aa2aa9523af4 @@ -0,0 +1,71 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private Handler mHandler = new Handler(); + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter(); + } + + @Override + public void onResume() { + super.onResume(); + scanLeDevice(true); + } + + + + @SuppressWarnings("deprecation") // L Apis are buggy and crap! + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(MiActivity.this); + scanLeDevice(true); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + System.out.println(device.getName()+" "+device.getAddress()); + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + scanLeDevice(false); // we only care about one miband so that's enough + } + } + + @Override + public void onPause() { + super.onPause(); + scanLeDevice(false); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e5/00bd3ee8df8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/e5/00bd3ee8df8700141885aa2aa9523af4 new file mode 100644 index 0000000..c476427 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e5/00bd3ee8df8700141885aa2aa9523af4 @@ -0,0 +1,45 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + mMiBand.connectGatt(this, false, this); + } + + + @Override + public void onResume() { + super.onResume(); + + } + + @Override + public void onPause() { + super.onPause(); + } + + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e6/006d9cd3d78700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/e6/006d9cd3d78700141885aa2aa9523af4 new file mode 100644 index 0000000..fe7a4e2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e6/006d9cd3d78700141885aa2aa9523af4 @@ -0,0 +1,68 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothManager bluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private Handler mHandler; + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); + } + + @Override + public void onResume() { + super.onResume(); + } + + + + + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(MiActivity.this); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + bluetoothManager.getAdapter().stopLeScan(this); + } + } + + @Override + public void onPause() { + super.onPause(); + bluetoothManager.getAdapter().stopLeScan(this); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e7/c03d63d5ec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/e7/c03d63d5ec870014196aa5e86be5823c new file mode 100644 index 0000000..d25efdd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e7/c03d63d5ec870014196aa5e86be5823c @@ -0,0 +1,24 @@ + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e8/10048494ce8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/e8/10048494ce8700141885aa2aa9523af4 new file mode 100644 index 0000000..3392810 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e8/10048494ce8700141885aa2aa9523af4 @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e8/b024d197f9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/e8/b024d197f9870014196aa5e86be5823c new file mode 100644 index 0000000..5322495 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e8/b024d197f9870014196aa5e86be5823c @@ -0,0 +1,307 @@ +package com.motioncoding.miband.view; + +import android.R; +import android.app.Dialog; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.LinearGradient; +import android.graphics.Paint; +import android.graphics.Shader; +import android.os.Bundle; +import android.view.MotionEvent; +import android.view.View; + +public class ColorPickerDialog extends Dialog { + + public interface OnColorChangedListener { + void colorChanged(String key, int color); + } + + private OnColorChangedListener mListener; + private int mInitialColor, mDefaultColor; + private String mKey; + + private static class ColorPickerView extends View { + private Paint mPaint; + private float mCurrentHue = 0; + private int mCurrentX = 0, mCurrentY = 0; + private int mCurrentColor, mDefaultColor; + private final int[] mHueBarColors = new int[258]; + private int[] mMainColors = new int[65536]; + private OnColorChangedListener mListener; + + ColorPickerView(Context c, OnColorChangedListener l, int color, + int defaultColor) { + super(c); + mListener = l; + mDefaultColor = defaultColor; + + // Get the current hue from the current color and update the main + // color field + float[] hsv = new float[3]; + Color.colorToHSV(color, hsv); + mCurrentHue = hsv[0]; + updateMainColors(); + + mCurrentColor = color; + + // Initialize the colors of the hue slider bar + int index = 0; + for (float i = 0; i < 256; i += 256 / 42) // Red (#f00) to pink + // (#f0f) + { + mHueBarColors[index] = Color.rgb(255, 0, (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Pink (#f0f) to blue + // (#00f) + { + mHueBarColors[index] = Color.rgb(255 - (int) i, 0, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Blue (#00f) to light + // blue (#0ff) + { + mHueBarColors[index] = Color.rgb(0, (int) i, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Light blue (#0ff) to + // green (#0f0) + { + mHueBarColors[index] = Color.rgb(0, 255, 255 - (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Green (#0f0) to yellow + // (#ff0) + { + mHueBarColors[index] = Color.rgb((int) i, 255, 0); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) // Yellow (#ff0) to red + // (#f00) + { + mHueBarColors[index] = Color.rgb(255, 255 - (int) i, 0); + index++; + } + + // Initializes the Paint that will draw the View + mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mPaint.setTextAlign(Paint.Align.CENTER); + mPaint.setTextSize(12); + } + + // Get the current selected color from the hue bar + private int getCurrentMainColor() { + int translatedHue = 255 - (int) (mCurrentHue * 255 / 360); + int index = 0; + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(255, 0, (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(255 - (int) i, 0, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(0, (int) i, 255); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(0, 255, 255 - (int) i); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb((int) i, 255, 0); + index++; + } + for (float i = 0; i < 256; i += 256 / 42) { + if (index == translatedHue) + return Color.rgb(255, 255 - (int) i, 0); + index++; + } + return Color.RED; + } + + // Update the main field colors depending on the current selected hue + private void updateMainColors() { + int mainColor = getCurrentMainColor(); + int index = 0; + int[] topColors = new int[256]; + for (int y = 0; y < 256; y++) { + for (int x = 0; x < 256; x++) { + if (y == 0) { + mMainColors[index] = Color.rgb( + 255 - (255 - Color.red(mainColor)) * x / 255, + 255 - (255 - Color.green(mainColor)) * x / 255, + 255 - (255 - Color.blue(mainColor)) * x / 255); + topColors[x] = mMainColors[index]; + } else + mMainColors[index] = Color.rgb( + (255 - y) * Color.red(topColors[x]) / 255, + (255 - y) * Color.green(topColors[x]) / 255, + (255 - y) * Color.blue(topColors[x]) / 255); + index++; + } + } + } + + @Override + protected void onDraw(Canvas canvas) { + int translatedHue = 255 - (int) (mCurrentHue * 255 / 360); + // Display all the colors of the hue bar with lines + for (int x = 0; x < 256; x++) { + // If this is not the current selected hue, display the actual + // color + if (translatedHue != x) { + mPaint.setColor(mHueBarColors[x]); + mPaint.setStrokeWidth(1); + } else // else display a slightly larger black line + { + mPaint.setColor(Color.BLACK); + mPaint.setStrokeWidth(3); + } + canvas.drawLine(x + 10, 0, x + 10, 40, mPaint); + // canvas.drawLine(0, x+10, 40, x+10, mPaint); + } + + // Display the main field colors using LinearGradient + for (int x = 0; x < 256; x++) { + int[] colors = new int[2]; + colors[0] = mMainColors[x]; + colors[1] = Color.BLACK; + Shader shader = new LinearGradient(0, 50, 0, 306, colors, null, + Shader.TileMode.REPEAT); + mPaint.setShader(shader); + canvas.drawLine(x + 10, 50, x + 10, 306, mPaint); + } + mPaint.setShader(null); + + // Display the circle around the currently selected color in the + // main field + if (mCurrentX != 0 && mCurrentY != 0) { + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setColor(Color.BLACK); + canvas.drawCircle(mCurrentX, mCurrentY, 10, mPaint); + } + + // Draw a 'button' with the currently selected color + mPaint.setStyle(Paint.Style.FILL); + mPaint.setColor(mCurrentColor); + canvas.drawRect(10, 316, 138, 356, mPaint); + + // Set the text color according to the brightness of the color + if (Color.red(mCurrentColor) + Color.green(mCurrentColor) + + Color.blue(mCurrentColor) < 384) + mPaint.setColor(Color.WHITE); + else + mPaint.setColor(Color.BLACK); + canvas.drawText( + "bg", 74, + 340, mPaint); + + // Draw a 'button' with the default color + mPaint.setStyle(Paint.Style.FILL); + mPaint.setColor(mDefaultColor); + canvas.drawRect(138, 316, 266, 356, mPaint); + + // Set the text color according to the brightness of the color + if (Color.red(mDefaultColor) + Color.green(mDefaultColor) + + Color.blue(mDefaultColor) < 384) + mPaint.setColor(Color.WHITE); + else + mPaint.setColor(Color.BLACK); + canvas.drawText( + "def", 202, 340, + mPaint); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(276, 366); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (event.getAction() != MotionEvent.ACTION_DOWN) + return true; + float x = event.getX(); + float y = event.getY(); + + // If the touch event is located in the hue bar + if (x > 10 && x < 266 && y > 0 && y < 40) { + // Update the main field colors + mCurrentHue = (255 - x) * 360 / 255; + updateMainColors(); + + // Update the current selected color + int transX = mCurrentX - 10; + int transY = mCurrentY - 60; + int index = 256 * (transY - 1) + transX; + if (index > 0 && index < mMainColors.length) + mCurrentColor = mMainColors[256 * (transY - 1) + transX]; + + // Force the redraw of the dialog + invalidate(); + } + + // If the touch event is located in the main field + if (x > 10 && x < 266 && y > 50 && y < 306) { + mCurrentX = (int) x; + mCurrentY = (int) y; + int transX = mCurrentX - 10; + int transY = mCurrentY - 60; + int index = 256 * (transY - 1) + transX; + if (index > 0 && index < mMainColors.length) { + // Update the current color + mCurrentColor = mMainColors[index]; + // Force the redraw of the dialog + invalidate(); + } + } + + // If the touch event is located in the left button, notify the + // listener with the current color + if (x > 10 && x < 138 && y > 316 && y < 356) + mListener.colorChanged("", mCurrentColor); + + // If the touch event is located in the right button, notify the + // listener with the default color + if (x > 138 && x < 266 && y > 316 && y < 356) + mListener.colorChanged("", mDefaultColor); + + return true; + } + } + + public ColorPickerDialog(Context context, OnColorChangedListener listener, + String key, int initialColor, int defaultColor) { + super(context); + + mListener = listener; + mKey = key; + mInitialColor = initialColor; + mDefaultColor = defaultColor; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + OnColorChangedListener l = new OnColorChangedListener() { + public void colorChanged(String key, int color) { + mListener.colorChanged(mKey, color); + dismiss(); + } + }; + + setContentView(new ColorPickerView(getContext(), l, mInitialColor, + mDefaultColor)); + setTitle("Set LED Color"); + + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e8/b0b65633ec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/e8/b0b65633ec870014196aa5e86be5823c new file mode 100644 index 0000000..6c4450b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e8/b0b65633ec870014196aa5e86be5823c @@ -0,0 +1,33 @@ +package com.motioncoding.miband.model; + +import java.util.Observable; + +import com.motioncoding.debugging.L; + + +public class MiBand extends Observable { + + public String mBTAddress; + public int mSteps; + public String mName; + public Battery mBattery; + + + + public void setName(String name) { + mName = name; + notifyObservers(); + } + + public void setSteps(int steps) { + mSteps = steps; + notifyObservers(); + } + + public void setBattery(Battery battery) { + mBattery = battery; + L.i(battery.toString()); + notifyObservers(); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e9/20f5e61ef4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/20f5e61ef4870014196aa5e86be5823c new file mode 100644 index 0000000..283cb02 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/20f5e61ef4870014196aa5e86be5823c @@ -0,0 +1,204 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService() + .getCharacteristic(UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + setColor((byte)127, (byte)0, (byte)0); +// request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/eb/50ab32fae6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/eb/50ab32fae6870014196aa5e86be5823c new file mode 100644 index 0000000..4e9e1f4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/eb/50ab32fae6870014196aa5e86be5823c @@ -0,0 +1,131 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void requestSteps() { + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_REALTIME_STEPS); + mGatt.readCharacteristic(chrt); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + switch (state) { + case 0: + requestSteps(); + break; + } + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(characteristic.getValue())); + switch (state) { + case 0: + System.out.println(characteristic.getIntValue(0, 0)); + break; + } + state++; + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ed/003a3572ec870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/ed/003a3572ec870014196aa5e86be5823c new file mode 100644 index 0000000..f3ec95a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ed/003a3572ec870014196aa5e86be5823c @@ -0,0 +1,55 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class Battery { + public int mBatteryLevel; + public int mCycles; + public Calendar mLastCharged; + public Status mStatus; + + public static Battery fromByte(byte[] b) { + Battery battery = new Battery(); + battery.mBatteryLevel = b[0]; + battery.mStatus = Status.fromByte(b[9]); + battery.mLastCharged = Calendar.getInstance(); + + battery.mLastCharged.set(Calendar.YEAR, b[1]+2000); + battery.mLastCharged.set(Calendar.MONTH, b[2]); + battery.mLastCharged.set(Calendar.DATE, b[3]); + + battery.mLastCharged.set(Calendar.HOUR_OF_DAY, b[4]); + battery.mLastCharged.set(Calendar.MINUTE, b[5]); + battery.mLastCharged.set(Calendar.SECOND, b[6]); + + + + battery.mCycles = 0xffff & (0xff & b[7] | (0xff & b[8]) << 8); + return battery; + } + + @Override + public String toString() { + return String.format("Level: %s \% Cycles: %s State: %s Last Charged: %s", mBatteryLevel, mCycles, mStatus.toString(), mLastCharged.toString()); + } + + static enum Status { + LOW, FULL, CHARGING, NOT_CHARGING; + + public static Status fromByte(byte b) { + switch (b) { + case 1: + return LOW; + case 2: + return CHARGING; + case 3: + return FULL; + case 4: + return NOT_CHARGING; + + default: + return null; + } + } + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ed/708cb2d1d98700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/ed/708cb2d1d98700141885aa2aa9523af4 new file mode 100644 index 0000000..33f8d6a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ed/708cb2d1d98700141885aa2aa9523af4 @@ -0,0 +1,7 @@ + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ed/a0d8bd0be18700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/ed/a0d8bd0be18700141885aa2aa9523af4 new file mode 100644 index 0000000..5b97a65 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ed/a0d8bd0be18700141885aa2aa9523af4 @@ -0,0 +1,80 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + for (BluetoothGattService service : gatt.getServices()) { + for (BluetoothGattCharacteristic character : service + .getCharacteristics()) { + } + } + } + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (status == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ee/6030aac3f7870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/ee/6030aac3f7870014196aa5e86be5823c new file mode 100644 index 0000000..2ea5fba --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ee/6030aac3f7870014196aa5e86be5823c @@ -0,0 +1,236 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.debugging.L; +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.LeParams; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_LE_PARAMS = UUID + .fromString("0000ff09-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.menu_overview, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_leparams: + if(mMiBand.mLeParams == null) { + L.toast(this, "No LE params received yet"); + return true; + } + Intent intent = new Intent(getApplicationContext(), MiLeParamsActivity.class); + intent.putExtra("params", mMiBand.mLeParams); + break; + } + return true; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService().getCharacteristic( + UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + // setColor((byte)127, (byte)0, (byte)0); + // request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + + // handle value + if (characteristic.getUuid().equals(UUID_CHAR_REALTIME_STEPS)) + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + else if (characteristic.getUuid().equals(UUID_CHAR_BATTERY)) { + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + } else if (characteristic.getUuid().equals(UUID_CHAR_DEVICE_NAME)) { + mMiBand.setName(new String(b)); + } else if (characteristic.getUuid().equals(UUID_CHAR_LE_PARAMS)) { + LeParams params = LeParams.fromByte(b); + mMiBand.setLeParams(params); + } + + // proceed with state machine (called in the beginning) + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + request(UUID_CHAR_LE_PARAMS); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ee/c0c44450d78700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/ee/c0c44450d78700141885aa2aa9523af4 new file mode 100644 index 0000000..1e9a337 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ee/c0c44450d78700141885aa2aa9523af4 @@ -0,0 +1,38 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothManager bluetoothManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + + bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); + + + public void onResume() { + bluetoothManager.getAdapter().startLeScan(this); + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + } + bluetoothManager.getAdapter().stopLeScan(this); + } + + public void onPause() { + super.onPause(); + bluetoothManager.getAdapter().stopLeScan(this); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ef/20b441b3dc8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/ef/20b441b3dc8700141885aa2aa9523af4 new file mode 100644 index 0000000..503d725 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ef/20b441b3dc8700141885aa2aa9523af4 @@ -0,0 +1,15 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; + +public class MiOverviewActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi_overview); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ef/d0e3bf06ef870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/ef/d0e3bf06ef870014196aa5e86be5823c new file mode 100644 index 0000000..3e44425 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ef/d0e3bf06ef870014196aa5e86be5823c @@ -0,0 +1,191 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + //BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + + private MiBand mMiBand = new MiBand(); + + //UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + case 2: + mMiBand.setName(new String(b)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)).setVisibility(View.GONE); + mTVSteps.setText(mMiBand.mSteps+""); + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel+"%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f/30ea5384e5870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/f/30ea5384e5870014196aa5e86be5823c new file mode 100644 index 0000000..b42f462 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f/30ea5384e5870014196aa5e86be5823c @@ -0,0 +1,110 @@ +package com.motioncoding.miband; + +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void requestSteps() { + int steps = getMiliService().getCharacteristic(UUID_CHAR_REALTIME_STEPS).getIntValue(0, 0); + System.out.println(steps); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + requestSteps(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f0/507caf71f9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/f0/507caf71f9870014196aa5e86be5823c new file mode 100644 index 0000000..e291ff8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f0/507caf71f9870014196aa5e86be5823c @@ -0,0 +1,241 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.debugging.L; +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.LeParams; +import com.motioncoding.miband.model.MiBand; +import com.motioncoding.miband.view.ColorPickerDialog; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_LE_PARAMS = UUID + .fromString("0000ff09-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.menu_overview, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_leparams: + if(mMiBand.mLeParams == null) { + L.toast(this, "No LE params received yet"); + return true; + } + Intent intent = new Intent(getApplicationContext(), MiLeParamsActivity.class); + intent.putExtra("params", mMiBand.mLeParams); + startActivity(intent); + break; + case R.id.action_ledcolor: + new ColorPickerDialog(this, null, "", Color.BLUE, Color.RED).show();; + break; + } + return true; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService().getCharacteristic( + UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + // setColor((byte)127, (byte)0, (byte)0); + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + + // handle value + if (characteristic.getUuid().equals(UUID_CHAR_REALTIME_STEPS)) + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + else if (characteristic.getUuid().equals(UUID_CHAR_BATTERY)) { + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + } else if (characteristic.getUuid().equals(UUID_CHAR_DEVICE_NAME)) { + mMiBand.setName(new String(b)); + } else if (characteristic.getUuid().equals(UUID_CHAR_LE_PARAMS)) { + LeParams params = LeParams.fromByte(b); + mMiBand.setLeParams(params); + } + + // proceed with state machine (called in the beginning) + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + request(UUID_CHAR_LE_PARAMS); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f1/b002584ff6870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/f1/b002584ff6870014196aa5e86be5823c new file mode 100644 index 0000000..bebfe58 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f1/b002584ff6870014196aa5e86be5823c @@ -0,0 +1,15 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; + +public class MiLeParamsActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi_le_params); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f2/209c627be8870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/f2/209c627be8870014196aa5e86be5823c new file mode 100644 index 0000000..071cc7c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f2/209c627be8870014196aa5e86be5823c @@ -0,0 +1,33 @@ +package com.motioncoding.miband.model; + +import java.util.Calendar; + +public class Battery { + int mBatteryLevel; + int mCycles; + Calendar mLastCharged; + + public static Battery fromByte(byte[] b) { + return null; + } + + static enum Status { + LOW, FULL, CHARGING, NOT_CHARGING; + + public static Status fromByte(byte b) { + switch (b) { + case 1: + return LOW; + case 2: + return CHARGING; + case 3: + return FULL; + case 4: + return NOT_CHARGING; + + default: + return null; + } + } + } +} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f7/60e50729f8870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/f7/60e50729f8870014196aa5e86be5823c new file mode 100644 index 0000000..2a97e03 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f7/60e50729f8870014196aa5e86be5823c @@ -0,0 +1,235 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.debugging.L; +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.LeParams; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_LE_PARAMS = UUID + .fromString("0000ff09-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.menu_overview, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_leparams: + if(mMiBand.mLeParams == null) { + L.toast(this, "No LE params received yet"); + return true; + } + Intent intent = new Intent(getApplicationContext(), MiLeParamsActivity.class); + intent.putExtra("params", mMiBand.mLeParams); + break; + } + return true; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService().getCharacteristic( + UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + // setColor((byte)127, (byte)0, (byte)0); + // request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + + // handle value + if (characteristic.getUuid().equals(UUID_CHAR_REALTIME_STEPS)) + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + else if (characteristic.getUuid().equals(UUID_CHAR_BATTERY)) { + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + } else if (characteristic.getUuid().equals(UUID_CHAR_DEVICE_NAME)) { + mMiBand.setName(new String(b)); + } else if (characteristic.getUuid().equals(UUID_CHAR_LE_PARAMS)) { + LeParams params = LeParams.fromByte(b); + mMiBand.setLeParams(params); + } + + // proceed with state machine (called in the beginning) + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + request(UUID_CHAR_LE_PARAMS); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f7/e045743cde8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/f7/e045743cde8700141885aa2aa9523af4 new file mode 100644 index 0000000..336b358 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f7/e045743cde8700141885aa2aa9523af4 @@ -0,0 +1,81 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.widget.TextView; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private TextView mTextView; + private Handler mHandler = new Handler(); + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + setContentView(R.layout.activity_mi); + mTextView = (TextView) findViewById(R.id.text_search); + mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)) + .getAdapter(); + } + + @Override + public void onResume() { + super.onResume(); + scanLeDevice(true); + } + + @SuppressWarnings("deprecation") + // L Apis are buggy and crap! + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(MiActivity.this); + mTextView.setText(R.string.not_found); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + System.out.println(device.getName() + " " + device.getAddress()); + if (device != null && device.getName() != null + & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + scanLeDevice(false); // we only care about one miband so that's + // enough + Intent intent = new Intent(getApplicationContext(), MiOverviewActivity.class); + intent.putExtra("address", device.getAddress()); + startActivity(intent); + } + } + + @Override + public void onPause() { + super.onPause(); + scanLeDevice(false); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f9/30c53e80e7870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/f9/30c53e80e7870014196aa5e86be5823c new file mode 100644 index 0000000..5c0d5ad --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f9/30c53e80e7870014196aa5e86be5823c @@ -0,0 +1,135 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after auth() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(characteristic.getValue())); + switch (state) { + case 0: + System.out.println(characteristic.getIntValue(0, 0)); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + } + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fa/20ca1b6bf8870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/fa/20ca1b6bf8870014196aa5e86be5823c new file mode 100644 index 0000000..6eadaf4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fa/20ca1b6bf8870014196aa5e86be5823c @@ -0,0 +1,34 @@ +package com.motioncoding.miband; + +import android.app.ListActivity; +import android.os.Bundle; +import android.widget.ArrayAdapter; + +import com.motioncoding.miband.model.LeParams; + +public class MiLeParamsActivity extends ListActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + setContentView(R.layout.activity_mi_le_params); + + LeParams params = (LeParams) getIntent().getParcelableExtra("params"); + + String[] values = new String[6]; + + values[0] = String.format("Connection Intervall\n %s ms", params.connInt); + values[1] = String.format("Connection Intervall Min\n %s ms", params.connIntMin); + values[2] = String.format("Connection Intervall Max\n %s ms", params.connIntMax); + + values[3] = String.format("Advertising Intervall\n %s ms", params.advInt); + values[4] = String.format("Latency\n %s ms", params.latency); + values[5] = String.format("Timeout\n %s ms", params.timeout); + + + ArrayAdapter adapter = new ArrayAdapter(this, + android.R.layout.simple_list_item_1, values); + this.setListAdapter(adapter); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fa/602842a9f5870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/fa/602842a9f5870014196aa5e86be5823c new file mode 100644 index 0000000..640144b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fa/602842a9f5870014196aa5e86be5823c @@ -0,0 +1,207 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.Observable; +import java.util.Observer; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.LeParams; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity implements Observer { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_CONTROL_POINT = UUID + .fromString("0000ff05-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_LE_PARAMS = UUID + .fromString("0000ff09-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + // BLUETOOTH + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + // UI + private TextView mTVSteps; + private TextView mTVBatteryLevel; + private ProgressBar mLoading; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.addObserver(this); + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + + mTVSteps = (TextView) findViewById(R.id.text_steps); + mTVBatteryLevel = (TextView) findViewById(R.id.text_battery_level); + mLoading = (ProgressBar) findViewById(R.id.laoding); + + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private void setColor(byte r, byte g, byte b) { + BluetoothGattCharacteristic theme = getMiliService() + .getCharacteristic(UUID_CHAR_CONTROL_POINT); + theme.setValue(new byte[] { 14, r, g, b, 0 }); + mGatt.writeCharacteristic(theme); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() +// setColor((byte)127, (byte)0, (byte)0); +// request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + if(characteristic.getUuid().equals(UUID_CHAR_REALTIME_STEPS)) + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + else if(characteristic.getUuid().equals(UUID_CHAR_BATTERY)) { + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + } else if(characteristic.getUuid().equals(UUID_CHAR_DEVICE_NAME)) { + mMiBand.setName(new String(b)); + } else if(characteristic.getUuid().equals(UUID_CHAR_)) { + LeParams params = LeParams.fromByte(b); + mMiBand.setLeParams(params); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_DEVICE_NAME); + break; + case 3: + request(UUID_LE_PARAMS); + break; + } + } + }; + + @Override + public void update(Observable observable, Object data) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + mLoading.setVisibility(View.GONE); + ((LinearLayout) findViewById(R.id.textHolder)) + .setVisibility(View.VISIBLE); + mTVSteps.setText(mMiBand.mSteps + ""); + if (mMiBand.mBattery != null) + mTVBatteryLevel.setText(mMiBand.mBattery.mBatteryLevel + + "%"); + } + }); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fa/60457be2d98700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/fa/60457be2d98700141885aa2aa9523af4 new file mode 100644 index 0000000..3e61a52 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fa/60457be2d98700141885aa2aa9523af4 @@ -0,0 +1,12 @@ + + + + + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fb/f0272abadb8700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/fb/f0272abadb8700141885aa2aa9523af4 new file mode 100644 index 0000000..b8aded1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fb/f0272abadb8700141885aa2aa9523af4 @@ -0,0 +1,74 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private Handler mHandler = new Handler(); + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + + + setContentView(R.layout.activity_mi); + mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter(); + } + + @Override + public void onResume() { + super.onResume(); + scanLeDevice(true); + } + + + + @SuppressWarnings("deprecation") // L Apis are buggy and crap! + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(MiActivity.this); + scanLeDevice(true); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + System.out.println(device.getName()+" "+device.getAddress()); + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + scanLeDevice(false); // we only care about one miband so that's enough + } + } + + @Override + public void onPause() { + super.onPause(); + scanLeDevice(false); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fc/905f8b26eb870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/fc/905f8b26eb870014196aa5e86be5823c new file mode 100644 index 0000000..eee7c6d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fc/905f8b26eb870014196aa5e86be5823c @@ -0,0 +1,156 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_pair = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void pair() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_pair); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("pair sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + pair(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after pair() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + byte[] b = characteristic.getValue(); + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(b)); + switch (state) { + case 0: + mMiBand.setSteps(0xff & b[0] | (0xff & b[1]) << 8); + break; + case 1: + Battery battery = Battery.fromByte(b); + mMiBand.setBattery(battery); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_ACTIVITY); + break; + case 3: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fd/804e2405ea870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/fd/804e2405ea870014196aa5e86be5823c new file mode 100644 index 0000000..135fa4c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fd/804e2405ea870014196aa5e86be5823c @@ -0,0 +1,19 @@ +package com.motioncoding.miband.model; + + +public class MiBand { + + public String mBTAddress; + public int mSteps; + public Battery mBattery; + + + public void setSteps(int steps) { + mSteps = steps; + } + + public void setBattery(Battery battery) { + mBattery = battery; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fd/e0907d58d78700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/fd/e0907d58d78700141885aa2aa9523af4 new file mode 100644 index 0000000..0662f28 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fd/e0907d58d78700141885aa2aa9523af4 @@ -0,0 +1,37 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothManager bluetoothManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); + } + + public void onResume() { + bluetoothManager.getAdapter().startLeScan(this); + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + } + bluetoothManager.getAdapter().stopLeScan(this); + } + + public void onPause() { + super.onPause(); + bluetoothManager.getAdapter().stopLeScan(this); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ff/20983376e9870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/20983376e9870014196aa5e86be5823c new file mode 100644 index 0000000..d875c68 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/20983376e9870014196aa5e86be5823c @@ -0,0 +1,154 @@ +package com.motioncoding.miband; + +import java.util.Arrays; +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +import com.motioncoding.miband.model.Battery; +import com.motioncoding.miband.model.MiBand; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID + .fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH = UUID + .fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_REALTIME_STEPS = UUID + .fromString("0000ff06-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_ACTIVITY = UUID + .fromString("0000ff07-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_DEVICE_NAME = UUID + .fromString("0000ff02-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_BATTERY = UUID + .fromString("0000ff0c-0000-1000-8000-00805f9b34fb"); + + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mBluetoothMi; + private BluetoothGatt mGatt; + + private MiBand mMiBand = new MiBand(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + + mMiBand.mBTAddress = mDeviceAddress; + + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothMi = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mBluetoothMi.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + + BluetoothGattCharacteristic chrt = getMiliService().getCharacteristic( + UUID_CHAR_AUTH); + + chrt.setValue(new byte[] { 2 }); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private void request(UUID what) { + mGatt.readCharacteristic(getMiliService().getCharacteristic(what)); + } + + private BluetoothGattService getMiliService() { + return mGatt.getService(UUID_MILI_SERVICE); + + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + int state = 0; + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + auth(); + } + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + @Override + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + // this is called tight after auth() + request(UUID_CHAR_REALTIME_STEPS); // start with steps + } + + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + Log.i(characteristic.getUuid().toString(), "state: " + state + + " value:" + Arrays.toString(characteristic.getValue())); + switch (state) { + case 0: + System.out.println(characteristic.getIntValue(0, 0)); + break; + case 1: + Battery bat = Battery.fromByte(characteristic.getValue()); + break; + } + + state++; + switch (state) { + case 0: + request(UUID_CHAR_REALTIME_STEPS); + break; + case 1: + request(UUID_CHAR_BATTERY); + break; + case 2: + request(UUID_CHAR_ACTIVITY); + break; + case 3: + request(UUID_CHAR_DEVICE_NAME); + break; + } + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ff/20ae37ede4870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/20ae37ede4870014196aa5e86be5823c new file mode 100644 index 0000000..08f999e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/20ae37ede4870014196aa5e86be5823c @@ -0,0 +1,99 @@ +package com.motioncoding.miband; + +import java.util.UUID; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Bundle; + +public class MiOverviewActivity extends Activity { + + private static final UUID UUID_MILI_SERVICE = UUID.fromString("0000fee0-0000-1000-8000-00805f9b34fb"); + private static final UUID UUID_CHAR_AUTH =UUID.fromString("0000ff0f-0000-1000-8000-00805f9b34fb"); + private String mDeviceAddress; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private BluetoothDevice mMiBand; + private BluetoothGatt mGatt; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActionBar().hide(); + mDeviceAddress = getIntent().getStringExtra("address"); + setContentView(R.layout.activity_mi_overview); + mBluetoothManager = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE)); + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mMiBand = mBluetoothAdapter.getRemoteDevice(mDeviceAddress); + + } + + @Override + public void onResume() { + super.onResume(); + mGatt = mMiBand.connectGatt(this, false, mGattCallback); + mGatt.connect(); + } + + @Override + public void onPause() { + super.onPause(); + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } + + private void auth() { + BluetoothGattService service = mGatt.getService(UUID_MILI_SERVICE); + BluetoothGattCharacteristic chrt = service.getCharacteristic(UUID_CHAR_AUTH); + + chrt.setValue(new byte[] {2}); + + mGatt.writeCharacteristic(chrt); + System.out.println("Auth sent"); + } + + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + for (BluetoothGattService srvs : gatt.getServices()) { + System.out.println("Service: "+srvs.getUuid()); + for (BluetoothGattCharacteristic chrt : srvs + .getCharacteristics()) { + System.out.println("Characteristic: "+chrt.getUuid()+" with "+chrt.getProperties()); + } + } + } + + auth(); + + } + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, + int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + gatt.discoverServices(); + } + } + + public void onCharacteristicWrite(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + } + }; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ff/303eea10d88700141885aa2aa9523af4 b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/303eea10d88700141885aa2aa9523af4 new file mode 100644 index 0000000..e8f52a9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/303eea10d88700141885aa2aa9523af4 @@ -0,0 +1,69 @@ +package com.motioncoding.miband; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothAdapter.LeScanCallback; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; + +public class MiActivity extends Activity implements LeScanCallback { + + private BluetoothManager bluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + private boolean mScanning; + private Handler mHandler; + // Stops scanning after 10 seconds. + private static final long SCAN_PERIOD = 10000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mi); + bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); + } + + @Override + public void onResume() { + super.onResume(); + scanLeDevice(true); + } + + + + + private void scanLeDevice(final boolean enable) { + if (enable) { + // Stops scanning after a pre-defined scan period. + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + mScanning = false; + mBluetoothAdapter.stopLeScan(MiActivity.this); + } + }, SCAN_PERIOD); + + mScanning = true; + mBluetoothAdapter.startLeScan(this); + } else { + mScanning = false; + mBluetoothAdapter.stopLeScan(this); + } + } + + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + if(device != null && device.getName() != null & device.getName().equals("MI")) { + System.out.println(device.getAddress()); + scanLeDevice(false); // we only care about one miband so that's enough + } + } + + @Override + public void onPause() { + super.onPause(); + scanLeDevice(false); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ff/508a085ff5870014196aa5e86be5823c b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/508a085ff5870014196aa5e86be5823c new file mode 100644 index 0000000..08ccb90 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/508a085ff5870014196aa5e86be5823c @@ -0,0 +1,39 @@ +package com.motioncoding.miband.model; + +import java.util.Observable; + +import com.motioncoding.debugging.L; + + +public class MiBand extends Observable { + + public String mBTAddress; + public int mSteps; + public String mName; + public Battery mBattery; + public LeParams mLeParams; + + + + public void setName(String name) { + mName = name; + L.i("setting "+name+" as BLE name"); + setChanged(); + notifyObservers(); + } + + public void setSteps(int steps) { + mSteps = steps; + L.i("setting "+steps+" steps"); + setChanged(); + notifyObservers(); + } + + public void setBattery(Battery battery) { + mBattery = battery; + L.i(battery.toString()); + setChanged(); + notifyObservers(); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/.org.eclipse.jdt.core.external.folders/.location b/.metadata/.plugins/org.eclipse.core.resources/.projects/.org.eclipse.jdt.core.external.folders/.location new file mode 100644 index 0000000000000000000000000000000000000000..0b0aba6597fcd06ffc6abdee347a4a28d67714d3 GIT binary patch literal 172 zcmZ?R*xjhShe1S2b=vdAllRFn)Px3k>g%Uv=A>HbhZd(673&uymgeZY-%OpCFZ3#=A{(nXQt@u<))S-rX-dm>gyHcl%{9q73=30rR$|8=VTTXr|M;;l;|br r7p3a!VH4F$ttd$?%1g}AOUutm0ouiY0uDs{{tR|o;OCy|-Q~vsG{ikp literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/.org.eclipse.jdt.core.external.folders/.markers.snap b/.metadata/.plugins/org.eclipse.core.resources/.projects/.org.eclipse.jdt.core.external.folders/.markers.snap new file mode 100644 index 0000000000000000000000000000000000000000..533f00ee7cd668c930274d19fde8fe2ca9ba0569 GIT binary patch literal 384 dcmZ?R*xjhShe1S2b=vdAllRFvjPmIk9sqV9q0s;U literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/.org.eclipse.jdt.core.external.folders/.syncinfo.snap b/.metadata/.plugins/org.eclipse.core.resources/.projects/.org.eclipse.jdt.core.external.folders/.syncinfo.snap new file mode 100644 index 0000000000000000000000000000000000000000..533f00ee7cd668c930274d19fde8fe2ca9ba0569 GIT binary patch literal 384 dcmZ?R*xjhShe1S2b=vdAllRFvjPmIk9sqV9q0s;U literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/a0/4/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/a0/4/history.index new file mode 100644 index 0000000000000000000000000000000000000000..b6557027aed444212f36aa3dca1c6ed5cf6db01d GIT binary patch literal 76 zcmZQ#U|?Wm(AF vEuGb-Z>0)LDzG#LHcXO>t$at;Y7YCt{S(t+_czlSR#xi&abSDS{Dblaq(Dy5 literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/a0/d6/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/a0/d6/history.index new file mode 100644 index 0000000000000000000000000000000000000000..c45bcadcec509fa69b46c8a4312c6a3d8d4d8042 GIT binary patch literal 861 zcmZQ#U|?WoP|+_+E!NLTtjsSh(N9b+$t=q(sf^FfjL$DiEh@`QE!V5a&0!F_(4)8R zT|0w_WY*Fb*-x8nF5IY1^toGlJ=m8Z{Yx|H#q%g`yF67NVKlfS{Y>ZWyM4` zusDM>j(7z}Cr`l92&H>S+AbKfgS8dhUR{H19LFpsu(-e@>yx*U)CbIB0E;W!pI?nE z9+3|bXE^n*1X+BBAVfT&qbm(rJmL8N6i_m{F!xUsvUr6XL_9z;%pF+RsTDI6b7VD40w35 zJ=ouS2>=XWoC?O&*_InkZK<>)Z3|BY?@)GxZ)Wcu3<8@l04~t0bE42itzA+`zGGx*>cUIVo8@>1=c|IOV^JN zg3fj%xVGhMci?Eohi|l%voRj~d&75T4_BGV7xQU0pWRPRnh#*kQvV<}WGE;~u+9k9 z6jfTY!N`r2*b{F~Yq;#^weS{2TS(9O#xJMQ{IU+CGl}*=_T>MZ*Cd~06N(8 zN~OQq*yd5Hat;OWDT3+XAR3TdRJ>|Kvl902VTA|(I- literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/e4/81/60/2f/29/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/e4/81/60/2f/29/history.index new file mode 100644 index 0000000000000000000000000000000000000000..d9db43ce076a6a8ae0b02fe5478a2b9aa44e0090 GIT binary patch literal 1499 zcma*mT}YEr7zgm9CP^3isu@;-(g&H98y%5+384E=rA{JQ*Q4X`1=EuTm-2~ZrEdD_k-v0RWJcsi?CzLU^gsD_D z<}y{8$)GZrEP9i%%v7#79#t9irLwVn-pX~yRC%(+qBGa0R?1eH3DV}Bj)`Wrd}U>u zzv}bZ+(1LME`Sof`q=*|%ncd;|eiY^Y2v+Q&;y4OuE^xBQ+wr55@M_YJ2AKjmA z;O^;fk3?tggWQFoshBZ1XGcOYcURw~H-7Md;{fFc20iG`I&$S)`xErKdqq4i*0)?k z_wOS2j)k9z7dGNgRf6h`DQQ2;N-h6-5*b43W zh>}^@;Get6H`}8xuL^?KRa&_VBgwUs;J%WD1}w{R@TTLpkSpCqThWF0)QosNV*@%H z)$#dk{QmSf%$I5%!41wB+nW_%t@3RB@Q+U6#UD zbge|Lo^{+tx4Wq^pWSQ4#xhg3)A{?NA7L{d4>hI?Kkh)63dvcN;QYtm=I}YT6q zz*F+1Z5Pg<+iY1p9|*>6`t9*ecT?`{%MNNLGP!Fr4#lEN!3^%c{Ko!IkpJUMy@(f7 zpwr4`*-%4oD5^TGmVJlLZ0T;kqx$EI#5r)bhCEO_oq+Bf?&5iG*OwS{-)nNQVn{%b zXdqXXiec!DN61}aGDA=P(az`FPwoAPZ(0nJtEbXFplb@ql`BFYx};g~wQ;@Znd`|# z+0lcZ+}z6dN^M_Hqx)JH{#a>TB)VqO#q%um-M1OIx4*t|G2KupA*{!ph#zdoP9N_V DM`cZ@ literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/e4/81/60/2f/a5/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/e4/81/60/2f/a5/history.index new file mode 100644 index 0000000000000000000000000000000000000000..84d4cbb3e3d481c364b4f6162021ef33ce5e9e61 GIT binary patch literal 209 zcmZQ#U|?Wmu+T3qO4d)#&(+V(FUic$OU_Tp%uCnL%}h$nOVKaOOfA=U&d>;o@AKV&bk;MawA>s-$NBOad0|2UbPagmP literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/e4/81/60/2f/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/MiBand/.indexes/e4/81/60/2f/history.index new file mode 100644 index 0000000000000000000000000000000000000000..ab05ff1254140a5ed9984a33c8052b34f41800da GIT binary patch literal 3405 zcmajhYfMuI6bJAN!hrZlRb-uy+D*|)Kni2RMA-!&Q$*?1K_Lp4m$b4%2UzOV?JAp( zDWjO_x&e-9n24xlG6f>oMV2wNu>Cux!xk!4Zt zyc;_hPvIApK1Wv0eWdFilNRa3FsxR6q=UFjJ`&uL(jubH)_Z_67Y}q^Cwcut7jT)I zn>Tf7H9EJwYa(@RkTc|MGkxl>ksjOC;ne^4DLZyP>Tlv|5jua$PfFe7`2_NYgB5Pn z70(92E$Y|@X3}Gg8UQ!NdZ|mxa|*d#}%>isvNM^-)I9S5J<1I{IuJ-tkxOa5aw=KmaXo4Pj7?)9>6 z>XHC-OU#BV)Xl0c=+XJEuA|;Ox(b{Ldd2r2tx3z)DAV#B{{v38`NYTnyx8}R_2t%# z-fi;~mL~kJ(`RN)VuFMZ(8n0 zogHWQ$9*E|I!!6$`F%O-ACms&1$OUiOQs%jqXhdSR<5FMY5fjdc9b1KU0c2toN-O} z9VGqS2_D?kbM`grWo@5fewSPCJ(6eB(b-C48+HD`Cdf&SaHUMx} zI(2pM8gQ}xZ4GtF`FM2eg)r(%O3~FH>M5+>pzW z;Fhqp7pPn2qw^2EYpF}8E`~f`*zQGLw|5aZ=N;rk-MnWZxFA3IYA>0qSD`a5-EGv_ z_63kvSI0FtctQlYw13s-)P>>U;Ih&lId!8qIx8q#O4#y7O zBzq2TMHe3r9-wX-I|ujK_U)mb7x|a>kzN)A&PqHJsS8Dc*q`yG2X%g30Jw2M!$3Fb zF(jZ1B39m|&PeP&p|yv)jX~FqeBMEwE0#jP&Szn(gGcz_+>MIMU1Y8?5S{NBx)wrmmP4ZGq! zsEhAS0XJFuA9a$s!V+|*AU3k$GTpX~ph`O$6JodCdOQ*hMpF8Gj!cWq>yQ1hd@K@eVQE9TI>?Bo=C65LQQ)J9z%P>ubrY87?&Oatbf<;-dv~0Kqm@2x6$~a znzyYY0fDUXRZK2doskMl4WiurnANjsIT?+oquFFydAX@t1);G{$K*7voQ#iG{sQj& zj^1`o;Ay{yh7|rh8%VPvl>}^AR7XypOAnl$^I4 zcG-aPx%%c1jkYzkezFqThv2%bT}8*+$T=sedPTQc_=|b7o_Z~;*`fdX(8xU`MP)65nnr;_?bxD@Y*VSB0$C=^?!MSl@6K4W zvnEy#9FXA18FAo0fCC`@1upy<9J%oa@MdE>+qFYdiJ-Cv%d)Cd?O~pOx?$P!ohBE^8Dz4tMtG{ zKNRB_-N%7(1N4$XI!{+K8e5KKilX#3W zc%VYzPiZ|T7!MZ14pPT`< zxBULo=mT!d9uGs0`=cI|ES{zeESmS>^=x=2xk!&@j3dT&w*yRz0{>B;C z;4VV|DD30rUr$o-06$R%>B-Tk#4evk-G7%xS>BZHoy(g-o;SN0CTw4v3AcAF6L?~V zn>U}4dCv_Sw!Zsf#)cnOvZ4IV<+I_xGnMkU=aOT|RJs{*e0*_o+)2qn=3s5#$G9P4 zUr`OfV1-BgZ|Sq~`ycT3#R_1)@SRvNz%LG5&l_E8abvB><|8P>l^7{=R5b0H0u5E7 zeQc3)7WW$mPgg-_J?jR}H7IjENFtObE`qzYd$wE71H2JE^tqH&y}=QIQvv8?C~)Us zh-|{i=9xNTh6YCh!+>?fe7(C^&qU0mGAxNP$a~H!u;x?Q7$`k$*?I@ZsXK39{c@(q zPgd%&w0`+|eD7lJyufQa87l7caW?;@`m+nJmdSQ^S#a}X=Jj}cR*&0gukBP^4YazO zm0)jbu-AWXWL7z!g_aG$pY<1^GMAUexEk`QN=%i{n#jXQxW`dQjG3$HYX>&$=G1g* zB?4CjxM(RkwUpGum9pAgWNSN@FhoZIH1WS}~XFx~@1i3tb&=4L8C`F8WcR!LPd%MT(ULa6) zthCiC(>iwS)JHobwa!>71L$B|tF%0vij2i+`-iq#wMzZNX{Trv9cTLe?IZWwy}i5a z-R8_Kn;Do~ZePFeejlIj_xF9QIDFq-wa-)2XJ7Ns`2!EWa5Y6yeri#0E!)cQ(V!$o zf)ODWj0rL;@DU-(^8LXW8^+(ogec;)0|PslAqGzM!9V=-Yd>|BAod4Pgk$3p3hao= zfrucYKwK2U9Ewqu)C36)A(54b{cyYwJ_-pjf;yumRLPq5UaB%Oz=%CEBg**uAXR}s zckogCDMVE=Vt*orcv&i;rZ+U>y9W|7%LUpP4)IY&r2K5uKZWw`qbg!Zl9+x}Le1+P zKr|bR3!+S?oCMy;R!adCbT)!*U{CnwxheZZ*{1< zy{n_Iv%Q4c){^9oWxyQ)k~;z_ckE5G*sZC5zcsdsk!5&sT$qUrZYAGzfPzB_(eCr`o zpH(4}hvTT5i2+Mrmxla-)P*YiI``~*DyLD0R8cjtPgSLx*r)17`|PvH=BrJrm)l0q zY)y+)W@{689)T_Zwv$1-v<)zPKeFIAjp@b>8`XWZS7W22mTXi(k3Ac8JFA6AwNtSo zE8qCcYNwe{JBvrp35yi9!zAQ^x}sGo3m&->xWP{?9Gwv~8$WDb@z1l)Vg~;-@|F6p zG+>6ng68y^Q-8qPSWkrEd4N0$ny8_uwZuzq#AsrO0oyK5MmdIkNHL_Sd<8GBK)Rw$KLB+JO7sutJ6UPzSU;qYSK>tj>tBTgF;+JCeL&Tfu zP8C1>HoCQ6tSR6wgkNz|w@2C-e9No>vFx^~m1&i1~x)uD}jt)brD zj*VNa#CTO&F*aW>kaE3DVts|RShwD`N26Q*Sih=e?8UlpSih>>zSQ4LNWBfL-*hQr zeLyTmSF!44H?hw|%0Bxrg~0kt8r_2R&tR;d!bTI0k3AcWA=aPpURJ(I!TM_mwX-}G zY?uv)4muidz?>kWoe3n#Ju-?*#f$k{1K0!18}pxb7CaO=<`30fuYm&(^D9x$%#l71 z^Wzxumx1{mz^)s|-f9#OyKc#9L{dD~ZxTkt26kO?y%(njTApze`%LuNXPK;mYDz3tn!wE`N`0) z9n7zIf3Cs&g$OL_o8f&k29cd<$RQ9oPTiHW$|9I=okcKmPUbv%izJuNoE z4W#O+!@=uuvz1{tZNZ^v!{40MC`BG^=z8~<7j00}(}(#DAkfr6>^pcs0F2&wXEjQZ1A%qV zT=0N^2LuAiv|^`IjqIoA#~(QOvuZK+nzkuT8S~GnZkM*OOs}@`Z*l z!}JBsOKVr+6v%d{`d~x`r!^}vhTACWKZNC4)HBS>%x)Tqq9Ec_I|)HSM$OV1S{7)? zaf@?EMs&)ROlki0=1{|QCBc2u;eDDeyI_f*vaN8jVTCsuR_MRJSzC|)c49p}#`Rz+ zq9JWmfQ)XSfJ8GQd>&$04i_vyg#kBA?;1cntron{9Mqg}IIP0R@H->PbVH!YoLwBq zw%U(!TJ3tnY9+&Jzp}uhTB26q+n}04MhYQHDc=A=h&~)ViXnMGh{7_}{=O$ z&!6`e#pL;8Z!`**+cJ5jeH-!}0u>C6e#fF=;X*A}7HWMNF#aMd$!ugJVp57Q4K
  • QYj~F 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 OEha9Wc>i5v`g(&&t?E{4Kehwi3eN2FdG z`t>ku2Sw#VsKp=^FZPq$XbR7`$Be-sY0CiTGj zfBq(BWEtlkT$mUthPu|~9XC~11R@VQ1g?*x7w555?Gu~{CGJGu4{9mCs^??+_fr#Iq!Ab)^_f+pLKZdS!l#f3s HNev$W=^d(B literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/2.tree b/.metadata/.plugins/org.eclipse.core.resources/.root/2.tree new file mode 100644 index 0000000000000000000000000000000000000000..093363b14c7a43e48ef2828a6c18fdcb0689d24a GIT binary patch literal 639939 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 literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources new file mode 100644 index 0000000000000000000000000000000000000000..27773f92c5496d1a6f043952bf54d5bbbe44bd0f GIT binary patch literal 12811 zcmeHOyK3A(6ivN#suV%6xK-w*)oNhD5c>l{T%-$Q?Rc$3yKAIbJ0?}?xHI?%@&&0K zLaO|VKft9M&q`RJ1zpLpv!LOYhBJ2_=bSrNcgMRwzkeJ4dhznr&ehG2%iphubCnyN zc}5+kdN6#ijJKy_j}ebBNrdEM@9qA9{hNwGoNATr>C~u?%WUTBI89D+?N9aLYUanw zOixU<(lBh5l%O}h$+VuZCiMI~Jzw}n<)3r^VNApPpQfgLcB9qYk5BV<G?^-sEEnM3*D+JITExf6Vpbxj>vP=ya*|}l@Y;!1JEDR{goh#=(=Zx9L*j=+ zs1E^-tk@&C>MCYI>z@yIw}o=v-ClgXKKr}-UzK#E(!5qA-<1+KdaTB4q&sYnLm*|Sr*ut!P?%6rw(L!i2# zAmldm)M@@nH=>JJPvV&dlJIBexmZ_EXomRs_pAX$tyH$H3xW|DFeJGlyShShh$J@` z$c~WAxnvPK*=;9tTYFI?*=>@AK$4wL*8!0Xo!r!ha^y}90wmdSCv!>A$w2$r2`5{U zt&{OPxnsI+>u_wek_LDmJA5AtN$uwoa_qK`Df+m3qpO!Smyis7 j>^{fnW9K=xuR-t$dE-N77kZiYe*_}ivc|f)Z*}!O1KyuI literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/2.snap b/.metadata/.plugins/org.eclipse.core.resources/2.snap new file mode 100644 index 0000000000000000000000000000000000000000..df124019b66ddeff735825e6bd597b4a64160094 GIT binary patch literal 25869 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 literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.android.ide.eclipse.adt.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.android.ide.eclipse.adt.prefs new file mode 100644 index 0000000..15d93cc --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.android.ide.eclipse.adt.prefs @@ -0,0 +1,4 @@ +com.android.ide.eclipse.adt.fixLegacyEditors=1 +com.android.ide.eclipse.adt.sdk=/Applications/adt-bundle-mac-x86_64-20140624/sdk +com.android.ide.eclipse.adt.xmlEditor=true +eclipse.preferences.version=1 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.android.ide.eclipse.ddms.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.android.ide.eclipse.ddms.prefs new file mode 100644 index 0000000..a1647e4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.android.ide.eclipse.ddms.prefs @@ -0,0 +1,10 @@ +ddms.logcat.auotmonitor.level=error +ddms.logcat.automonitor.userprompt=true +eclipse.preferences.version=1 +logcat.view.colsize.Application=133 +logcat.view.colsize.Level=18 +logcat.view.colsize.PID=44 +logcat.view.colsize.TID=44 +logcat.view.colsize.Tag=98 +logcat.view.colsize.Text=541 +logcat.view.colsize.Time=131 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs new file mode 100644 index 0000000..b8c9267 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.debug.core.cDebug.default_source_containers=\n\n\n\n\n\n\n\n diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs new file mode 100644 index 0000000..5e2da66 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +spelling_locale_initialized=true +useAnnotationsPrefPage=true +useQuickDiffPrefPage=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..dffc6b5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +version=1 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs new file mode 100644 index 0000000..03da32b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs @@ -0,0 +1,4 @@ +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.applicationLaunchType=org.eclipse.cdt.dsf.gdb.launch.localCLaunch,debug,;org.eclipse.cdt.cdi.launch.localCLaunch,run,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.attachLaunchType=org.eclipse.cdt.dsf.gdb.launch.attachCLaunch,debug,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.postmortemLaunchType=org.eclipse.cdt.dsf.gdb.launch.coreCLaunch,debug,; +eclipse.preferences.version=1 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs new file mode 100644 index 0000000..e2e6b29 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.debug.ui.PREF_LAUNCH_PERSPECTIVES=\n\n +org.eclipse.debug.ui.switch_perspective_on_suspend=always +pref_state_memento.org.eclipse.debug.ui.BreakpointView=\n\n\n\n\n +pref_state_memento.org.eclipse.debug.ui.VariableView=\n\n\n +preferredDetailPanes=org.eclipse.jdt.debug.ui.DETAIL_PANE_LINE_BREAKPOINT\:org.eclipse.jdt.debug.ui.DETAIL_PANE_LINE_BREAKPOINT|DefaultDetailPane\:DefaultDetailPane| +preferredTargets=default\:default| diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..3315632 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.builder.resourceCopyExclusionFilter= +org.eclipse.jdt.core.classpathVariable.JRE_LIB=/Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/jre/lib/rt.jar +org.eclipse.jdt.core.classpathVariable.JRE_SRC=/Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/src.zip +org.eclipse.jdt.core.classpathVariable.JRE_SRCROOT=src +org.eclipse.jdt.core.codeComplete.visibilityCheck=enabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs new file mode 100644 index 0000000..25e673f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.launching.PREF_VM_XML=\n\n\n\n\n\n\n\n\n\n diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 0000000..00773a0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,20 @@ +content_assist_disabled_computers=org.eclipse.jdt.ui.textProposalCategory\u0000org.eclipse.recommenders.calls.rcp.proposalCategory.templates\u0000org.eclipse.mylyn.java.ui.javaAllProposalCategory\u0000org.eclipse.jdt.ui.javaAllProposalCategory\u0000org.eclipse.jdt.ui.javaTypeProposalCategory\u0000org.eclipse.jdt.ui.javaNoTypeProposalCategory\u0000org.eclipse.recommenders.chain.rcp.proposalCategory.chain\u0000 +content_assist_lru_history= +content_assist_number_of_computers=19 +content_assist_proposals_background=255,255,255 +content_assist_proposals_foreground=0,0,0 +eclipse.preferences.version=1 +fontPropagated=true +org.eclipse.jdt.ui.editor.tab.width= +org.eclipse.jdt.ui.formatterprofiles.version=12 +org.eclipse.jdt.ui.javadoclocations.migrated=true +org.eclipse.jdt.ui.text.code_templates_migrated=true +org.eclipse.jdt.ui.text.custom_code_templates= +org.eclipse.jdt.ui.text.custom_templates= +org.eclipse.jdt.ui.text.templates_migrated=true +org.eclipse.jface.textfont=1|Monaco|11.0|0|COCOA|1|; +proposalOrderMigrated=true +spelling_locale_initialized=true +tabWidthPropagated=true +useAnnotationsPrefPage=true +useQuickDiffPrefPage=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.m2e.discovery.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.m2e.discovery.prefs new file mode 100644 index 0000000..67b1d96 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.m2e.discovery.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.m2e.discovery.pref.projects= diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs new file mode 100644 index 0000000..43e97e4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +mylyn.attention.migrated=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.java.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.java.ui.prefs new file mode 100644 index 0000000..2a6fe50 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.java.ui.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +org.eclipse.mylyn.java.ui.run.count.3_10_0=1 +org.eclipse.mylyn.java.ui.run.count.3_1_0=1 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.monitor.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.monitor.ui.prefs new file mode 100644 index 0000000..8d462a6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.monitor.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.mylyn.monitor.activity.tracking.enabled.checked=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.tasks.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.tasks.ui.prefs new file mode 100644 index 0000000..5330e43 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.tasks.ui.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +migrated.task.repositories.secure.store=true +org.eclipse.mylyn.tasks.ui.filters.nonmatching=true +org.eclipse.mylyn.tasks.ui.filters.nonmatching.encouraged=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.recommenders.completion.rcp.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.recommenders.completion.rcp.prefs new file mode 100644 index 0000000..d81163d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.recommenders.completion.rcp.prefs @@ -0,0 +1,2 @@ +completion_tips_seen=org.eclipse.recommenders.completion.rcp.tips.discovery\:org.eclipse.recommenders.subwords.rcp.tips.enableSubwords +eclipse.preferences.version=1 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.cvs.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.cvs.ui.prefs new file mode 100644 index 0000000..f9e585b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.cvs.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +pref_first_startup=false diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.ui.prefs new file mode 100644 index 0000000..56cd496 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.team.ui.first_time=false diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs new file mode 100644 index 0000000..61f3bb8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +overviewRuler_migration=migrated_3.1 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs new file mode 100644 index 0000000..e786736 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs @@ -0,0 +1,7 @@ +IMPORT_FILES_AND_FOLDERS_RELATIVE=true +IMPORT_FILES_AND_FOLDERS_TYPE=23,1 +PROBLEMS_FILTERS_MIGRATE=true +eclipse.preferences.version=1 +platformState=1413155649259 +quickStart=false +tipsAndTricks=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs new file mode 100644 index 0000000..08076f2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +showIntro=false diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs new file mode 100644 index 0000000..15acb8a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs @@ -0,0 +1,3 @@ +ENABLED_DECORATORS=org.eclipse.m2e.core.mavenVersionDecorator\:false,com.android.ide.eclipse.adt.project.FolderDecorator\:true,org.eclipse.cdt.ui.indexedFiles\:false,org.eclipse.cdt.managedbuilder.ui.excludedFile\:true,org.eclipse.cdt.managedbuilder.ui.includeFolder\:true,org.eclipse.cdt.internal.ui.CustomBuildSettingsDecorator\:true,org.eclipse.egit.ui.internal.decorators.GitLightweightDecorator\:true,org.eclipse.jdt.ui.override.decorator\:true,org.eclipse.jdt.ui.interface.decorator\:false,org.eclipse.jdt.ui.buildpath.decorator\:true,org.eclipse.m2e.core.maven2decorator\:true,org.eclipse.mylyn.context.ui.decorator.interest\:true,org.eclipse.mylyn.tasks.ui.decorators.task\:true,org.eclipse.mylyn.team.ui.changeset.decorator\:true,org.eclipse.team.cvs.ui.decorator\:true,org.eclipse.ui.LinkedResourceDecorator\:true,org.eclipse.ui.SymlinkDecorator\:true,org.eclipse.ui.VirtualResourceDecorator\:true,org.eclipse.ui.ContentTypeDecorator\:true,org.eclipse.ui.ResourceFilterDecorator\:false, +PLUGINS_NOT_ACTIVATED_ON_STARTUP=org.eclipse.m2e.discovery; +eclipse.preferences.version=1 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.sse.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.sse.ui.prefs new file mode 100644 index 0000000..4fd0cd3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.sse.ui.prefs @@ -0,0 +1,4 @@ +content_assist_number_of_computers=2 +eclipse.preferences.version=1 +useAnnotationsPrefPage=true +useQuickDiffPrefPage=true diff --git a/.metadata/.plugins/org.eclipse.debug.core/.launches/MiBand.launch b/.metadata/.plugins/org.eclipse.debug.core/.launches/MiBand.launch new file mode 100644 index 0000000..6fb6c68 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.debug.core/.launches/MiBand.launch @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml b/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml new file mode 100644 index 0000000..32e893c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi new file mode 100644 index 0000000..fe3eb4b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi @@ -0,0 +1,3202 @@ + + + + activeSchemeId:org.eclipse.ui.defaultAcceleratorConfiguration + ModelMigrationProcessor.001 + + + + + + topLevel + shellMaximized + + + + + persp.actionSet:org.eclipse.mylyn.doc.actionSet + persp.actionSet:org.eclipse.mylyn.tasks.ui.navigation + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.eclipse.wb.core.ui.actionset + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.actionSet:org.eclipse.jdt.ui.JavaActionSet + persp.actionSet:org.eclipse.jdt.ui.JavaElementCreationActionSet + persp.actionSet:org.eclipse.ui.NavigateActionSet + persp.viewSC:org.eclipse.jdt.ui.PackageExplorer + persp.viewSC:org.eclipse.jdt.ui.TypeHierarchy + persp.viewSC:org.eclipse.jdt.ui.SourceView + persp.viewSC:org.eclipse.jdt.ui.JavadocView + persp.viewSC:org.eclipse.search.ui.views.SearchView + persp.viewSC:org.eclipse.ui.console.ConsoleView + persp.viewSC:org.eclipse.ui.views.ContentOutline + persp.viewSC:org.eclipse.ui.views.ProblemView + persp.viewSC:org.eclipse.ui.views.ResourceNavigator + persp.viewSC:org.eclipse.ui.views.TaskList + persp.viewSC:org.eclipse.ui.views.ProgressView + persp.viewSC:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.ui.texteditor.TemplatesView + persp.viewSC:org.eclipse.pde.runtime.LogView + persp.newWizSC:org.eclipse.jdt.ui.wizards.JavaProjectWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewPackageCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewClassCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewInterfaceCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewEnumCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewAnnotationCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewSourceFolderCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewSnippetFileCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewJavaWorkingSetWizard + persp.newWizSC:org.eclipse.ui.wizards.new.folder + persp.newWizSC:org.eclipse.ui.wizards.new.file + persp.newWizSC:org.eclipse.ui.editors.wizards.UntitledTextFileWizard + persp.perspSC:org.eclipse.jdt.ui.JavaBrowsingPerspective + persp.perspSC:org.eclipse.debug.ui.DebugPerspective + persp.newWizSC:com.android.ide.eclipse.adt.project.NewProjectWizard + persp.newWizSC:com.android.ide.eclipse.editors.wizards.NewXmlFileWizard + persp.actionSet:adt.actionSet.wizards + persp.actionSet:adt.actionSet.avdManager + persp.actionSet:adt.actionSet.lint + persp.actionSet:adt.actionSet.refactorings + persp.perspSC:com.android.ide.eclipse.ddms.Perspective + persp.perspSC:com.android.ide.eclipse.hierarchyviewer.PixelPerfectPespective + persp.perspSC:com.android.ide.eclipse.hierarchyviewer.TreeViewPerspective + persp.viewSC:org.eclipse.ant.ui.views.AntView + persp.showIn:org.eclipse.egit.ui.RepositoriesView + persp.actionSet:org.eclipse.debug.ui.breakpointActionSet + persp.actionSet:org.eclipse.jdt.debug.ui.JDTDebugActionSet + persp.newWizSC:org.eclipse.jdt.junit.wizards.NewTestCaseCreationWizard + persp.actionSet:org.eclipse.jdt.junit.JUnitActionSet + persp.showIn:org.eclipse.jdt.ui.PackageExplorer + persp.showIn:org.eclipse.team.ui.GenericHistoryView + persp.showIn:org.eclipse.ui.views.ResourceNavigator + persp.showIn:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.mylyn.tasks.ui.views.tasks + persp.newWizSC:org.eclipse.mylyn.tasks.ui.wizards.new.repository.task + persp.viewSC:org.eclipse.wb.core.StructureView + persp.viewSC:org.eclipse.wb.core.PaletteView + + + + newtablook + org.eclipse.e4.primaryNavigationStack + active + noFocus + + + + + + + + + + newtablook + + + + + + + + + newtablook + + + + newtablook + org.eclipse.e4.secondaryNavigationStack + + + + + + + + newtablook + org.eclipse.e4.secondaryDataStack + + + + + + + + + + + + + + + persp.actionSet:org.eclipse.mylyn.doc.actionSet + persp.actionSet:org.eclipse.mylyn.tasks.ui.navigation + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.eclipse.wb.core.ui.actionset + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.actionSet:org.eclipse.debug.ui.debugActionSet + persp.viewSC:org.eclipse.debug.ui.DebugView + persp.viewSC:org.eclipse.debug.ui.VariableView + persp.viewSC:org.eclipse.debug.ui.BreakpointView + persp.viewSC:org.eclipse.debug.ui.ExpressionView + persp.viewSC:org.eclipse.ui.views.ContentOutline + persp.viewSC:org.eclipse.ui.console.ConsoleView + persp.viewSC:org.eclipse.ui.views.TaskList + persp.viewSC:com.android.ide.eclipse.ddms.views.LogCatView + persp.viewSC:com.android.ide.eclipse.ddms.views.DeviceView + persp.perspSC:com.android.ide.eclipse.ddms.Perspective + persp.viewSC:org.eclipse.ant.ui.views.AntView + persp.viewSC:org.eclipse.cdt.debug.ui.SignalsView + persp.viewSC:org.eclipse.debug.ui.RegisterView + persp.viewSC:org.eclipse.debug.ui.ModuleView + persp.viewSC:org.eclipse.debug.ui.MemoryView + persp.viewSC:org.eclipse.ui.views.ProblemView + persp.viewSC:org.eclipse.cdt.debug.ui.executablesView + persp.actionSet:org.eclipse.cdt.debug.ui.debugActionSet + persp.viewSC:org.eclipse.cdt.dsf.gdb.ui.tracecontrol.view + persp.viewSC:org.eclipse.cdt.dsf.debug.ui.disassembly.view + persp.perspSC:org.eclipse.cdt.ui.CPerspective + persp.actionSet:org.eclipse.ui.NavigateActionSet + persp.actionSet:org.eclipse.debug.ui.breakpointActionSet + persp.viewSC:org.eclipse.pde.runtime.LogView + persp.showIn:org.eclipse.egit.ui.RepositoriesView + persp.actionSet:org.eclipse.jdt.debug.ui.JDTDebugActionSet + persp.viewSC:org.eclipse.jdt.debug.ui.DisplayView + persp.perspSC:org.eclipse.jdt.ui.JavaPerspective + persp.perspSC:org.eclipse.jdt.ui.JavaBrowsingPerspective + persp.actionSet:org.eclipse.jdt.ui.JavaActionSet + persp.showIn:org.eclipse.jdt.ui.PackageExplorer + persp.perspSC:org.eclipse.wst.xml.ui.perspective + + + + + + newtablook + org.eclipse.e4.primaryNavigationStack + + + + + + + newtablook + + + + + newtablook + + + + + + + + + + + + newtablook + org.eclipse.e4.secondaryNavigationStack + + + + + + + + + newtablook + + + + newtablook + org.eclipse.e4.secondaryDataStack + + + + + + + + + + + + + + + + + + + + + View + categoryTag:Help + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Help + + + + newtablook + org.eclipse.e4.primaryDataStack + EditorStack + noFocus + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + menuContribution:popup + popup:#CompilationUnitEditorContext + popup:org.eclipse.jdt.ui.CompilationUnitEditor.EditorContext + popup:#AbstractTextEditorContext + + + menuContribution:popup + popup:#CompilationUnitRulerContext + popup:org.eclipse.jdt.ui.CompilationUnitEditor.RulerContext + popup:#AbstractTextEditorRulerContext + + + menuContribution:popup + popup:#OverviewRulerContext + + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + menuContribution:popup + popup:#CompilationUnitEditorContext + popup:org.eclipse.jdt.ui.CompilationUnitEditor.EditorContext + popup:#AbstractTextEditorContext + + + menuContribution:popup + popup:#CompilationUnitRulerContext + popup:org.eclipse.jdt.ui.CompilationUnitEditor.RulerContext + popup:#AbstractTextEditorRulerContext + + + menuContribution:popup + popup:#OverviewRulerContext + + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + menuContribution:popup + popup:#CompilationUnitEditorContext + popup:org.eclipse.jdt.ui.CompilationUnitEditor.EditorContext + popup:#AbstractTextEditorContext + + + menuContribution:popup + popup:#CompilationUnitRulerContext + popup:org.eclipse.jdt.ui.CompilationUnitEditor.RulerContext + popup:#AbstractTextEditorRulerContext + + + menuContribution:popup + popup:#OverviewRulerContext + + + + + Editor + org.eclipse.jdt.ui.CompilationUnitEditor + removeOnHide + + menuContribution:popup + popup:#CompilationUnitEditorContext + popup:org.eclipse.jdt.ui.CompilationUnitEditor.EditorContext + popup:#AbstractTextEditorContext + + + menuContribution:popup + popup:#CompilationUnitRulerContext + popup:org.eclipse.jdt.ui.CompilationUnitEditor.RulerContext + popup:#AbstractTextEditorRulerContext + + + menuContribution:popup + popup:#OverviewRulerContext + + + + + Editor + com.android.ide.eclipse.editors.CommonXmlEditor + removeOnHide + + menuContribution:popup + popup:org.eclipse.core.runtime.xml.source.EditorContext + popup:.EditorContext + popup:#AbstractTextEditorContext + + + menuContribution:popup + popup:org.eclipse.core.runtime.xml.source.RulerContext + popup:.RulerContext + popup:#AbstractTextEditorRulerContext + + + menuContribution:popup + popup:#OverviewRulerContext + + + menuContribution:popup + popup:org.eclipse.core.runtime.xml.source.EditorContext + popup:.source.EditorContext + popup:org.eclipse.wst.sse.ui.StructuredTextEditor.EditorContext + + + menuContribution:popup + popup:org.eclipse.core.runtime.xml.source.RulerContext + popup:.source.RulerContext + popup:org.eclipse.wst.sse.ui.StructuredTextEditor.RulerContext + + + + + + + View + categoryTag:Java + active + + ViewMenu + menuContribution:menu + + + menuContribution:popup + popup:org.eclipse.jdt.ui.PackageExplorer + + + + + View + categoryTag:Java + + + View + categoryTag:General + + + View + categoryTag:General + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + menuContribution:popup + popup:org.eclipse.ui.views.ProblemView + popup:org.eclipse.ui.ide.MarkersView + + + + + View + categoryTag:Java + + + View + categoryTag:Java + + + View + categoryTag:General + + + + View + categoryTag:General + highlighted + + ViewMenu + menuContribution:menu + + + menuContribution:popup + popup:org.eclipse.ui.MessageConsole.#ContextMenu + + + menuContribution:popup + popup:org.eclipse.ui.MessageConsole.#ContextMenu + + + + + View + categoryTag:General + + + View + categoryTag:General + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + menuContribution:popup + popup:org.eclipse.jdt.ui.outline + + + menuContribution:popup + popup:org.eclipse.jdt.ui.outline + + + menuContribution:popup + popup:org.eclipse.jdt.ui.outline + + + menuContribution:popup + popup:org.eclipse.jdt.ui.outline + + + menuContribution:popup + popup:org.eclipse.core.runtime.xml.source.OutlineContext + popup:com.android.ide.eclipse.editors.CommonXmlEditor.source.OutlineContext + popup:org.eclipse.wst.sse.ui.StructuredTextEditor.OutlineContext + + + + + View + categoryTag:General + + + View + categoryTag:Ant + + + View + categoryTag:Git + + + View + categoryTag:Java + + + + View + categoryTag:Mylyn + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:WindowBuilder + + + View + categoryTag:WindowBuilder + + + + View + categoryTag:Android + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:General + + + View + categoryTag:General + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + menuContribution:popup + popup:org.eclipse.debug.ui.DebugView + + + menuContribution:popup + popup:org.eclipse.debug.ui.DebugView + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + menuContribution:popup + popup:org.eclipse.debug.ui.VariableView.detail + + + menuContribution:popup + popup:org.eclipse.debug.ui.VariableView + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + menuContribution:popup + popup:org.eclipse.debug.ui.VariableView.detail + + + menuContribution:popup + popup:org.eclipse.debug.ui.BreakpointView + + + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:General + + + + toolbarSeparator + + + + Draggable + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + + toolbarSeparator + + + + Draggable + + Opaque + + + Opaque + + + Opaque + + + + Draggable + + Opaque + + + Opaque + + + + Draggable + + Opaque + + + Opaque + + + + Draggable + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + + Draggable + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + + Draggable + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + + Draggable + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + + toolbarSeparator + + + + Draggable + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + Opaque + + + + Opaque + + + Opaque + + + Opaque + + + + Draggable + + + Draggable + + + toolbarSeparator + + + + toolbarSeparator + + + + Draggable + + Opaque + + + Opaque + + + + stretch + SHOW_RESTORE_MENU + + + Draggable + HIDEABLE + SHOW_RESTORE_MENU + + + + + stretch + + + Draggable + + + Draggable + + + + + + TrimStack + + + + + + + + + + + + + + + + platform:cocoa + + + + + + + + + platform:cocoa + + + + + + + + + + + + + + platform:cocoa + + + platform:cocoa + + + + platform:cocoa + + + platform:cocoa + + + + + + + + + + + platform:cocoa + + + + + + + platform:cocoa + + + + platform:cocoa + + + + platform:cocoa + + + platform:cocoa + + + platform:cocoa + + + platform:cocoa + + + platform:cocoa + + + platform:cocoa + + + + + + + + + + + + + + + + + + platform:cocoa + + + platform:cocoa + + + + platform:cocoa + + + + + + platform:cocoa + + + + platform:cocoa + + + platform:cocoa + + + + platform:cocoa + + + + + platform:cocoa + + + platform:cocoa + + + platform:cocoa + + + platform:cocoa + + + + + + + + + + + + + + + platform:cocoa + + + + platform:cocoa + + + + platform:cocoa + + + platform:cocoa + + + + platform:cocoa + + + + + platform:cocoa + + + + + + + + + + + + platform:cocoa + + + + platform:cocoa + + + + platform:cocoa + + + + + + + platform:cocoa + + + + platform:cocoa + + + + + + + + platform:cocoa + + + + platform:cocoa + + + platform:cocoa + + + + + + platform:cocoa + + + platform:cocoa + + + platform:cocoa + + + + + platform:cocoa + + + + platform:cocoa + + + platform:cocoa + + + + + + + + platform:cocoa + + + platform:cocoa + + + + + + platform:cocoa + + + platform:cocoa + + + + + + + + + platform:cocoa + + + + platform:cocoa + + + + platform:cocoa + + + platform:cocoa + + + platform:cocoa + + + platform:cocoa + + + + platform:cocoa + + + platform:cocoa + + + + platform:cocoa + + + platform:cocoa + + + + platform:cocoa + + + + platform:cocoa + + + + platform:cocoa + + + + platform:cocoa + + + + platform:cocoa + + + + platform:cocoa + + + + platform:cocoa + + + + + platform:cocoa + + + + platform:cocoa + + + + platform:cocoa + + + + + + + + platform:cocoa + + + platform:cocoa + + + + platform:cocoa + + + + + platform:cocoa + + + platform:cocoa + + + platform:cocoa + + + + platform:cocoa + + + platform:cocoa + + + platform:cocoa + + + + + + + + + platform:cocoa + + + platform:cocoa + + + + + + + + + + + + + + + platform:cocoa + + + + + platform:cocoa + + + + + + platform:cocoa + + + + + + + + + platform:cocoa + + + platform:cocoa + + + + + platform:cocoa + + + platform:cocoa + + + + + platform:cocoa + + + platform:cocoa + + + + + platform:cocoa + + + + + + + + + + + + + + + + platform:cocoa + + + platform:cocoa + + + + platform:cocoa + + + + + + platform:cocoa + + + platform:cocoa + + + platform:cocoa + + + + platform:cocoa + + + + + + platform:cocoa + + + platform:cocoa + + + platform:cocoa + + + platform:cocoa + + + platform:cocoa + + + platform:cocoa + + + + + + + + platform:cocoa + + + + platform:cocoa + + + + + + + + + + + + + platform:cocoa + + + + + platform:cocoa + + + + + + + + + platform:cocoa + + + + + + + + platform:cocoa + + + platform:cocoa + + + + + + + + + + platform:cocoa + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + platform:cocoa + + + + platform:cocoa + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Editor + + + View + categoryTag:Ant + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Git + + + View + categoryTag:Git + + + View + categoryTag:Git + + + View + categoryTag:Git + + + View + categoryTag:Git + + + View + categoryTag:General + + + View + categoryTag:Help + + + View + categoryTag:Debug + + + View + categoryTag:Java + + + View + categoryTag:Java + + + View + categoryTag:Java + + + View + categoryTag:Java Browsing + + + View + categoryTag:Java Browsing + + + View + categoryTag:Java Browsing + + + View + categoryTag:Java Browsing + + + View + categoryTag:Java + + + View + categoryTag:General + + + View + categoryTag:Java + + + View + categoryTag:Java + + + View + categoryTag:Maven + + + View + categoryTag:Maven + + + View + categoryTag:Mylyn + + + View + categoryTag:Mylyn + + + View + categoryTag:Mylyn + + + View + categoryTag:Mylyn + + + View + categoryTag:Code Recommenders + + + View + categoryTag:Code Recommenders + + + View + categoryTag:Code Recommenders + + + View + categoryTag:Code Recommenders + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:CVS + + + View + categoryTag:CVS + + + View + categoryTag:Team + + + View + categoryTag:Team + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:Help + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:WindowBuilder + + + View + categoryTag:WindowBuilder + + + View + categoryTag:General + + + View + categoryTag:XML + + + View + categoryTag:XML + + + View + categoryTag:Android + + + View + categoryTag:Android + + + View + categoryTag:Android + + + View + categoryTag:Android + + + View + categoryTag:Android + + + View + categoryTag:Android + + + View + categoryTag:Android + + + View + categoryTag:Android + + + View + categoryTag:Android + + + View + categoryTag:Android + + + View + categoryTag:Android + + + View + categoryTag:Android + + + View + categoryTag:Tracer for OpenGL ES + + + View + categoryTag:Tracer for OpenGL ES + + + View + categoryTag:Tracer for OpenGL ES + + + View + categoryTag:Android + + + View + categoryTag:Android + + + View + categoryTag:Android + + + View + categoryTag:Android + + + View + categoryTag:Android + + + View + categoryTag:Android + + + View + categoryTag:Android + + + View + categoryTag:Android + + + View + categoryTag:&C/C++ + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Make + + + View + categoryTag:&C/C++ + + + View + categoryTag:&C/C++ + + + View + categoryTag:&C/C++ + + + View + categoryTag:&C/C++ + + + View + categoryTag:&C/C++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.jdt.core/.org.eclipse.jdt.core.external.folders/.project b/.metadata/.plugins/org.eclipse.jdt.core/.org.eclipse.jdt.core.external.folders/.project new file mode 100644 index 0000000..6d6be74 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.jdt.core/.org.eclipse.jdt.core.external.folders/.project @@ -0,0 +1,18 @@ + + + .org.eclipse.jdt.core.external.folders + + + + + + + + + + .link0 + 2 + /Applications/adt-bundle-mac-x86_64-20140624/sdk/sources/android-21 + + + diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1255426124.index b/.metadata/.plugins/org.eclipse.jdt.core/1255426124.index new file mode 100644 index 0000000000000000000000000000000000000000..d441e7323100e7b9e0f81faaf54f762c5f456d69 GIT binary patch literal 12478 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 literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.jdt.core/77043017.index b/.metadata/.plugins/org.eclipse.jdt.core/77043017.index new file mode 100644 index 0000000000000000000000000000000000000000..4f411524f98c0ce9515b0f0b1121969bf2747aae GIT binary patch literal 1867176 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%0DD6FrBMNZ;gYN#Q1SuRS604lV{F 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%0D?(8> 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

    vVtj7rU8-u2tw?k9gv}>f7{j%q6!1AeIwFNI~w} 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%0D6GKeBWnkG$XnuH`BC~8QPv<*#@kfD?r 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