From ff1d6e928d549512f3c2a8297e637eabe9c571f6 Mon Sep 17 00:00:00 2001 From: mar-v-in Date: Sun, 1 Feb 2015 23:27:46 +0100 Subject: [PATCH] Update maps, add login basics --- .gitignore | 9 +- AndroidManifest.xml | 88 +++++-- build.gradle | 16 ++ local.properties | 11 + res/drawable-hdpi/ic_microg_app.png | Bin 0 -> 3293 bytes res/drawable-mdpi/ic_microg_app.png | Bin 0 -> 2287 bytes .../auth_gls_ic_google_minitab_selected.png | Bin 0 -> 3053 bytes .../auth_gls_ic_google_selected.png | Bin 0 -> 3922 bytes res/drawable-xhdpi/ic_microg_app.png | Bin 0 -> 4460 bytes res/drawable-xxhdpi/ic_microg_app.png | Bin 0 -> 6809 bytes res/drawable-xxxhdpi/ic_microg_app.png | Bin 0 -> 9594 bytes res/drawable/ic_plusone_medium.xml | 10 +- res/drawable/ic_plusone_small.xml | 10 +- res/drawable/ic_plusone_standard.xml | 10 +- res/drawable/ic_plusone_tall.xml | 10 +- res/layout/login_base.xml | 62 +++++ res/layout/login_loading.xml | 36 +++ res/layout/toolbar.xml | 22 ++ res/values/colors.xml | 21 ++ res/values/dimens.xml | 9 +- res/values/signature.xml | 7 +- res/values/strings.xml | 22 +- res/values/themes.xml | 28 +++ res/xml/account_preferences.xml | 9 + res/xml/authenticator.xml | 23 ++ src/com/google/android/gms/auth/GetToken.java | 4 +- .../android/gms/auth/TokenActivity.java | 4 +- .../security/ProviderInstallerImpl.java | 4 +- .../gms/maps/internal/CreatorImpl.java | 4 +- .../plusone/PlusOneButtonCreatorImpl.java | 4 +- .../GoogleLocationManagerService.java | 4 +- .../microg/gms/AbstractGmsServiceBroker.java | 2 +- src/org/microg/gms/auth/AuthClient.java | 96 ++++++++ .../gms/auth/AuthManagerServiceImpl.java | 2 +- src/org/microg/gms/auth/AuthRequest.java | 91 +++++++ src/org/microg/gms/auth/AuthResponse.java | 97 ++++++++ .../microg/gms/auth/GmsAddAccountRequest.java | 44 ++++ .../gms/auth/RetrieveRtTokenRequest.java | 41 ++++ .../microg/gms/auth/login/LoginActivity.java | 224 ++++++++++++++++++ .../auth/loginservice/GoogleLoginService.java | 71 ++++++ .../gms/location/GoogleLocationManager.java | 2 +- .../GoogleLocationManagerServiceImpl.java | 2 +- .../gms/location/LocationChangeListener.java | 2 +- .../gms/location/LocationRequestHelper.java | 2 +- .../gms/location/MockLocationProvider.java | 2 +- .../gms/location/RealLocationProvider.java | 2 +- src/org/microg/gms/maps/BackendMap.java | 2 +- src/org/microg/gms/maps/ContextContainer.java | 2 +- .../microg/gms/maps/GmsMapsTypeHelper.java | 2 +- src/org/microg/gms/maps/GoogleMapImpl.java | 2 +- src/org/microg/gms/maps/MapFragmentImpl.java | 2 +- src/org/microg/gms/maps/MapViewImpl.java | 2 +- src/org/microg/gms/maps/ProjectionImpl.java | 2 +- .../microg/gms/maps/ResourcesContainer.java | 2 +- src/org/microg/gms/maps/UiSettingsImpl.java | 2 +- .../maps/bitmap/AbstractBitmapDescriptor.java | 2 +- .../maps/bitmap/AssetBitmapDescriptor.java | 2 +- .../maps/bitmap/BitmapBitmapDescriptor.java | 2 +- .../bitmap/BitmapDescriptorFactoryImpl.java | 2 +- .../gms/maps/bitmap/BitmapDescriptorImpl.java | 2 +- .../maps/bitmap/DefaultBitmapDescriptor.java | 2 +- .../gms/maps/bitmap/FileBitmapDescriptor.java | 2 +- .../gms/maps/bitmap/PathBitmapDescriptor.java | 2 +- .../maps/bitmap/ResourceBitmapDescriptor.java | 2 +- .../microg/gms/maps/camera/CameraUpdate.java | 2 +- .../maps/camera/CameraUpdateFactoryImpl.java | 2 +- .../maps/camera/MapPositionCameraUpdate.java | 2 +- .../gms/maps/camera/NoCameraUpdate.java | 2 +- .../microg/gms/maps/markup/CircleImpl.java | 2 +- .../gms/maps/markup/GroundOverlayImpl.java | 2 +- .../microg/gms/maps/markup/InfoWindow.java | 2 +- .../microg/gms/maps/markup/MarkerImpl.java | 2 +- src/org/microg/gms/maps/markup/Markup.java | 2 +- .../microg/gms/maps/markup/PolygonImpl.java | 2 +- .../microg/gms/maps/markup/PolylineImpl.java | 2 +- .../gms/maps/markup/TileOverlayImpl.java | 2 +- .../microg/gms/plus/PlusOneButtonImpl.java | 2 +- .../microg/tools/AccountPickerActivity.java | 4 +- 78 files changed, 1059 insertions(+), 114 deletions(-) create mode 100644 local.properties create mode 100644 res/drawable-hdpi/ic_microg_app.png create mode 100644 res/drawable-mdpi/ic_microg_app.png create mode 100644 res/drawable-xhdpi/auth_gls_ic_google_minitab_selected.png create mode 100644 res/drawable-xhdpi/auth_gls_ic_google_selected.png create mode 100644 res/drawable-xhdpi/ic_microg_app.png create mode 100644 res/drawable-xxhdpi/ic_microg_app.png create mode 100644 res/drawable-xxxhdpi/ic_microg_app.png create mode 100644 res/layout/login_base.xml create mode 100644 res/layout/login_loading.xml create mode 100644 res/layout/toolbar.xml create mode 100644 res/values/colors.xml create mode 100644 res/values/themes.xml create mode 100644 res/xml/account_preferences.xml create mode 100644 res/xml/authenticator.xml create mode 100644 src/org/microg/gms/auth/AuthClient.java create mode 100644 src/org/microg/gms/auth/AuthRequest.java create mode 100644 src/org/microg/gms/auth/AuthResponse.java create mode 100644 src/org/microg/gms/auth/GmsAddAccountRequest.java create mode 100644 src/org/microg/gms/auth/RetrieveRtTokenRequest.java create mode 100644 src/org/microg/gms/auth/login/LoginActivity.java create mode 100644 src/org/microg/gms/auth/loginservice/GoogleLoginService.java diff --git a/.gitignore b/.gitignore index df0fcc88..e4a295be 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ *.iml -gen -bin -build +gen/ +bin/ +build/ user.gradle +.gradle/ +gradlew +gradle/ diff --git a/AndroidManifest.xml b/AndroidManifest.xml index f0383019..1bfbbd82 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,12 +1,11 @@ - - + - - - - - + + + + + + + + + + + + + + @@ -73,9 +102,22 @@ - + + + + + + + - diff --git a/build.gradle b/build.gradle index 7a8140c1..205f0fb4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,19 @@ +/* + Copyright 2013-2015 µg Project Team + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + buildscript { repositories { mavenCentral() diff --git a/local.properties b/local.properties new file mode 100644 index 00000000..9275c7f2 --- /dev/null +++ b/local.properties @@ -0,0 +1,11 @@ +## This file is automatically generated by Android Studio. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file should *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. +# +# Location of the SDK. This is only used by Gradle. +# For customization when using a Version Control System, please read the +# header note. +sdk.dir=/home/marvin/Applications/Android SDK +ndk.dir=/home/marvin/Applications/AndroidNDK \ No newline at end of file diff --git a/res/drawable-hdpi/ic_microg_app.png b/res/drawable-hdpi/ic_microg_app.png new file mode 100644 index 0000000000000000000000000000000000000000..efa2db94d3b96b35e8badab9d8ddcfa8de895a71 GIT binary patch literal 3293 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 bjN|_RHD`RmOA#>Y00000NkvXXu0mjfKyVNS literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_microg_app.png b/res/drawable-mdpi/ic_microg_app.png new file mode 100644 index 0000000000000000000000000000000000000000..708426171f09dca59db690788fa8ef8a18c06abe GIT binary patch literal 2287 zcmVWnN*&VV$Rcy*idIGTtt}4-L zig?!}DlQ}e88Qp&I=?0&EJEB7GG_mzxq|ceCy|iA#EqU!;P?vM7{e!I813_I{_pdy z3L?O1rL7X6fMvnLWMdSg=fQD#L?B52G7sDk3DLS7VF-igO=6#~{pzKLslGR6xe>$4 zn8pc|Rf>j#m0Wn-FV0Lh6ihrx9>}5REc%7(bb6+zN63hR81#F3E*yT~T2*5~TLe!}G2;Gl0-AfGnDee1-9do2IEGK)^hz5>nf2h-9qz=Y;~of(JV^)_zi%f3 zdQB|c>c*MoKJd0N(u3u981d3fGfc6>9Hb;|psq{%UWE8AukFA`UlMwGMEI<1IgO?( zA%^Rh_eSyE8QF1!3IWQ|5bU|I8aZs6Z^9k<#`qkC04p~Orsv`H$1L$@+s;u}Q0GCu zjmLXW+$9IOY`hHg13l)~yz7UZ4`#O7ePnU$;zvlO;4l1Y(Ow>u{)DQZSG}OGv`8b7=wYEL7uT#_!$e z?3FiKi>KMJcGjr42VOnggSS5Mv5&I9sS-MSD3c!W#AASgXJa6NHk@gZCA6Z%fi-0+ z$QScReh$5SZtY^)B90D-ELs)SfD)-K8KCn54ct1KZl zc(V5PZ#!{|!+_@QFdSx{Hhlmqil->pKWOOHT3(W+A|a7wp-&HHPD1OCcHy_jl{BhI zs2_oC?Qsb)f~)Uy;Q5&jtUJeEL=1sBU_1QU6)jdOjy{4`U?V463LOVrIAWA7#R4lI$Bm&4h0hYnH ze(J?(a{ahb0-l-bAZf^HQW-Ja(GBq>FDECv{X zUXsv(^d+>N3fT-zAq!EGFlzAbZt6vl&JPydu2x%S(KU75*nPn-d0@jFwUQ?yp!_XD z-(I%UgA-CeL(ZCdzQtBd z%25eC_Kq8$cf<(j_5lO4N*3)Ub}q?9vD1J({|sO?vuqr@I{%)rCj9X!S!RbWg|K3m zCq^Kag@!}m*mrCww5f}I^Q~4~?jkED0nfn9EVAJJMeL9R_{~RNY&bz}f@FC824eYi zD_$wHOV56F*oW$RsUua>Xd`)`I?ZOT|EA`?suo?*(Ht=iAXQ)&aBxK)EY$LU*&W4? z_IglH5>bZT#AAN31wSvfN!{!@+MPX9>p?Fi1sX8|l!Y4ir%#}9l^tfy5!YS6Yo)xc zoO&lNMp{yjQ_H;e(QG(l9cgDkl=8k=;80-aLH|f?cJ289etpD;p7@4_2uQsUWuf5^ zSpTR6O|7!)nQY!Z?L~;~|FqW!N#w+=TQ z&LHtU@vsOm+)+OTRSKFPj8uQkYa%)R-vsZf5^7*4b7{tavO=_1-~T8cQ4u8VZ8TtI zZzg${2#|zWFO&%ak|%mKU1)Lu1F}tumRICTnu?{-R0*VVxGRwuY49u-ICetL2v8Pk z_%OMITt7WpY#M+2@l=l2qXA{(opITyfy@Xn39&5HwEw|to4?nP@OWLhG#K;jd*d9_ z=G1e7!HH-z=>4Kzxf3A-~DJB?+#G8@p4Okr{DM{0J#c&Y8mJ2&t zUMpKlS4_dgS4?avnE;2Pdy8*b{MuThb3!S3LLd?%eW>5Tp&lDu0VzSJNh(P*jNXQt zCCF~lnqoK-33dGIXlu<&FXQs5^Mp|xoPbJ#?K}z$#gBZ=G%Z381Ha*y0Bn5V+bsOUM=5N3H|6U;EE@Qr8X2aM-<=QA z{i~4&k&)W{F8#aFCDGLP-W=%<*53OBjDz>W6Y8Hn#?YVq8?}GB4;P^I+H(L@-~TE6 zbF98r^pbR>K_<0UIhwyV_A3z8=5{1+bg8t9PQ&0Iaqz_XVi#+0V-V zJV>y7cBs1N6VFs`zH1a!OJCXX?Tng1*P3*Ixn-D(YPNC4$7sU1#Ms8lQtKz*xCL0w z-FP>RCl7Q4_?^7~G-nRyhkoym$8sB|H>&lM_!BSfy8)^Rz;QPr?j~tp$h=SFzD1lI z-u#T?pLjM8kh}T!`#Vsa4njc2HCXGb^_3vd(6GtSXdhJ9gt{X&^}H{QDse}RYF;Dr zC9(_J6G7BkACog!4|iM87eMk(WZNV(N}=;P1AI(x5`r7BOYyDhg6qa6iTOo*mqMv~ zJ`rM(o?{rNFFQ{32F^NZAW_AfVj zOOnw>t_-{YfrVPz=be)k_U+ujO=S|TiAQe#@_ft zFQ4V1AD^U7MQDmQK0z`q=s=iiUavu=HrYRMr`T?2SG(rMfW zBgC6e}0a!b?Y!DWMSbb+qSqQHM^Z zG1f)|(3rJpf(=RKF{)ryDZ0wF6P4bxiE19##JAe2;u_(6J>dAcT91;i^$`PA8>~0J5qWH^-?kX0hCv8?%g#+h z7!jU7bBTwaJwv6K!?&90YcV0D|90({3uz~oEGmxxkG>$VO0|^d(1|4uJTphm37zxK zcWvT7SmnNhKWDKCu44vjJ@#%*XM38(#44Iv zU@dkOlw3Z~m%cj#s(fb8c8myr`=K3taK|{`eC{0ecEH~0QSQBdGtZxSgL@zS8FQ;b zwOk~y*@aHBB+^)3uIXGTp2KUb)*4)7gfBP7;5kJ;|DP}MAJ6@YyLN5invGS~7hL}O z_9-@xmH~MEQk_p9`~|Z$VWe8Z3v8xF*HW4$GV@e6DlzI#(s_1bXBCWNs8omf(U}(i zJM&9Qd7;tvdHi!X@sZIoR^iy$6<)dEF*Y_#%M1FxrCBvbVmBm>!$zZ!WMp%i5!RyM zqxWrCpHnIp*)YDI^6)y!)gdNF%Dq)?*t(8=@0#S|ax+y`Rye)X#J5T@X9%pazMSLXyRT!%c$u$!?<9^RYiFUF z_RTeYAld`UDgl!(Ga}Tz07u|`Q^VYQ{bqJ=9%8s)Fev9&TO4}%ER(|}uAdqMz_-d@ z+%`qd5x(%96BJ#8B&;Ci)S?L*O_r3JOs7eu(@8BkBGg(wyEa$&tJ}A;@7i$|mg^im za*9K*T;TZG8a2;`<)bS1@15c+`>vy$cWDQfKfm>Aj?LG2*VB=7Mr(Rp+?gK|ySPn3yBCcD&xCWCGR4rdW zG{^DzW&ZWP8yTw>QHA^8x0P?cu!wK9iz@|Q2emt5*{Ea~lBUC12p*b#z~*X>f4p-i z8;1(aFE#k=H=bv)oo94>9pz$?oa=_UK8hG&Xmo_{zO=;04jiG@^bmm^6BRa9Ts*4- zQJrCKi1_AFKvtF~{iHY`1dMu+*q z%rcK1J>6TY=yu3b-kkZft~im2_WPI`-v9MU23=pL?C$3IiN|7Pd)ZL5AJVs&wHl;_}tBJ z;hy(Q^7Py#W)|zrue7PR1Ex2WdHbdcw_H8Kv$KordE_`RFM8ywWvtcAwoR5YC6Wup zJ99D9(ShBFUNNJVe9mFX%kjy_j`7&hGu*j*l3U+4!PHolJ9cc~jvf7ZCl^;ZG_%Ox zJ@F#nf9(x$iWI74e4EiI)Yr9W#q&-j7vQnsrzh0WXO&HBI#9x=B;iiMxg* z)&mhojVmFQNmfffqgAg1Pcn7QQ_cZePcxa|d^*J8T{>5@ z-}#$;tSl50|4e{H$VLVox5fa=n#Y5ZZX?9GHlDo*it6yjrnc)fK=kOU_K%oKoq^3- zGicV%bQoIxfB%M|SMXG?Y*u&h%7O&~Kq;914&<)s=SWjl?bQPHZr&4ZsYl{(cct!i vrQ?#{ljF12>+Xy<5A7|Tz1v>ox8nLWpY&n1CI?Ni00000NkvXXu0mjfY{J}a literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/auth_gls_ic_google_selected.png b/res/drawable-xhdpi/auth_gls_ic_google_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..e23dc238a27be3243d15b34a3fd2a93cc7fca61b GIT binary patch literal 3922 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 literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_microg_app.png b/res/drawable-xhdpi/ic_microg_app.png new file mode 100644 index 0000000000000000000000000000000000000000..059ef220a18f03a08de5724d702afe928d08de29 GIT binary patch literal 4460 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 Hu0mjf+)eC- literal 0 HcmV?d00001 diff --git a/res/drawable-xxxhdpi/ic_microg_app.png b/res/drawable-xxxhdpi/ic_microg_app.png new file mode 100644 index 0000000000000000000000000000000000000000..55da9800e96b565a125e73143755e8263bfcfe69 GIT binary patch literal 9594 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 literal 0 HcmV?d00001 diff --git a/res/drawable/ic_plusone_medium.xml b/res/drawable/ic_plusone_medium.xml index ac2820c1..ea59380f 100644 --- a/res/drawable/ic_plusone_medium.xml +++ b/res/drawable/ic_plusone_medium.xml @@ -1,12 +1,11 @@ - - - - \ No newline at end of file + \ No newline at end of file diff --git a/res/drawable/ic_plusone_small.xml b/res/drawable/ic_plusone_small.xml index ac2820c1..ea59380f 100644 --- a/res/drawable/ic_plusone_small.xml +++ b/res/drawable/ic_plusone_small.xml @@ -1,12 +1,11 @@ - - - - \ No newline at end of file + \ No newline at end of file diff --git a/res/drawable/ic_plusone_standard.xml b/res/drawable/ic_plusone_standard.xml index ac2820c1..ea59380f 100644 --- a/res/drawable/ic_plusone_standard.xml +++ b/res/drawable/ic_plusone_standard.xml @@ -1,12 +1,11 @@ - - - - \ No newline at end of file + \ No newline at end of file diff --git a/res/drawable/ic_plusone_tall.xml b/res/drawable/ic_plusone_tall.xml index ac2820c1..ea59380f 100644 --- a/res/drawable/ic_plusone_tall.xml +++ b/res/drawable/ic_plusone_tall.xml @@ -1,12 +1,11 @@ - - - - \ No newline at end of file + \ No newline at end of file diff --git a/res/layout/login_base.xml b/res/layout/login_base.xml new file mode 100644 index 00000000..45fb73ca --- /dev/null +++ b/res/layout/login_base.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/login_loading.xml b/res/layout/login_loading.xml new file mode 100644 index 00000000..5a6c0556 --- /dev/null +++ b/res/layout/login_loading.xml @@ -0,0 +1,36 @@ + + + + + + + + \ No newline at end of file diff --git a/res/layout/toolbar.xml b/res/layout/toolbar.xml new file mode 100644 index 00000000..a5be1e8f --- /dev/null +++ b/res/layout/toolbar.xml @@ -0,0 +1,22 @@ + + + diff --git a/res/values/colors.xml b/res/values/colors.xml new file mode 100644 index 00000000..264a58aa --- /dev/null +++ b/res/values/colors.xml @@ -0,0 +1,21 @@ + + + + #ff4285f4 + #ff3367d6 + #ffFFAB40 + diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 9da907a0..367896f3 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -1,12 +1,11 @@ - - - 5.0dip + 5.0dip \ No newline at end of file diff --git a/res/values/signature.xml b/res/values/signature.xml index c72ccf19..f19ccbfb 100644 --- a/res/values/signature.xml +++ b/res/values/signature.xml @@ -1,12 +1,11 @@ - - + - μg Services + μg Services + Just a sec… + com.google + Google diff --git a/res/values/themes.xml b/res/values/themes.xml new file mode 100644 index 00000000..f6ba6117 --- /dev/null +++ b/res/values/themes.xml @@ -0,0 +1,28 @@ + + + + + + diff --git a/res/xml/account_preferences.xml b/res/xml/account_preferences.xml new file mode 100644 index 00000000..fef8d34e --- /dev/null +++ b/res/xml/account_preferences.xml @@ -0,0 +1,9 @@ + + + + diff --git a/res/xml/authenticator.xml b/res/xml/authenticator.xml new file mode 100644 index 00000000..8cf3a81d --- /dev/null +++ b/res/xml/authenticator.xml @@ -0,0 +1,23 @@ + + + diff --git a/src/com/google/android/gms/auth/GetToken.java b/src/com/google/android/gms/auth/GetToken.java index 0095d0bb..b5155bcf 100644 --- a/src/com/google/android/gms/auth/GetToken.java +++ b/src/com/google/android/gms/auth/GetToken.java @@ -1,11 +1,11 @@ /* - * Copyright (c) 2014 μg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/com/google/android/gms/auth/TokenActivity.java b/src/com/google/android/gms/auth/TokenActivity.java index 5b89b78d..1d41ded3 100644 --- a/src/com/google/android/gms/auth/TokenActivity.java +++ b/src/com/google/android/gms/auth/TokenActivity.java @@ -1,11 +1,11 @@ /* - * Copyright (c) 2014 μg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/com/google/android/gms/common/security/ProviderInstallerImpl.java b/src/com/google/android/gms/common/security/ProviderInstallerImpl.java index 085c6410..ab60e418 100644 --- a/src/com/google/android/gms/common/security/ProviderInstallerImpl.java +++ b/src/com/google/android/gms/common/security/ProviderInstallerImpl.java @@ -1,11 +1,11 @@ /* - * Copyright (c) 2014 μg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/com/google/android/gms/maps/internal/CreatorImpl.java b/src/com/google/android/gms/maps/internal/CreatorImpl.java index 033806ff..521dba43 100644 --- a/src/com/google/android/gms/maps/internal/CreatorImpl.java +++ b/src/com/google/android/gms/maps/internal/CreatorImpl.java @@ -1,11 +1,11 @@ /* - * Copyright (c) 2014 μg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/com/google/android/gms/plus/plusone/PlusOneButtonCreatorImpl.java b/src/com/google/android/gms/plus/plusone/PlusOneButtonCreatorImpl.java index 995f8db5..26452ab5 100644 --- a/src/com/google/android/gms/plus/plusone/PlusOneButtonCreatorImpl.java +++ b/src/com/google/android/gms/plus/plusone/PlusOneButtonCreatorImpl.java @@ -1,11 +1,11 @@ /* - * Copyright (c) 2014 μg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/com/google/android/location/internal/GoogleLocationManagerService.java b/src/com/google/android/location/internal/GoogleLocationManagerService.java index c62a95a2..451492f7 100644 --- a/src/com/google/android/location/internal/GoogleLocationManagerService.java +++ b/src/com/google/android/location/internal/GoogleLocationManagerService.java @@ -1,11 +1,11 @@ /* - * Copyright (c) 2014 μg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/org/microg/gms/AbstractGmsServiceBroker.java b/src/org/microg/gms/AbstractGmsServiceBroker.java index cafdb8f4..8dea77eb 100644 --- a/src/org/microg/gms/AbstractGmsServiceBroker.java +++ b/src/org/microg/gms/AbstractGmsServiceBroker.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/auth/AuthClient.java b/src/org/microg/gms/auth/AuthClient.java new file mode 100644 index 00000000..abbe450d --- /dev/null +++ b/src/org/microg/gms/auth/AuthClient.java @@ -0,0 +1,96 @@ +/* + * Copyright 2013-2015 µg Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.microg.gms.auth; + +import android.net.Uri; +import android.util.Log; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Map; + +public class AuthClient { + private static final String TAG = "GmsAuthClient"; + private static final String SERVICE_URL = "https://android.clients.google.com/auth"; + + public static AuthResponse request(AuthRequest request) throws IOException { + AuthResponse authResponse = new AuthResponse(); + HttpURLConnection connection = (HttpURLConnection) new URL(SERVICE_URL).openConnection(); + connection.setRequestMethod("POST"); + connection.setDoInput(true); + connection.setDoOutput(true); + connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + Map httpHeaders = request.getHttpHeaders(); + for (String key : httpHeaders.keySet()) { + connection.setRequestProperty(key, httpHeaders.get(key)); + } + StringBuilder content = new StringBuilder(); + Map formContent = request.getFormContent(); + for (String key : formContent.keySet()) { + if (content.length() > 0) + content.append("&"); + content.append(Uri.encode(key)).append("=").append(Uri.encode(formContent.get(key))); + } + OutputStream os = connection.getOutputStream(); + os.write(content.toString().getBytes()); + os.close(); + if (connection.getResponseCode() != 200) { + throw new IOException(connection.getResponseMessage()); + } + String result = new String(readStreamToEnd(connection.getInputStream())); + return AuthResponse.parse(result); + } + + protected static byte[] readStreamToEnd(final InputStream is) throws IOException { + final ByteArrayOutputStream bos = new ByteArrayOutputStream(); + if (is != null) { + final byte[] buff = new byte[1024]; + while (true) { + final int nb = is.read(buff); + if (nb < 0) { + break; + } + bos.write(buff, 0, nb); + } + is.close(); + } + return bos.toByteArray(); + } + + public static void request(final AuthRequest request, final GmsAuthCallback callback) { + new Thread(new Runnable() { + @Override + public void run() { + try { + callback.onResponse(request(request)); + } catch (Exception e) { + callback.onException(e); + } + } + }).start(); + } + + public static interface GmsAuthCallback { + void onResponse(AuthResponse response); + + void onException(Exception exception); + } +} diff --git a/src/org/microg/gms/auth/AuthManagerServiceImpl.java b/src/org/microg/gms/auth/AuthManagerServiceImpl.java index 31b97557..c2cda4c0 100644 --- a/src/org/microg/gms/auth/AuthManagerServiceImpl.java +++ b/src/org/microg/gms/auth/AuthManagerServiceImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/auth/AuthRequest.java b/src/org/microg/gms/auth/AuthRequest.java new file mode 100644 index 00000000..07da2fd2 --- /dev/null +++ b/src/org/microg/gms/auth/AuthRequest.java @@ -0,0 +1,91 @@ +/* + * Copyright 2013-2015 µg Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.microg.gms.auth; + +import java.util.HashMap; +import java.util.Map; + +public class AuthRequest { + private static final String USER_AGENT = "GoogleAuth/1.4 (%s %s)"; + + public String app; + public String appSignature; + public String caller; + public String callerSignature; + public String androidIdHex; + public String deviceName; + public String buildVersion; + public int sdkVersion; + public String countryCode; + public String operatorCountryCode; + public String locale; + public int gmsVersion; + public String accountType = "HOSTED_OR_GOOGLE"; + public String email; + public String service; + public String source = "android"; + public boolean isCalledFromAccountManager; + public String token; + public boolean isSystemPartition; + public boolean getAccountId; + public boolean isAccessToken; + public String droidguardResults; + public boolean hasPermission; + public boolean addAccount; + + + public Map getHttpHeaders() { + Map map = new HashMap<>(); + map.put("app", app); + map.put("device", androidIdHex); + map.put("User-Agent", String.format(USER_AGENT, deviceName, buildVersion)); + map.put("Content-Type", "application/x-www-form-urlencoded"); + return map; + } + + public Map getFormContent() { + Map map = new HashMap<>(); + map.put("device_country", countryCode); + map.put("operatorCountry", operatorCountryCode); + map.put("lang", locale); + map.put("sdk_version", Integer.toString(sdkVersion)); + map.put("google_play_services_version", Integer.toString(gmsVersion)); + map.put("accountType", accountType); + if (isSystemPartition) map.put("system_partition", "1"); + if (hasPermission) map.put("has_permission", "1"); + if (addAccount) map.put("add_account", "1"); + if (email != null) map.put("Email", email); + map.put("service", service); + map.put("source", source); + map.put("androidId", androidIdHex); + if (getAccountId) map.put("get_accountid", "1"); + map.put("app", app); + map.put("client_sig", appSignature); + if (caller != null) { + map.put("callerPkg", caller); + map.put("callerSig", callerSignature); + } + if (isCalledFromAccountManager) { + map.put("is_called_from_account_manager", "1"); + map.put("_opt_is_called_from_account_manager", "1"); + } + if (isAccessToken) map.put("ACCESS_TOKEN", "1"); + map.put("Token", token); + if (droidguardResults != null) map.put("droidguard_results", droidguardResults); + return map; + } +} diff --git a/src/org/microg/gms/auth/AuthResponse.java b/src/org/microg/gms/auth/AuthResponse.java new file mode 100644 index 00000000..d669d133 --- /dev/null +++ b/src/org/microg/gms/auth/AuthResponse.java @@ -0,0 +1,97 @@ +/* + * Copyright 2013-2015 µg Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.microg.gms.auth; + +import android.util.Log; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public class AuthResponse { + private static final String TAG = "GmsAuthResponse"; + + @ResponseField("SID") + public String Sid; + @ResponseField("LSID") + public String LSid; + @ResponseField("Auth") + public String auth; + @ResponseField("Token") + public String token; + @ResponseField("Email") + public String email; + @ResponseField("services") + public Set services = new HashSet<>(); + @ResponseField("GooglePlusUpgrade") + public boolean isGooglePlusUpgrade; + @ResponseField("PicasaUser") + public String picasaUserName; + @ResponseField("RopText") + public String ropText; + @ResponseField("RopRevision") + public int ropRevision; + @ResponseField("firstName") + public String firstName; + @ResponseField("lastName") + public String lastName; + @ResponseField("issueAdvice") + public String issueAdvice; + + public static AuthResponse parse(String result) { + AuthResponse response = new AuthResponse(); + String[] entries = result.split("\n"); + for (String s : entries) { + String[] keyValuePair = s.split("="); + String key = keyValuePair[0].trim(); + String value = keyValuePair[1].trim(); + try { + for (Field field : AuthResponse.class.getDeclaredFields()) { + if (field.isAnnotationPresent(ResponseField.class) && + key.equals(field.getAnnotation(ResponseField.class).value())) { + if (field.getType().equals(String.class)) { + field.set(response, value); + } else if (field.getType().equals(boolean.class)) { + field.setBoolean(response, value.equals("1")); + } else if (field.getType().equals(int.class)) { + field.setInt(response, Integer.parseInt(value)); + } else if (field.getType().isAssignableFrom(Set.class)) { + //noinspection unchecked + ((Set)field.get(response)).addAll(Arrays.asList(value.split(","))); + } + } + } + } catch (Exception e) { + Log.w(TAG, e); + } + } + return response; + } + + + + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.FIELD) + private @interface ResponseField { + public String value(); + } +} diff --git a/src/org/microg/gms/auth/GmsAddAccountRequest.java b/src/org/microg/gms/auth/GmsAddAccountRequest.java new file mode 100644 index 00000000..23afd31c --- /dev/null +++ b/src/org/microg/gms/auth/GmsAddAccountRequest.java @@ -0,0 +1,44 @@ +/* + * Copyright 2013-2015 µg Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.microg.gms.auth; + +import java.util.Locale; + +public class GmsAddAccountRequest extends AuthRequest { + + public GmsAddAccountRequest(Locale locale, int sdkVersion, int gmsVersion, String deviceName, + String buildVersion, String androidIdHex, String token) { + this.service = "ac2dm"; + this.addAccount = true; + this.isSystemPartition = true; + this.hasPermission = true; + this.getAccountId = true; + this.app = "com.google.android.gms"; + this.appSignature = "38918a453d07199354f8b19af05ec6562ced5788"; + + this.androidIdHex = "3bc26ad601111308"; // TODO: androidIdHex; + this.deviceName = deviceName; + this.buildVersion = buildVersion; + this.countryCode = locale.getCountry(); + this.gmsVersion = gmsVersion; + this.operatorCountryCode = locale.getCountry(); + this.locale = locale.toString(); + this.sdkVersion = sdkVersion; + this.token = token; + this.droidguardResults = null; // TODO + } +} diff --git a/src/org/microg/gms/auth/RetrieveRtTokenRequest.java b/src/org/microg/gms/auth/RetrieveRtTokenRequest.java new file mode 100644 index 00000000..fecb3ffb --- /dev/null +++ b/src/org/microg/gms/auth/RetrieveRtTokenRequest.java @@ -0,0 +1,41 @@ +/* + * Copyright 2013-2015 µg Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.microg.gms.auth; + +import android.content.Context; +import android.os.Build; + +import org.microg.gms.Constants; + +import java.util.Locale; + +/** + * This request will retrieve a rt token (oauth2rt) from an access token (oauth2) + */ +public class RetrieveRtTokenRequest extends GmsAddAccountRequest { + public RetrieveRtTokenRequest(Context context, String token) { + this(Locale.getDefault(), Build.VERSION.SDK_INT, Constants.MAX_REFERENCE_VERSION, + Build.DEVICE, Build.ID, null /*TODO*/, token); + } + + public RetrieveRtTokenRequest(Locale locale, int sdkVersion, int gmsVersion, String deviceName, + String buildVersion, String androidIdHex, String token) { + super(locale, sdkVersion, gmsVersion, deviceName, buildVersion, androidIdHex, token); + this.isAccessToken = true; + this.droidguardResults = null; // TODO + } +} diff --git a/src/org/microg/gms/auth/login/LoginActivity.java b/src/org/microg/gms/auth/login/LoginActivity.java new file mode 100644 index 00000000..20177f1b --- /dev/null +++ b/src/org/microg/gms/auth/login/LoginActivity.java @@ -0,0 +1,224 @@ +/* + * Copyright 2013-2015 µg Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.microg.gms.auth.login; + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.app.Activity; +import android.content.Context; +import android.content.res.Configuration; +import android.graphics.Color; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.CookieManager; +import android.webkit.JavascriptInterface; +import android.webkit.ValueCallback; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.RelativeLayout; + +import com.google.android.gms.R; + +import org.microg.gms.auth.AuthClient; +import org.microg.gms.auth.AuthResponse; +import org.microg.gms.auth.GmsAddAccountRequest; +import org.microg.gms.auth.RetrieveRtTokenRequest; + +import java.util.Locale; + +public class LoginActivity extends Activity { + public static final String TMPL_NEW_ACCOUNT = "new_account"; + public static final String EXTRA_TMPL = "tmpl"; + + private static final String TAG = "GmsAuthLoginBrowser"; + private static final String EMBEDDED_SETUP_URL = "https://accounts.google.com/EmbeddedSetup"; + private static final String MAGIC_USER_AGENT = " MinuteMaid"; + private static final String COOKIE_OAUTH_TOKEN = "oauth_token"; + private static final int TITLE_MIN_HEIGHT = 64; + public static final double TITLE_WIDTH_FACTOR = (8.0 / 18.0); + + private WebView webView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.login_base); + formatTitle(); + webView = createWebView(this); + webView.addJavascriptInterface(new JsBridge(), "mm"); + ((ViewGroup) findViewById(R.id.auth_root)).addView(webView); + webView.setWebViewClient(new WebViewClient() { + @Override + public void onPageFinished(WebView view, String url) { + if ("close".equals(Uri.parse(url).getFragment())) + closeWeb(); + } + }); + CookieManager.getInstance().setAcceptCookie(true); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + CookieManager.getInstance().removeAllCookies(new ValueCallback() { + @Override + public void onReceiveValue(Boolean value) { + load(); + } + }); + } else { + //noinspection deprecation + CookieManager.getInstance().removeAllCookie(); + load(); + } + } + + private static WebView createWebView(Context context) { + WebView webView = new WebView(context); + webView.setVisibility(View.INVISIBLE); + webView.setLayoutParams(new RelativeLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + webView.setBackgroundColor(Color.TRANSPARENT); + webView.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + return true; + } + }); + prepareWebViewSettings(webView.getSettings()); + return webView; + } + + private static void prepareWebViewSettings(WebSettings settings) { + settings.setUserAgentString(settings.getUserAgentString() + MAGIC_USER_AGENT); + settings.setJavaScriptEnabled(true); + settings.setSupportMultipleWindows(false); + settings.setSaveFormData(false); + settings.setAllowFileAccess(false); + settings.setDatabaseEnabled(false); + settings.setNeedInitialFocus(false); + settings.setUseWideViewPort(false); + settings.setSupportZoom(false); + settings.setJavaScriptCanOpenWindowsAutomatically(false); + } + + private void formatTitle() { + if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { + double widthPixels = (double) (getResources().getDisplayMetrics().widthPixels); + findViewById(R.id.title_container).getLayoutParams().height = + (int) (dpToPx(TITLE_MIN_HEIGHT) + (TITLE_WIDTH_FACTOR * widthPixels)); + } else { + findViewById(R.id.title_container).getLayoutParams().height = dpToPx(TITLE_MIN_HEIGHT); + } + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + formatTitle(); + } + + private void load() { + webView.loadUrl(buildUrl(getIntent().hasExtra(EXTRA_TMPL) ? getIntent().getStringExtra(EXTRA_TMPL) : TMPL_NEW_ACCOUNT, Locale.getDefault())); + } + + private void closeWeb() { + runOnUiThread(new Runnable() { + @Override + public void run() { + webView.setVisibility(View.INVISIBLE); + } + }); + String cookies = CookieManager.getInstance().getCookie(EMBEDDED_SETUP_URL); + String[] temp = cookies.split(";"); + for (String ar1 : temp) { + if (ar1.trim().startsWith(COOKIE_OAUTH_TOKEN + "=")) { + String[] temp1 = ar1.split("="); + sendRetrieveRtToken(temp1[1]); + } + } + // TODO: Error message + } + + private void sendRetrieveRtToken(String oAuthToken) { + AuthClient.request(new RetrieveRtTokenRequest(this, oAuthToken), + new AuthClient.GmsAuthCallback() { + @Override + public void onResponse(AuthResponse response) { + AccountManager accountManager = AccountManager.get(LoginActivity.this); + Account account = new Account(response.email, "com.google"); + if (accountManager.addAccountExplicitly(account, response.token, null)) { + accountManager.setAuthToken(account, "SID", response.Sid); + accountManager.setAuthToken(account, "LSID", response.LSid); + setResult(RESULT_OK); + // TODO: hand over to account setup + finish(); + } else { + // TODO: Error message + Log.w(TAG, "Account NOT created!"); + setResult(RESULT_CANCELED); + } + } + + @Override + public void onException(Exception exception) { + Log.w(TAG, "onException: " + exception); + } + }); + } + + public int dpToPx(int dp) { + DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); + return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT)); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) { + webView.goBack(); + return true; + } + return super.onKeyDown(keyCode, event); + } + + private static String buildUrl(String tmpl, Locale locale) { + return Uri.parse(EMBEDDED_SETUP_URL).buildUpon() + .appendQueryParameter("source", "android") + .appendQueryParameter("xoauth_display_name", "Android Device") + .appendQueryParameter("lang", locale.getLanguage()) + .appendQueryParameter("cc", locale.getCountry().toLowerCase()) + .appendQueryParameter("langCountry", locale.toString().toLowerCase()) + .appendQueryParameter("hl", locale.toString().replace("_", "-")) + .appendQueryParameter("tmpl", tmpl) + .build().toString(); + } + + private class JsBridge { + @JavascriptInterface + public void showView() { + runOnUiThread(new Runnable() { + @Override + public void run() { + webView.setVisibility(View.VISIBLE); + } + }); + } + } +} diff --git a/src/org/microg/gms/auth/loginservice/GoogleLoginService.java b/src/org/microg/gms/auth/loginservice/GoogleLoginService.java new file mode 100644 index 00000000..59c80eb3 --- /dev/null +++ b/src/org/microg/gms/auth/loginservice/GoogleLoginService.java @@ -0,0 +1,71 @@ +/* + * Copyright 2013-2015 µg Project Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.microg.gms.auth.loginservice; + +import android.accounts.AbstractAccountAuthenticator; +import android.accounts.Account; +import android.accounts.AccountAuthenticatorResponse; +import android.accounts.NetworkErrorException; +import android.app.Service; +import android.content.Intent; +import android.os.Bundle; +import android.os.IBinder; + +public class GoogleLoginService extends Service { + @Override + public IBinder onBind(Intent intent) { + if (intent.getAction().equals(android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT)) { + return new AbstractAccountAuthenticator(this) { + @Override + public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) { + return null; + } + + @Override + public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options) throws NetworkErrorException { + return null; + } + + @Override + public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) throws NetworkErrorException { + return null; + } + + @Override + public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException { + return null; + } + + @Override + public String getAuthTokenLabel(String authTokenType) { + return null; + } + + @Override + public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException { + return null; + } + + @Override + public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) throws NetworkErrorException { + return null; + } + }.getIBinder(); + } + return null; + } +} diff --git a/src/org/microg/gms/location/GoogleLocationManager.java b/src/org/microg/gms/location/GoogleLocationManager.java index 8992221e..f799aeab 100644 --- a/src/org/microg/gms/location/GoogleLocationManager.java +++ b/src/org/microg/gms/location/GoogleLocationManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/location/GoogleLocationManagerServiceImpl.java b/src/org/microg/gms/location/GoogleLocationManagerServiceImpl.java index 8525fa97..e3faef57 100644 --- a/src/org/microg/gms/location/GoogleLocationManagerServiceImpl.java +++ b/src/org/microg/gms/location/GoogleLocationManagerServiceImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/location/LocationChangeListener.java b/src/org/microg/gms/location/LocationChangeListener.java index 4090fc9d..fada1a32 100644 --- a/src/org/microg/gms/location/LocationChangeListener.java +++ b/src/org/microg/gms/location/LocationChangeListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/location/LocationRequestHelper.java b/src/org/microg/gms/location/LocationRequestHelper.java index 781555d7..db4cc979 100644 --- a/src/org/microg/gms/location/LocationRequestHelper.java +++ b/src/org/microg/gms/location/LocationRequestHelper.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/location/MockLocationProvider.java b/src/org/microg/gms/location/MockLocationProvider.java index eb3387a3..a515dd71 100644 --- a/src/org/microg/gms/location/MockLocationProvider.java +++ b/src/org/microg/gms/location/MockLocationProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/location/RealLocationProvider.java b/src/org/microg/gms/location/RealLocationProvider.java index 633ceb57..ee9578ea 100644 --- a/src/org/microg/gms/location/RealLocationProvider.java +++ b/src/org/microg/gms/location/RealLocationProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/BackendMap.java b/src/org/microg/gms/maps/BackendMap.java index d70d7452..f07362e3 100644 --- a/src/org/microg/gms/maps/BackendMap.java +++ b/src/org/microg/gms/maps/BackendMap.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/ContextContainer.java b/src/org/microg/gms/maps/ContextContainer.java index 177e7af9..4a5a1516 100644 --- a/src/org/microg/gms/maps/ContextContainer.java +++ b/src/org/microg/gms/maps/ContextContainer.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/GmsMapsTypeHelper.java b/src/org/microg/gms/maps/GmsMapsTypeHelper.java index 28252911..df49858d 100644 --- a/src/org/microg/gms/maps/GmsMapsTypeHelper.java +++ b/src/org/microg/gms/maps/GmsMapsTypeHelper.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/GoogleMapImpl.java b/src/org/microg/gms/maps/GoogleMapImpl.java index d455ef0e..1651085f 100644 --- a/src/org/microg/gms/maps/GoogleMapImpl.java +++ b/src/org/microg/gms/maps/GoogleMapImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/MapFragmentImpl.java b/src/org/microg/gms/maps/MapFragmentImpl.java index 522dd31c..9ffa7390 100644 --- a/src/org/microg/gms/maps/MapFragmentImpl.java +++ b/src/org/microg/gms/maps/MapFragmentImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/MapViewImpl.java b/src/org/microg/gms/maps/MapViewImpl.java index 49bb349b..33144cd8 100644 --- a/src/org/microg/gms/maps/MapViewImpl.java +++ b/src/org/microg/gms/maps/MapViewImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/ProjectionImpl.java b/src/org/microg/gms/maps/ProjectionImpl.java index 5422b9d0..7a16f9e7 100644 --- a/src/org/microg/gms/maps/ProjectionImpl.java +++ b/src/org/microg/gms/maps/ProjectionImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/ResourcesContainer.java b/src/org/microg/gms/maps/ResourcesContainer.java index 6911da84..62ed18f7 100644 --- a/src/org/microg/gms/maps/ResourcesContainer.java +++ b/src/org/microg/gms/maps/ResourcesContainer.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/UiSettingsImpl.java b/src/org/microg/gms/maps/UiSettingsImpl.java index addf2d28..c111ac26 100644 --- a/src/org/microg/gms/maps/UiSettingsImpl.java +++ b/src/org/microg/gms/maps/UiSettingsImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/bitmap/AbstractBitmapDescriptor.java b/src/org/microg/gms/maps/bitmap/AbstractBitmapDescriptor.java index 8cba5888..772bb0cb 100644 --- a/src/org/microg/gms/maps/bitmap/AbstractBitmapDescriptor.java +++ b/src/org/microg/gms/maps/bitmap/AbstractBitmapDescriptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/bitmap/AssetBitmapDescriptor.java b/src/org/microg/gms/maps/bitmap/AssetBitmapDescriptor.java index d7bfff35..fbe08e96 100644 --- a/src/org/microg/gms/maps/bitmap/AssetBitmapDescriptor.java +++ b/src/org/microg/gms/maps/bitmap/AssetBitmapDescriptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/bitmap/BitmapBitmapDescriptor.java b/src/org/microg/gms/maps/bitmap/BitmapBitmapDescriptor.java index 8c3ad467..5ea7af8f 100644 --- a/src/org/microg/gms/maps/bitmap/BitmapBitmapDescriptor.java +++ b/src/org/microg/gms/maps/bitmap/BitmapBitmapDescriptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/bitmap/BitmapDescriptorFactoryImpl.java b/src/org/microg/gms/maps/bitmap/BitmapDescriptorFactoryImpl.java index fba39507..41ed4ac8 100644 --- a/src/org/microg/gms/maps/bitmap/BitmapDescriptorFactoryImpl.java +++ b/src/org/microg/gms/maps/bitmap/BitmapDescriptorFactoryImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/bitmap/BitmapDescriptorImpl.java b/src/org/microg/gms/maps/bitmap/BitmapDescriptorImpl.java index eed63648..955e5e88 100644 --- a/src/org/microg/gms/maps/bitmap/BitmapDescriptorImpl.java +++ b/src/org/microg/gms/maps/bitmap/BitmapDescriptorImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/bitmap/DefaultBitmapDescriptor.java b/src/org/microg/gms/maps/bitmap/DefaultBitmapDescriptor.java index 6a5f3b5a..c7539565 100644 --- a/src/org/microg/gms/maps/bitmap/DefaultBitmapDescriptor.java +++ b/src/org/microg/gms/maps/bitmap/DefaultBitmapDescriptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/bitmap/FileBitmapDescriptor.java b/src/org/microg/gms/maps/bitmap/FileBitmapDescriptor.java index 7d3ba9de..506738d3 100644 --- a/src/org/microg/gms/maps/bitmap/FileBitmapDescriptor.java +++ b/src/org/microg/gms/maps/bitmap/FileBitmapDescriptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/bitmap/PathBitmapDescriptor.java b/src/org/microg/gms/maps/bitmap/PathBitmapDescriptor.java index 70adc9b9..27863a15 100644 --- a/src/org/microg/gms/maps/bitmap/PathBitmapDescriptor.java +++ b/src/org/microg/gms/maps/bitmap/PathBitmapDescriptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/bitmap/ResourceBitmapDescriptor.java b/src/org/microg/gms/maps/bitmap/ResourceBitmapDescriptor.java index 7ddf02fa..c902f7b0 100644 --- a/src/org/microg/gms/maps/bitmap/ResourceBitmapDescriptor.java +++ b/src/org/microg/gms/maps/bitmap/ResourceBitmapDescriptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/camera/CameraUpdate.java b/src/org/microg/gms/maps/camera/CameraUpdate.java index c3f28cc5..830d5cd9 100644 --- a/src/org/microg/gms/maps/camera/CameraUpdate.java +++ b/src/org/microg/gms/maps/camera/CameraUpdate.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/camera/CameraUpdateFactoryImpl.java b/src/org/microg/gms/maps/camera/CameraUpdateFactoryImpl.java index 4187acf1..2a6fce9b 100644 --- a/src/org/microg/gms/maps/camera/CameraUpdateFactoryImpl.java +++ b/src/org/microg/gms/maps/camera/CameraUpdateFactoryImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/camera/MapPositionCameraUpdate.java b/src/org/microg/gms/maps/camera/MapPositionCameraUpdate.java index 935cdfaa..c0f31e8a 100644 --- a/src/org/microg/gms/maps/camera/MapPositionCameraUpdate.java +++ b/src/org/microg/gms/maps/camera/MapPositionCameraUpdate.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/camera/NoCameraUpdate.java b/src/org/microg/gms/maps/camera/NoCameraUpdate.java index 74295457..1d40d845 100644 --- a/src/org/microg/gms/maps/camera/NoCameraUpdate.java +++ b/src/org/microg/gms/maps/camera/NoCameraUpdate.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/markup/CircleImpl.java b/src/org/microg/gms/maps/markup/CircleImpl.java index 5b9ccb7c..e98d1138 100644 --- a/src/org/microg/gms/maps/markup/CircleImpl.java +++ b/src/org/microg/gms/maps/markup/CircleImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/markup/GroundOverlayImpl.java b/src/org/microg/gms/maps/markup/GroundOverlayImpl.java index 44790636..55a1a634 100644 --- a/src/org/microg/gms/maps/markup/GroundOverlayImpl.java +++ b/src/org/microg/gms/maps/markup/GroundOverlayImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/markup/InfoWindow.java b/src/org/microg/gms/maps/markup/InfoWindow.java index 6c0de209..94af7739 100644 --- a/src/org/microg/gms/maps/markup/InfoWindow.java +++ b/src/org/microg/gms/maps/markup/InfoWindow.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/markup/MarkerImpl.java b/src/org/microg/gms/maps/markup/MarkerImpl.java index 975e9d3f..ca9c8407 100644 --- a/src/org/microg/gms/maps/markup/MarkerImpl.java +++ b/src/org/microg/gms/maps/markup/MarkerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/markup/Markup.java b/src/org/microg/gms/maps/markup/Markup.java index 0b2b5f69..f399873e 100644 --- a/src/org/microg/gms/maps/markup/Markup.java +++ b/src/org/microg/gms/maps/markup/Markup.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/markup/PolygonImpl.java b/src/org/microg/gms/maps/markup/PolygonImpl.java index cc776ff3..dd8997e4 100644 --- a/src/org/microg/gms/maps/markup/PolygonImpl.java +++ b/src/org/microg/gms/maps/markup/PolygonImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/markup/PolylineImpl.java b/src/org/microg/gms/maps/markup/PolylineImpl.java index 61333466..333ceef3 100644 --- a/src/org/microg/gms/maps/markup/PolylineImpl.java +++ b/src/org/microg/gms/maps/markup/PolylineImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/maps/markup/TileOverlayImpl.java b/src/org/microg/gms/maps/markup/TileOverlayImpl.java index 6b4c6afc..91bbf702 100644 --- a/src/org/microg/gms/maps/markup/TileOverlayImpl.java +++ b/src/org/microg/gms/maps/markup/TileOverlayImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/gms/plus/PlusOneButtonImpl.java b/src/org/microg/gms/plus/PlusOneButtonImpl.java index f97ea290..61eda38e 100644 --- a/src/org/microg/gms/plus/PlusOneButtonImpl.java +++ b/src/org/microg/gms/plus/PlusOneButtonImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2015 µg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/org/microg/tools/AccountPickerActivity.java b/src/org/microg/tools/AccountPickerActivity.java index 7aa62fd3..8373200a 100644 --- a/src/org/microg/tools/AccountPickerActivity.java +++ b/src/org/microg/tools/AccountPickerActivity.java @@ -1,11 +1,11 @@ /* - * Copyright (c) 2014 μg Project Team + * Copyright 2013-2015 µg Project Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS,