From 58f5b94a2a437a3771fbb0d75751a6e15a0101f0 Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Tue, 4 Mar 2014 13:59:37 +0000
Subject: [PATCH] Added a settings screen and a setting for activating
 Bluetooth. Bug #28.

---
 briar-android/AndroidManifest.xml             |  50 +++---
 .../res/drawable-hdpi/action_about.png        | Bin 0 -> 1764 bytes
 .../res/drawable-hdpi/action_help.png         | Bin 1544 -> 0 bytes
 .../res/drawable-mdpi/action_about.png        | Bin 0 -> 1441 bytes
 .../res/drawable-mdpi/action_help.png         | Bin 1318 -> 0 bytes
 .../res/drawable-xhdpi/action_about.png       | Bin 0 -> 2257 bytes
 .../res/drawable-xhdpi/action_help.png        | Bin 1796 -> 0 bytes
 briar-android/res/values/strings.xml          |   6 +-
 .../android/DashboardActivity.java            |  18 +-
 .../android/SettingsActivity.java             | 160 ++++++++++++++++++
 10 files changed, 204 insertions(+), 30 deletions(-)
 create mode 100644 briar-android/res/drawable-hdpi/action_about.png
 delete mode 100644 briar-android/res/drawable-hdpi/action_help.png
 create mode 100644 briar-android/res/drawable-mdpi/action_about.png
 delete mode 100644 briar-android/res/drawable-mdpi/action_help.png
 create mode 100644 briar-android/res/drawable-xhdpi/action_about.png
 delete mode 100644 briar-android/res/drawable-xhdpi/action_help.png
 create mode 100644 briar-android/src/org/briarproject/android/SettingsActivity.java

diff --git a/briar-android/AndroidManifest.xml b/briar-android/AndroidManifest.xml
index b9119cccb8..fe12cda6b3 100644
--- a/briar-android/AndroidManifest.xml
+++ b/briar-android/AndroidManifest.xml
@@ -1,16 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 	package="org.briarproject"
-	android:versionCode="2"
-	android:versionName="0.2" >
+	android:versionCode="4"
+	android:versionName="0.4" >
 
 	<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" />
 
+	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 	<uses-permission android:name="android.permission.BLUETOOTH" />
 	<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
 	<uses-permission android:name="android.permission.INTERNET" />
-	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 	<uses-permission android:name="android.permission.VIBRATE" />
 	<!-- FIXME: Only needed for alpha and beta builds -->
 	<uses-permission android:name="android.permission.READ_LOGS" />
@@ -43,6 +43,16 @@
 			android:logo="@drawable/logo"
 			android:label="@string/app_name" >
 		</activity>
+		<activity
+			android:name=".android.SettingsActivity"
+			android:logo="@drawable/logo"
+			android:label="@string/settings_title"
+			android:parentActivityName=".android.DashboardActivity" >
+			<meta-data
+				android:name="android.support.PARENT_ACTIVITY"
+				android:value=".android.DashboardActivity"
+			/>
+		</activity>
 		<activity
 			android:name=".android.SetupActivity"
 			android:logo="@drawable/logo"
@@ -63,10 +73,10 @@
 			android:label="@string/app_name" >
 		</activity>
 		<activity
-		    android:name=".android.contact.ContactListActivity"
+			android:name=".android.contact.ContactListActivity"
 			android:logo="@drawable/logo"
-		    android:label="@string/contact_list_title"
-		    android:parentActivityName=".android.DashboardActivity" >
+			android:label="@string/contact_list_title"
+			android:parentActivityName=".android.DashboardActivity" >
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
 				android:value=".android.DashboardActivity"
@@ -77,7 +87,7 @@
 			android:logo="@drawable/logo"
 			android:label="@string/app_name"
 			android:windowSoftInputMode="stateHidden"
-		    android:parentActivityName=".android.contact.ContactListActivity" >
+			android:parentActivityName=".android.contact.ContactListActivity" >
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
 				android:value=".android.contact.ContactListActivity"
@@ -87,7 +97,7 @@
 			android:name=".android.contact.ReadPrivateMessageActivity"
 			android:logo="@drawable/logo"
 			android:label="@string/app_name"
-		    android:parentActivityName=".android.contact.ContactListActivity" >
+			android:parentActivityName=".android.contact.ContactListActivity" >
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
 				android:value=".android.contact.ContactListActivity"
@@ -97,7 +107,7 @@
 			android:name=".android.contact.WritePrivateMessageActivity"
 			android:logo="@drawable/logo"
 			android:label="@string/app_name"
-		    android:parentActivityName=".android.contact.ContactListActivity" >
+			android:parentActivityName=".android.contact.ContactListActivity" >
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
 				android:value=".android.contact.ContactListActivity"
@@ -107,7 +117,7 @@
 			android:name=".android.groups.ConfigureGroupActivity"
 			android:logo="@drawable/logo"
 			android:label="@string/app_name"
-		    android:parentActivityName=".android.groups.GroupListActivity" >
+			android:parentActivityName=".android.groups.GroupListActivity" >
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
 				android:value=".android.groups.GroupListActivity"
@@ -117,7 +127,7 @@
 			android:name=".android.groups.CreateGroupActivity"
 			android:logo="@drawable/logo"
 			android:label="@string/create_forum_title"
-		    android:parentActivityName=".android.groups.GroupListActivity" >
+			android:parentActivityName=".android.groups.GroupListActivity" >
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
 				android:value=".android.groups.GroupListActivity"
@@ -127,7 +137,7 @@
 			android:name=".android.groups.GroupActivity"
 			android:logo="@drawable/logo"
 			android:label="@string/app_name"
-		    android:parentActivityName=".android.groups.GroupListActivity" >
+			android:parentActivityName=".android.groups.GroupListActivity" >
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
 				android:value=".android.groups.GroupListActivity"
@@ -137,17 +147,17 @@
 			android:name=".android.groups.GroupListActivity"
 			android:logo="@drawable/logo"
 			android:label="@string/forums_title"
-		    android:parentActivityName=".android.DashboardActivity" >
+			android:parentActivityName=".android.DashboardActivity" >
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
 				android:value=".android.DashboardActivity"
 			/>
 		</activity>
 		<activity
-		    android:name=".android.groups.ManageGroupsActivity"
+			android:name=".android.groups.ManageGroupsActivity"
 			android:logo="@drawable/logo"
-		    android:label="@string/manage_forums_title"
-		    android:parentActivityName=".android.groups.GroupListActivity" >
+			android:label="@string/manage_forums_title"
+			android:parentActivityName=".android.groups.GroupListActivity" >
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
 				android:value=".android.groups.GroupListActivity"
@@ -157,7 +167,7 @@
 			android:name=".android.groups.ReadGroupPostActivity"
 			android:logo="@drawable/logo"
 			android:label="@string/app_name"
-		    android:parentActivityName=".android.groups.GroupListActivity" >
+			android:parentActivityName=".android.groups.GroupListActivity" >
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
 				android:value=".android.groups.GroupListActivity"
@@ -167,7 +177,7 @@
 			android:name=".android.groups.WriteGroupPostActivity"
 			android:logo="@drawable/logo"
 			android:label="@string/app_name"
-		    android:parentActivityName=".android.groups.GroupListActivity" >
+			android:parentActivityName=".android.groups.GroupListActivity" >
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
 				android:value=".android.groups.GroupListActivity"
@@ -182,7 +192,7 @@
 			android:name=".android.invitation.AddContactActivity"
 			android:logo="@drawable/logo"
 			android:label="@string/add_contact_title"
-		    android:parentActivityName=".android.contact.ContactListActivity" >
+			android:parentActivityName=".android.contact.ContactListActivity" >
 			<meta-data
 				android:name="android.support.PARENT_ACTIVITY"
 				android:value=".android.contact.ContactListActivity"
diff --git a/briar-android/res/drawable-hdpi/action_about.png b/briar-android/res/drawable-hdpi/action_about.png
new file mode 100644
index 0000000000000000000000000000000000000000..8f39c428ac6cacd0ad4fd9e7ab4252a77ce91a53
GIT binary patch
literal 1764
zcmaJ?X;2eq7!F0za*QByiN{V56ohOx2O)t#fg~6p2!TRSYh98JNg>%BOA;)tBa9k|
z9j`Lrg(DzZ$67$N7MO|x3d${t##%eHf>taPPz$2%1_Aq{bZ2(I?|bKcp7(mb+5Gsp
zC<oi+wgdvffxm$x#8<NAU2KDYQ$Cp3gD)N!SA->^QcMqP5JI>FO+x^_0!~MS2rS7~
zw;~|~g7q4Ck_ZzCVp(ETL4qwlB!fbQqX~qNFoOyfXCN4mhNR1tY~pa;6(S&)u!$*j
z0a>7mL}c;}+ciky_P8YR_6#voLJSK9LJTaNK!IQ|U{GW#wJZahIL*t#_ZBlq1g2fE
z3^wsyQX)Y-5Q%CKfKDO@h{=Hv5J)3IG%}OM^am(phzvp$kjw~x$SgX8MTUTxhloeh
zNTe(whc^=oKe3523{$Z{P_NgM^i&e6Ne3Y&lL?Y3AcYcudjx2+l^ARYP-?wq890bm
ztdXlQIjRIKjBpy7g|UfvrteBnsOD&u+L<=t4Fe6Z3WP{xOG&ei0>S^gDim|xT1<$%
z&-XuxwMp431Qa4#G)p7K2PgHigi^60H3*EMnj{p>ob6(~48>5b3{?S<iF6VK2w<^X
zX|YTr1OgUcsl{NW7~yl+M4W>pmrGbw9y0<84`R?G$Q%gbLQERO<kBJ{!+CUwL5qN9
zu^d#Kr9hO}ELQR!8#FK0A_j#DkIX?davdV!X;1|)T{KHRe=hWS`DU<^`Ev=J7YpLa
zfR@qzYt*wQTtAlWoN)2Oob(YTu6GSC>^O7T6n<Zl`JC`1gL$YpA!b>E`|k9tzH)zO
zYBkUjeP%&pAjG$=wYB5d+u2T9eexpl_lomNYd<b8_pGZdT@%>aRdBP^?oc$9%6WM4
zIeWz3-tJl3P@BKa*wwtey21Lf682#5U`~EcDEg-JfYG7JCe6BP=e>{0ZF-*8oOr7<
zS(hgC=0Bg>!S^?&{+XKd$_)D)x<4`|S)3Q|8)uADi!xpANL98!rt?1I`kR*YA2#^j
z%`+~dt76BE(gg3f6!WLej1oa_flUIaGwRe^>fIvK&i-WM*W|4(>F&ta54gE~cbJ&5
zP;s_+Q&cm*yXnHj>v($#;eaPO@i*H<pR2Mk$4;&;Pj|h`&E4sA)56#nBX%#S%|vQ^
z>n%N`Z#O=2)`q@@c&kl}eoDp}Q|BLlrMkI<?)uz4+l%a{EF2l_C@$NVFge6&EV$O-
z)ZJd=;if<Qy1Dd7v$;cC)zaM;^o736<?PO{pSWypd8`D{(v4g8gcc2(eWcw_xKx_;
zx8>1Z*a<;vz{^UhU$)M)aI)j%o#hofZ|`kc3k_6#)k;I*Ch<{-CY0?yxT|eIYg}<$
z%`faQG?#3fXc<nW9qFc-$HE;}ETi}DD;}?U(pmMuEM1kI$;eN3Fz<9262tA4E%n#G
zr0mZ>5o&H9?GeZpZM6>OqhUF*tAj6`i|B}|^WXGgjkRaxz9thAG61^D_FQsCYe&)=
zve%GOdR=9UC?lp@8}j-dLfgu_ZkDaQ*I;i~RZ@obb{p^d;W1)^M>R1X_BBB-k3S{b
z7ayBCFkInP!t<s1bsbx>-j3}ZcC`IeV^nVC67AM3R#!`@hZ$Dp+Fic?11O}ZO)k|f
zOFNYbQIGgFKG*7nN1Qwy86rtav!H0DZvU@UkKwg(J?UO1eZ#Z!!|7hs8~t$4X3t!H
zQOp$OT()5%aB>xI{lS<wj&~SZtFXvR>mCcy8>Abjem+;YR>ny#6rCQ2)m9s|Y2(6V
z-?qSx>gbZ9;a8i#S$~Qosc2Hf?X9T1n6kw=J!V~|cj_<RZkKXh^`=7C_K7PZx!UtK
z(moo$X>aZ2U@pI^^74Zw#Z3>L`qlRr^9$-;)*7r%7WG+gJlVd=BJ4~c(9v`8vcDI&
Y6RKUD#(0B`J1qYlJ~xhYK4M$$KMBsYYybcN

literal 0
HcmV?d00001

diff --git a/briar-android/res/drawable-hdpi/action_help.png b/briar-android/res/drawable-hdpi/action_help.png
deleted file mode 100644
index 459bed76c5b9f546541383271a6c9b9ff9943093..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1544
zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y
zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP
zs8ErclUHn2VXFi-*9yo63F|8<fR&VF+bTgE72zA8;GAESs$i;Tpqp%9W~g9hqGxDg
zU}<8hqhMrUXrOOsq;FuZYiM9)YHnp<r~m~@K--E^(yW49+@N*=dA3R!B_#z``ugSN
z<$C4Ddih1^`i7R4mih)p`bI{&Koz>hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83
zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s0<RzFwUtj!6b93RUi%Wu15$?rmaB)aw
zL8^XGYH@yPQ8F;%(v(3~6<9eJr6!i-7lq{K=fFZSAS1sdzc?emK*2fKRL@YsH!(Rg
z4<rKC;p=PVnO9trn3tUD>0+w{G(#^lGsVipz|h&;z|zRn$-u?X(ACh=#L&{!#L3yw
z&D7A`#K{n**Cju>G&eP`1g19ytk=TG!rZ_Nr(RHE$SnZc?2=lPS(cjOR+OKs0QR(1
zCT_PF;4}}aHwCL(!2U4AsaGH97=2LGB1JV!2$+6AOnAZta^OinH4m8Hi+~AxLcu##
z1_q`oPZ!6Kid%1H-uD&>6ggg=7Jk~~VBDl$IW3hy&m~7E)o6b3f3ekp>yY^WNpe+u
z@<-AqPMF8_Wug28X_qI?ES+j=1dfWmj9P14$6q6^#~yoW=FOSj-w(B?zQ1?Z@_zNX
zozKs#5pPR8_w1o1qhEvY0~QO$m7E$=y{cAm$1u4TusyMiXOBN9b<=o%h~D)6TxZ2L
z-wy{3Bv_|Anp-fQnfviaop?^u^9P|aavfR^q-HRP|A?-4WGLhNY;oO=;cr6U{mw1b
zfyXQ)5<K2~+8XI|D!qQkH?<wI?Y|fIq%SBtptrqo@&e%!nFlZ3Ebb=VSSseU`hoD_
zg?@*RZYcdEJ7?MSt~-B^O$e}NUDw>7$vI&{BwM(H=$Zy|o6J|otUTZRPVnfQVEX*>
zmxiA52Zj~=`(!sgQ?EEx@Uh2cBJT^&=!TXvm+aU4J}A8WuD}CL|E)Hi{YG6rZvtZX
zXEir4^`G4%r0_X@lb%D*p3^M<)~<`~j+)5LDXstaf~>)z7{lz=mdi>%=7cgnKOoY7
za+cA)=HqXjZtV>)e!To(Wa^&tZuy#hb{d+DNe@(BgdQ_rXUaeC$jpR7{>%@*rhKe?
z_f4ll_W99AcC9sPISZ2PJP!R(VcB9_@+vFOl=Jaq4#j@U2hyyo53DmuZ*Gw34xL?i
z|MlzY2RhsnlD-C1I_%k$+s$CO>(Z&?T5I39tv$(jbBg0*zij534XzC)8Q%|tKHk2x
zVK1xks)eUhIPNkeuVJ=M=`T(;dvd^4N@m4!en$JvN}Y$*T=hOPY3U^0D#(0hmMid~
zsn%aSKdQy=+}<q@MJB29^v^i6ch2oaANNlZc<^swA=4ZN^#hzg_Org>Heh(<y|q2M
T-w{}9Gcb6%`njxgN@xNAO}|8u

diff --git a/briar-android/res/drawable-mdpi/action_about.png b/briar-android/res/drawable-mdpi/action_about.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c57436fc57705e300e32dfb04a13508b47ec534
GIT binary patch
literal 1441
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y
zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP
zs8ErclUHn2VXFi-*9yo63F|8<fR&VF+bTgE72zA8;GAESs$i;Tpqp%9W~g9hqGxDg
zU}<8hqhMrUXrOOsq;FuZYiM9)YHnp<r~m~@K--E^(yW49+@N*=dA3R!B_#z``ugSN
z<$C4Ddih1^`i7R4mih)p`bI{&Koz>hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83
zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s0<RzFwUtj!6b93RUi%Wu15$?rmaB)aw
zL8^XGYH@yPQ8F;%(v(3~6<9eJr6!i-7lq{K=fFZSAS1sdzc?emK*2fKRL@YsH!(Rg
z4<rKC;p=PVnO9trn3tUD>0+w{G(#^lGsVipz|h&;z{1hg$-u?X(ACh=#L&{!#L3yw
z&D7A`#K{n**Cju>G&eP`1g19yq1OqgUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZns$A
zG!Lpb1-Dx)aq86vIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1z&J?}i!@$5K?CIhd
zQgQ3e^xa;}fdXxl1)Mn8_9%ShY7$G5)sN`dtFNG?R2G(%D*A!<iqqweB^y4lZrQ-4
zdBkIb;1x9m34O;a2?|;+*Z&`ox6ny9-~IZO(vt)1r{~SQX<w{o{4smhv(H5=HFEuJ
z4Ch%{LiHbitgxLQcY*WPk9U$b4bcInMQ5HCU1O2x;h4c9yrBK&?*}mwHO)*X8cbGL
zoNGwpX=J^?zV0C7iRSQg+Zz}Se5@5sSoQ7-7_d!qkj!Zc{ufng)1+PC@mq2O+oUb!
zItdfx_cKQ?h&Ud{VVzhu?PYY*wVe4(8=rOmc`Du2-+n-Z^X0RyFPg?~M>-ok*Zs7s
z2s%^VP<d(LjQU0S^2s-&niR@+d)%Gb*lSU?`_ksDIfiW=rE9Dfxk<iIj6B*l*|l!s
zf|K)3czx7KU(o&NlbZJxmb9NWjQ4ooeCkn6x)&jO;gt8X6eWkrdP<vT#Vv|`y<f{s
ze^1=(*dK1j$$M`I7M$n3^1i8|?%1yF$_pIa>Ua7u9$RsAv(AE3tJKy#5@eRP50-wm
zIjhIO?br&R*;kuP@;6w@ss7FV!M1H_`rnM@?|GAN?(1^3z0VxDfh%d(PyYfxyV7FA
zUoMi1A8k?Ho#y$Ljng3RxVpn^mfA^aQ!ixM7n~C5c1w0$#qY*@QsMHx$6?Nok{6V&
zRGn>>c`~T};-stJjtH)vwRl-b<rJy<vr<fZ#6Bn=U~tv!ICz#fV+*Lz^mO%eS?83{
F1OPat3zGl<

literal 0
HcmV?d00001

diff --git a/briar-android/res/drawable-mdpi/action_help.png b/briar-android/res/drawable-mdpi/action_help.png
deleted file mode 100644
index 72edd5a761481a3598974dac6d741b31ca953fb7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1318
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y
zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP
zs8ErclUHn2VXFi-*9yo63F|8<fR&VF+bTgE72zA8;GAESs$i;Tpqp%9W~g9hqGxDg
zU}<8hqhMrUXrOOsq;FuZYiM9)YHnp<r~m~@K--E^(yW49+@N*=dA3R!B_#z``ugSN
z<$C4Ddih1^`i7R4mih)p`bI{&Koz>hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83
zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s0<RzFwUtj!6b93RUi%Wu15$?rmaB)aw
zL8^XGYH@yPQ8F;%(v(3~6<9eJr6!i-7lq{K=fFZSAS1sdzc?emK*2fKRL@YsH!(Rg
z4<rKC;p=PVnO9trn3tUD>0+w{G(#^lGsVipz{1GF+`!V*$-u?X(ACh=#L&{!#L3yw
z&D7A`#K{n**Cju>G&eP`1g19yq1O?oUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnv1@
zG!Lpb1-Dx)aO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zo?(~5$H2fi!_&nv
zq~g|_>HGCr9A%D{n^(6#?s)NqOVMeKi-rhS;7e62srnwLDK1-7vU<H-Hgl<julSQy
z&??`~k+*mH9$zzYAxrDcXX_^WKP$`6-=Cj$?@al*-bE))8ri5nKEaxzci{i)W=8=P
z*Y90r4&wIB+6D6VB5jGgm;~-7@bqX`N*8>Ub-i+c^9CFL%6^6<!JdZl4-2maf3nhO
z((H_8^v|q*AX1|hxw<NT@{C3AKJVf`Gee@0dGCx)zJroGSW^v_zwC5RV|cSf_krk|
zrd3r^?7Ta;+rHRwy)iLl>gkSuCoWW%@H?$qeg><qP{4&rCPqxXj>hMjJ<sl4zw*{*
z#fE3mY|UP$=G8a)7Gy>-)Nh~SaW3@-huIb@nafOW2RBUm9o3ip;8>X9tMJ!ZH*-xV
z|FLH}Wt8A~z5LkfMCUinT~+7b{ye&^p=(3A+z-Wwl3fS3`egVr^loQZ_I2jr{d|47
zGdHmNtoT%T{{02Z1Gi>g@Sf8&$Axi|+JaS!!#xXr+irT<xa*ls$lc|f=VyyPcvgS5
fh%u7;hgbrGXm?!3!@v9YgGw$>S3j3^P6<r_yYJL&

diff --git a/briar-android/res/drawable-xhdpi/action_about.png b/briar-android/res/drawable-xhdpi/action_about.png
new file mode 100644
index 0000000000000000000000000000000000000000..2641f142a4684cf149ac36e23417ad56cf021e61
GIT binary patch
literal 2257
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

literal 0
HcmV?d00001

diff --git a/briar-android/res/drawable-xhdpi/action_help.png b/briar-android/res/drawable-xhdpi/action_help.png
deleted file mode 100644
index 0e67d7c12130fd86e9c7191c236b31aebdfe890e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1796
zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+*
zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn
zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%uvD1M9<K~
zz|zE0N5ROz&_LhNNZ-I**U-Sq)ZEIzPyq^*fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj
z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5
zFD<cE0=g99h1>$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;Np<V
zf>iyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr4|esh**NZ(?$0
z9!LbN!`Ii!Gq1QLF)umQ)5TT^Xog;9W{Q=GfuXaxfrYE7lYxt&p{t>#iJ_&diIcOV
zo2j9>iIX8ruS<S%X>Mv>2~2MaLa!T6y`aR9TL84#CABECEH%ZgC_h&L>}jh^+-`Bk
zX&zK>3U0T!;MA)Rbc{YIYLTKECIn1BASOKF0y*%cpPC0u??u3b{ao69Eik{7dAc};
zRNQ(qJGP%YQ0AEb?cCi{mTKQf5L7z2sUy#2NAdGhtsNcPyT3BlaF*LOa&xW|i0Kp%
za%9>2X;RLHkLQjpGP!Z-ZQt|xc4y7bp4rm-*5~|7%ai)I-)=Fko@e?0y0LVjjC<*)
zj#Yf}VGP<0q6fGVST`_5Fj|$Doc+RSJhSKiLrVqLOEs}`+x{`!ca;0{)ymOqc5Xgn
z&AQDJYgqp#*m+#3S;k=3JUxNs&y^z9D?L*a1acT_75tPEP92qbx>xB3>$_&_2aEHV
zPCU8RESsP_<GANki-S(g_r;BG@@{KB{a~9PlMI{n&LgRhgnjGoE3$T#cRb&<&|74}
z?m16by#80N>oUIM9el~DAzFbwsdQRp%k}kpzDcQa?P5Q3&9TA%f#%%Uw@W4;S!vX-
z)UWz#O-pEk1G~I}T7hiNTA>|}_~RO$Crr5)8|I}S!CTh&G~v=={SJ@U2b5(GJ&->3
zNm0$5{~)v9zy8x*f^yA|dFJMIPT<(=vfSo@)Q@9V4Xzz{uFAZJv+qNmwchFl;p&WT
z9>$MteV3j-%(Kf^zipD8pyR)5g_l_)f<;yDIHli9VSLt<Yj<3A%|4^h29~+^jea%U
z5=<`r;j%qz!^De+YwAxd4-jg6w=IdaMfU(#!Gvw`A0mHEGKsyoQT~CsS>xiKw{_)l
z)Bb6yg&gD9Ajz|Nhvtu#BZYo-A=mpR+?IIoB>2?s@9LcAvkPX~Pt|1dP%hbj{)x8e
z;u5>_+p=!9Yc_<`{MBQfxJs*YeN(sb1)of7#-J^=>)AZ#Oy2)sB4?I<!<M7sl`2++
z)6P6^F7t3qYqIqzUmo*r-;d_%#FoVhtR0%~?GiOP+QqkVhS=0xeEK&cqSSK&)04<E
zK07!9g1(yjY!P>mTBKfMQ**L}QKp|m;ME3xkCI&sj>`{C`oOd4pZ{gWeW~x}o5wO#
zYCM{u_5PiU<gaBf{-kLC>CwvXlgMNediCw&JO51*zs_Dz->=WY9>Q&AcgwZGgnMCA
z(fyATzb{qXbufhSSB36=Eq|ZH#+6J*q|OL0TE=B?&7oJH&oX@#!zS-PeMcvRSNvHu
z>%PxbH-?Sxi&x#bKi#ij`>eXC6tVvJAl*6@y*D-vLh~kP{qmg9^~2K4d0wfL+7H*M
z@=Xz^QuXT`tNzO$@@iH7w*Od;X$CmKuVDbE{{_y+?HSn^+&p)g-|%3a462trUHx3v
IIVCg!0CTakTmS$7

diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml
index 7506ae777b..f71e679791 100644
--- a/briar-android/res/values/strings.xml
+++ b/briar-android/res/values/strings.xml
@@ -16,8 +16,9 @@
     <string name="expiry_warning">This software has expired.\nPlease install a newer version.</string>
     <string name="contact_list_button">Contacts</string>
     <string name="forums_button">Forums</string>
-    <string name="testing_button">Testing</string>
+    <string name="settings_button">Settings</string>
     <string name="sign_out_button">Sign Out</string>
+    <string name="testing_button">Testing</string>
     <string name="contact_list_title">Contacts</string>
     <string name="no_contacts">No contacts</string>
     <string name="contact_connected">Connected</string>
@@ -79,4 +80,7 @@
     <string name="private_message_notification_text">Touch to show.</string>
     <string name="group_post_notification_title">New forum post</string>
     <string name="group_post_notification_text">Touch to show.</string>
+    <string name="settings_title">Settings</string>
+    <string name="activate_bluetooth_option">Activate Bluetooth while signed in</string>
+    <string name="activate_bluetooth_explanation">Briar uses Bluetooth to communicate with nearby contacts</string>
 </resources>
\ No newline at end of file
diff --git a/briar-android/src/org/briarproject/android/DashboardActivity.java b/briar-android/src/org/briarproject/android/DashboardActivity.java
index 5fbdf520a9..294bf0b7e1 100644
--- a/briar-android/src/org/briarproject/android/DashboardActivity.java
+++ b/briar-android/src/org/briarproject/android/DashboardActivity.java
@@ -114,19 +114,19 @@ public class DashboardActivity extends BriarActivity {
 		});
 		buttons.add(forumsButton);
 
-		Button testingButton = new Button(this);
-		testingButton.setLayoutParams(matchMatch);
-		testingButton.setBackgroundResource(0);
-		testingButton.setCompoundDrawablesWithIntrinsicBounds(0,
-				R.drawable.action_help, 0, 0);
-		testingButton.setText(R.string.testing_button);
-		testingButton.setOnClickListener(new OnClickListener() {
+		Button settingsButton = new Button(this);
+		settingsButton.setLayoutParams(matchMatch);
+		settingsButton.setBackgroundResource(0);
+		settingsButton.setCompoundDrawablesWithIntrinsicBounds(0,
+				R.drawable.action_settings, 0, 0);
+		settingsButton.setText(R.string.settings_button);
+		settingsButton.setOnClickListener(new OnClickListener() {
 			public void onClick(View view) {
 				startActivity(new Intent(DashboardActivity.this,
-						TestingActivity.class));
+						SettingsActivity.class));
 			}
 		});
-		buttons.add(testingButton);
+		buttons.add(settingsButton);
 
 		Button signOutButton = new Button(this);
 		signOutButton.setLayoutParams(matchMatch);
diff --git a/briar-android/src/org/briarproject/android/SettingsActivity.java b/briar-android/src/org/briarproject/android/SettingsActivity.java
new file mode 100644
index 0000000000..bb01b8900e
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/SettingsActivity.java
@@ -0,0 +1,160 @@
+package org.briarproject.android;
+
+import static android.view.Gravity.CENTER;
+import static android.view.View.GONE;
+import static android.view.View.VISIBLE;
+import static android.widget.LinearLayout.VERTICAL;
+import static java.util.logging.Level.WARNING;
+import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP;
+import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP_1;
+
+import java.util.logging.Logger;
+
+import javax.inject.Inject;
+
+import org.briarproject.R;
+import org.briarproject.android.util.HorizontalBorder;
+import org.briarproject.android.util.LayoutUtils;
+import org.briarproject.android.util.ListLoadingProgressBar;
+import org.briarproject.api.TransportConfig;
+import org.briarproject.api.TransportId;
+import org.briarproject.api.db.DatabaseComponent;
+import org.briarproject.api.db.DbException;
+
+import android.bluetooth.BluetoothAdapter;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.CheckBox;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+public class SettingsActivity extends BriarActivity implements OnClickListener {
+
+	private static final Logger LOG =
+			Logger.getLogger(SettingsActivity.class.getName());
+
+	private CheckBox bluetooth = null;
+	private ScrollView scroll = null;
+	private ListLoadingProgressBar progress = null;
+	private ImageButton testingButton = null;
+
+	// Fields that are accessed from background threads must be volatile
+	@Inject private volatile DatabaseComponent db;
+
+	@Override
+	public void onCreate(Bundle state) {
+		super.onCreate(state);
+
+		LinearLayout layout = new LinearLayout(this);
+		layout.setOrientation(VERTICAL);
+
+		scroll = new ScrollView(this);
+
+		LinearLayout settings = new LinearLayout(this);
+		settings.setOrientation(VERTICAL);
+		int pad = LayoutUtils.getPadding(this);
+		settings.setPadding(pad, pad, pad, pad);
+
+		bluetooth = new CheckBox(this);
+		bluetooth.setLayoutParams(MATCH_WRAP);
+		bluetooth.setTextSize(18);
+		bluetooth.setText(R.string.activate_bluetooth_option);
+		bluetooth.setOnClickListener(this);
+		settings.addView(bluetooth);
+
+		TextView bluetoothHint = new TextView(this);
+		bluetoothHint.setText(R.string.activate_bluetooth_explanation);
+		settings.addView(bluetoothHint);
+
+		scroll.addView(settings);
+		scroll.setLayoutParams(MATCH_WRAP_1);
+		scroll.setVisibility(GONE);
+		layout.addView(scroll);
+
+		progress = new ListLoadingProgressBar(this);
+		layout.addView(progress);
+
+		layout.addView(new HorizontalBorder(this));
+
+		LinearLayout footer = new LinearLayout(this);
+		footer.setLayoutParams(MATCH_WRAP);
+		footer.setGravity(CENTER);
+		Resources res = getResources();
+		footer.setBackgroundColor(res.getColor(R.color.button_bar_background));
+		testingButton = new ImageButton(this);
+		testingButton.setBackgroundResource(0);
+		testingButton.setImageResource(R.drawable.action_about);
+		testingButton.setOnClickListener(this);
+		footer.addView(testingButton);
+		layout.addView(footer);
+
+		setContentView(layout);
+	}
+
+	@Override
+	public void onResume() {
+		super.onResume();
+		loadSettings();
+	}
+
+	private void loadSettings() {
+		runOnDbThread(new Runnable() {
+			public void run() {
+				try {
+					boolean activateBluetooth = true;
+					TransportConfig c = db.getConfig(new TransportId("bt"));
+					if(c != null && "false".equals(c.get("enable")))
+						activateBluetooth = false;
+					displaySettings(activateBluetooth);
+				} catch(DbException e) {
+					if(LOG.isLoggable(WARNING))
+						LOG.log(WARNING, e.toString(), e);
+				}
+			}
+		});
+	}
+
+	private void displaySettings(final boolean activateBluetooth) {
+		runOnUiThread(new Runnable() {
+			public void run() {
+				scroll.setVisibility(VISIBLE);
+				progress.setVisibility(GONE);
+				bluetooth.setChecked(activateBluetooth);
+			}
+		});
+	}
+
+	public void onClick(View view) {
+		if(testingButton == null) return; // Not created yet
+		if(view == bluetooth) {
+			boolean activateBluetooth = bluetooth.isChecked();
+			if(!activateBluetooth) {
+				BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+				if(adapter != null) adapter.disable();
+			}
+			storeSettings(activateBluetooth);
+		} else if(view == testingButton) {
+			startActivity(new Intent(this, TestingActivity.class));
+		}
+	}
+
+	private void storeSettings(final boolean activateBluetooth) {
+		runOnDbThread(new Runnable() {
+			public void run() {
+				try {
+					TransportConfig c = new TransportConfig();
+					c.put("enable", String.valueOf(activateBluetooth));
+					db.mergeConfig(new TransportId("bt"), c);
+				} catch(DbException e) {
+					if(LOG.isLoggable(WARNING))
+						LOG.log(WARNING, e.toString(), e);
+				}
+			}
+		});
+	}
+}
-- 
GitLab