Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
briar
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Julian Dehm
briar
Commits
42031631
Commit
42031631
authored
Aug 14, 2018
by
akwizgran
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '1247-pin-lock' into 'master'
Screen Lock Feature See merge request
briar/briar!870
parents
4f18303a
64e30844
Changes
52
Hide whitespace changes
Inline
Side-by-side
Showing
52 changed files
with
632 additions
and
118 deletions
+632
-118
briar-android/build.gradle
briar-android/build.gradle
+16
-16
briar-android/src/main/AndroidManifest.xml
briar-android/src/main/AndroidManifest.xml
+6
-0
briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java
...java/org/briarproject/briar/android/AndroidComponent.java
+3
-0
briar-android/src/main/java/org/briarproject/briar/android/AndroidNotificationManagerImpl.java
...project/briar/android/AndroidNotificationManagerImpl.java
+48
-5
briar-android/src/main/java/org/briarproject/briar/android/AppModule.java
...c/main/java/org/briarproject/briar/android/AppModule.java
+11
-0
briar-android/src/main/java/org/briarproject/briar/android/BriarService.java
...ain/java/org/briarproject/briar/android/BriarService.java
+7
-21
briar-android/src/main/java/org/briarproject/briar/android/TestingConstants.java
...java/org/briarproject/briar/android/TestingConstants.java
+5
-0
briar-android/src/main/java/org/briarproject/briar/android/account/LockManagerImpl.java
...g/briarproject/briar/android/account/LockManagerImpl.java
+132
-0
briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java
...riarproject/briar/android/activity/ActivityComponent.java
+3
-0
briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java
...rg/briarproject/briar/android/activity/BriarActivity.java
+27
-7
briar-android/src/main/java/org/briarproject/briar/android/activity/RequestCodes.java
...org/briarproject/briar/android/activity/RequestCodes.java
+2
-0
briar-android/src/main/java/org/briarproject/briar/android/login/PasswordActivity.java
...rg/briarproject/briar/android/login/PasswordActivity.java
+3
-6
briar-android/src/main/java/org/briarproject/briar/android/login/UnlockActivity.java
.../org/briarproject/briar/android/login/UnlockActivity.java
+123
-0
briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java
...iarproject/briar/android/navdrawer/NavDrawerActivity.java
+18
-3
briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java
...briarproject/briar/android/settings/SettingsFragment.java
+34
-3
briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java
...iarproject/briar/android/splash/SplashScreenActivity.java
+14
-1
briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java
...ain/java/org/briarproject/briar/android/util/UiUtils.java
+13
-0
briar-android/src/main/java/org/briarproject/briar/api/android/AndroidNotificationManager.java
...project/briar/api/android/AndroidNotificationManager.java
+6
-0
briar-android/src/main/java/org/briarproject/briar/api/android/LockManager.java
.../java/org/briarproject/briar/api/android/LockManager.java
+33
-0
briar-android/src/main/res/layout/activity_unlock.xml
briar-android/src/main/res/layout/activity_unlock.xml
+49
-0
briar-android/src/main/res/menu/navigation_drawer.xml
briar-android/src/main/res/menu/navigation_drawer.xml
+5
-0
briar-android/src/main/res/values-ast/strings.xml
briar-android/src/main/res/values-ast/strings.xml
+1
-1
briar-android/src/main/res/values-bg/strings.xml
briar-android/src/main/res/values-bg/strings.xml
+2
-2
briar-android/src/main/res/values-br/strings.xml
briar-android/src/main/res/values-br/strings.xml
+1
-1
briar-android/src/main/res/values-ca/strings.xml
briar-android/src/main/res/values-ca/strings.xml
+2
-2
briar-android/src/main/res/values-cs/strings.xml
briar-android/src/main/res/values-cs/strings.xml
+2
-2
briar-android/src/main/res/values-de/strings.xml
briar-android/src/main/res/values-de/strings.xml
+2
-2
briar-android/src/main/res/values-es/strings.xml
briar-android/src/main/res/values-es/strings.xml
+2
-2
briar-android/src/main/res/values-eu/strings.xml
briar-android/src/main/res/values-eu/strings.xml
+2
-2
briar-android/src/main/res/values-fa/strings.xml
briar-android/src/main/res/values-fa/strings.xml
+2
-2
briar-android/src/main/res/values-fi/strings.xml
briar-android/src/main/res/values-fi/strings.xml
+2
-2
briar-android/src/main/res/values-fr/strings.xml
briar-android/src/main/res/values-fr/strings.xml
+2
-2
briar-android/src/main/res/values-gl/strings.xml
briar-android/src/main/res/values-gl/strings.xml
+2
-2
briar-android/src/main/res/values-he/strings.xml
briar-android/src/main/res/values-he/strings.xml
+1
-1
briar-android/src/main/res/values-hi/strings.xml
briar-android/src/main/res/values-hi/strings.xml
+2
-2
briar-android/src/main/res/values-it/strings.xml
briar-android/src/main/res/values-it/strings.xml
+2
-2
briar-android/src/main/res/values-ja/strings.xml
briar-android/src/main/res/values-ja/strings.xml
+1
-1
briar-android/src/main/res/values-nb/strings.xml
briar-android/src/main/res/values-nb/strings.xml
+2
-2
briar-android/src/main/res/values-nl/strings.xml
briar-android/src/main/res/values-nl/strings.xml
+2
-2
briar-android/src/main/res/values-oc/strings.xml
briar-android/src/main/res/values-oc/strings.xml
+2
-2
briar-android/src/main/res/values-pl/strings.xml
briar-android/src/main/res/values-pl/strings.xml
+2
-2
briar-android/src/main/res/values-pt-rBR/strings.xml
briar-android/src/main/res/values-pt-rBR/strings.xml
+2
-2
briar-android/src/main/res/values-ro/strings.xml
briar-android/src/main/res/values-ro/strings.xml
+2
-2
briar-android/src/main/res/values-ru/strings.xml
briar-android/src/main/res/values-ru/strings.xml
+2
-2
briar-android/src/main/res/values-sq/strings.xml
briar-android/src/main/res/values-sq/strings.xml
+2
-2
briar-android/src/main/res/values-sr/strings.xml
briar-android/src/main/res/values-sr/strings.xml
+2
-2
briar-android/src/main/res/values-sv/strings.xml
briar-android/src/main/res/values-sv/strings.xml
+2
-2
briar-android/src/main/res/values-tr/strings.xml
briar-android/src/main/res/values-tr/strings.xml
+2
-2
briar-android/src/main/res/values-zh-rCN/strings.xml
briar-android/src/main/res/values-zh-rCN/strings.xml
+2
-2
briar-android/src/main/res/values/strings.xml
briar-android/src/main/res/values/strings.xml
+13
-2
briar-android/src/main/res/xml/panic_preferences.xml
briar-android/src/main/res/xml/panic_preferences.xml
+2
-2
briar-android/src/main/res/xml/settings.xml
briar-android/src/main/res/xml/settings.xml
+7
-0
No files found.
briar-android/build.gradle
View file @
42031631
...
...
@@ -40,9 +40,9 @@ dependencies {
testImplementation
project
(
path:
':bramble-api'
,
configuration:
'testOutput'
)
testImplementation
project
(
path:
':bramble-core'
,
configuration:
'testOutput'
)
testImplementation
'org.robolectric:robolectric:3.
5.1
'
testImplementation
'org.robolectric:shadows-support-v4:3.
0
'
testImplementation
'org.mockito:mockito-core:2.
8.9
'
testImplementation
'org.robolectric:robolectric:3.
8
'
testImplementation
'org.robolectric:shadows-support-v4:3.
3.2
'
testImplementation
'org.mockito:mockito-core:2.
13.0
'
testImplementation
'junit:junit:4.12'
testImplementation
"org.jmock:jmock:2.8.2"
testImplementation
"org.jmock:jmock-junit4:2.8.2"
...
...
@@ -165,8 +165,8 @@ dependencyVerification {
'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a'
,
'nekohtml:nekohtml:1.9.6.2:nekohtml-1.9.6.2.jar:fdff6cfa9ed9cc911c842a5d2395f209ec621ef1239d46810e9e495809d3ae09'
,
'nekohtml:xercesMinimal:1.9.6.2:xercesMinimal-1.9.6.2.jar:95b8b357d19f63797dd7d67622fd3f18374d64acbc6584faba1c7759a31e8438'
,
'net.bytebuddy:byte-buddy-agent:1.
6.14:byte-buddy-agent-1.6.14.jar:c141a2d6809c3eeff4a43d25992826abccebdd4b793af3e7a5f346e88ae73a33
'
,
'net.bytebuddy:byte-buddy:1.
6.14:byte-buddy-1.6.14.jar:917758b3c651e278a15a029ba1d42dbf802d8b0e1fe2aa4b81c5750c64f461c1
'
,
'net.bytebuddy:byte-buddy-agent:1.
7.9:byte-buddy-agent-1.7.9.jar:ac1a993befb528c3271a83a9ad9c42d363d399e9deb26e0470e3c4962066c550
'
,
'net.bytebuddy:byte-buddy:1.
7.9:byte-buddy-1.7.9.jar:2ea2ada12b790d16ac7f6e6c065cb55cbcdb6ba519355f5958851159cad3b16a
'
,
'net.sf.jopt-simple:jopt-simple:4.9:jopt-simple-4.9.jar:26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5'
,
'net.sf.kxml:kxml2:2.3.0:kxml2-2.3.0.jar:f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2'
,
'org.apache.ant:ant-launcher:1.9.4:ant-launcher-1.9.4.jar:7bccea20b41801ca17bcbc909a78c835d0f443f12d639c77bd6ae3d05861608d'
,
...
...
@@ -215,8 +215,8 @@ dependencyVerification {
'org.jmock:jmock-testjar:2.8.2:jmock-testjar-2.8.2.jar:8900860f72c474e027cf97fe78dcbf154a1aa7fc62b6845c5fb4e4f3c7bc8760'
,
'org.jmock:jmock:2.8.2:jmock-2.8.2.jar:6c73cb4a2e6dbfb61fd99c9a768539c170ab6568e57846bd60dbf19596b65b16'
,
'org.jvnet.staxex:stax-ex:1.7.7:stax-ex-1.7.7.jar:a31ff7d77163c0deb09e7fee59ad35ae44c2cee2cc8552a116ccd1583d813fb4'
,
'org.mockito:mockito-core:2.
8.9:mockito-core-2.8.9.jar:a2bb9b8b40d81bb02ccb84259524c0f4911f73c6577bfc7ddd940b8fc729b6e6
'
,
'org.objenesis:objenesis:2.
5:objenesis-2.5.jar:293328e1b0d31ed30bb89fca542b6c52fac00989bb0e62eb9d98d630c4dd6b7c
'
,
'org.mockito:mockito-core:2.
13.0:mockito-core-2.13.0.jar:92a746b37cf8c5730a5e7b35fd7d8cd72700089435ff92ee03ed8384d4eb3377
'
,
'org.objenesis:objenesis:2.
6:objenesis-2.6.jar:5e168368fbc250af3c79aa5fef0c3467a2d64e5a7bd74005f25d8399aeb0708d
'
,
'org.ow2.asm:asm-analysis:5.1:asm-analysis-5.1.jar:a34658f5c5de4b573eef21131cc32cc25f7b66407944f312b28ec2e56abb1fa9'
,
'org.ow2.asm:asm-commons:5.0.1:asm-commons-5.0.1.jar:fb1cb7fa27d892712ced8fbf8d027eb5052ecd3999dba1ba47824357accb40e7'
,
'org.ow2.asm:asm-commons:5.1:asm-commons-5.1.jar:97b3786e1f55e74bddf8ad102bf50e33bbcbc1f6b7fd7b36f0bbbb25cd4981be'
,
...
...
@@ -225,15 +225,15 @@ dependencyVerification {
'org.ow2.asm:asm-util:5.1:asm-util-5.1.jar:ee032c39ae5e3cd099148fbba9a2124f9ed613e5cb93e03ee0fa8808ce364040'
,
'org.ow2.asm:asm:5.0.4:asm-5.0.4.jar:896618ed8ae62702521a78bc7be42b7c491a08e6920a15f89a3ecdec31e9a220'
,
'org.ow2.asm:asm:5.1:asm-5.1.jar:d2da399a9967c69f0a21739256fa79d284222c223082cacadc17372244764b54'
,
'org.robolectric:annotations:3.
5.1:annotations-3.5.1.jar:14db0f7d2299c5400ff7764bb37b4fa80306582d8965fdf6999091723e2384ce
'
,
'org.robolectric:junit:3.
5.1:junit-3.5.1.jar:b2e81b7d5a22755f2ea76aa9bbbd4359d61c4cb9577193ccfbb8f97378ed293
b'
,
'org.robolectric:resources:3.
5.1:resources-3.5.1.jar:22a5564590c8bfd8df7efb2b0c7d9942b46a0beb59ba38899d59c1270f293b1c
'
,
'org.robolectric:robolectric:3.
5.1:robolectric-3.5.1.jar:603cf898f93b854f18021fab452aca3fe482368eeb2e720988ae82212ebcf4b6
'
,
'org.robolectric:sandbox:3.
5.1:sandbox-3.5.1.jar:beff8c3c1e840e0f7f78aadef170f347bae349f098babfc176765f499a4bcbb5
'
,
'org.robolectric:shadowapi:3.
5.1:shadowapi-3.5.1.jar:6d574f9ae0922791eb8f06979f0010997d4b862c7aec96d485ae797ddfc1327
8'
,
'org.robolectric:shadows-framework:3.
5.1:shadows-framework-3.5.1.jar:597b54cc1a494799d783921c6ac04352f33e94fca8e00f299d4ca192db79e3fc
'
,
'org.robolectric:shadows-support-v4:3.
0:shadows-support-v4-3.0.jar:66bcc3257b037d72998e860d67b1bc58215b7eeac8ad860fcc3e613332d88619
'
,
'org.robolectric:utils:3.
5.1:utils-3.5.1.jar:d7d77326867e6d903156ebb18c244819b26aebe3aa82a1c57081081a0b6c4f63
'
,
'org.robolectric:annotations:3.
8:annotations-3.8.jar:8eab08facfe2a8cd22f6a09f4378f012a5985c0d4f4ad4e203e00f75b5568458
'
,
'org.robolectric:junit:3.
8:junit-3.8.jar:042575dbc95dc82ec046d13438ccda578917ce786d2f464cba0eb18da1f412c
b'
,
'org.robolectric:resources:3.
8:resources-3.8.jar:6d11e6d39df8eda837c52319cf8d6bef424df45be6f29b3a731707832eb6ffc1
'
,
'org.robolectric:robolectric:3.
8:robolectric-3.8.jar:34908fc858e6e4113be2cf97fe55d3ffa4462bf7183d466542582ca1898ce60a
'
,
'org.robolectric:sandbox:3.
8:sandbox-3.8.jar:cc257dc75c5af9e62a43572ac89dff4d8520427307cf973e6b663c88fb000720
'
,
'org.robolectric:shadowapi:3.
8:shadowapi-3.8.jar:28bc24cb5c4b4030852cebebfd5f12536d03088892cb3c8b1d1379297087aca
8'
,
'org.robolectric:shadows-framework:3.
8:shadows-framework-3.8.jar:83548db7249edf1af87e1a1f4d8f4eec3e85d6220161da601e6f6398476911b2
'
,
'org.robolectric:shadows-support-v4:3.
3.2:shadows-support-v4-3.3.2.jar:6f689264738266e70fe08db7c04b7b5a75155994f4e3f7f311960d90486bf005
'
,
'org.robolectric:utils:3.
8:utils-3.8.jar:e945d04d40e37554e02d4be1bc3abf9bede45375c843aa36d10ccb6b63edbf34
'
,
'tools.fastlane:screengrab:1.1.0:screengrab-1.1.0.aar:03ce3868ee8a0082d14e7a1de0999f91531c0cc794392688beb08ee9bc4495fd'
,
'uk.co.samuelwall:material-tap-target-prompt:2.8.0:material-tap-target-prompt-2.8.0.aar:ac70770c05bbc4675a1d5712c0e53d46ee4fa961b74947589fce50d8003065ec'
,
'xmlpull:xmlpull:1.1.3.1:xmlpull-1.1.3.1.jar:34e08ee62116071cbb69c0ed70d15a7a5b208d62798c59f2120bb8929324cb63'
,
...
...
briar-android/src/main/AndroidManifest.xml
View file @
42031631
...
...
@@ -402,5 +402,11 @@
android:theme=
"@android:style/Theme.NoDisplay"
>
</activity>
<activity
android:name=
".android.login.UnlockActivity"
android:label=
"@string/lock_unlock"
android:launchMode=
"singleTask"
android:theme=
"@style/BriarTheme.NoActionBar"
/>
</application>
</manifest>
briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java
View file @
42031631
...
...
@@ -28,6 +28,7 @@ import org.briarproject.briar.android.login.SignInReminderReceiver;
import
org.briarproject.briar.android.reporting.BriarReportSender
;
import
org.briarproject.briar.api.android.AndroidNotificationManager
;
import
org.briarproject.briar.api.android.DozeWatchdog
;
import
org.briarproject.briar.api.android.LockManager
;
import
org.briarproject.briar.api.android.ScreenFilterMonitor
;
import
org.briarproject.briar.api.blog.BlogManager
;
import
org.briarproject.briar.api.blog.BlogPostFactory
;
...
...
@@ -146,6 +147,8 @@ public interface AndroidComponent
AccountManager
accountManager
();
LockManager
lockManager
();
void
inject
(
SignInReminderReceiver
briarService
);
void
inject
(
BriarService
briarService
);
...
...
briar-android/src/main/java/org/briarproject/briar/android/AndroidNotificationManagerImpl.java
View file @
42031631
...
...
@@ -2,6 +2,7 @@ package org.briarproject.briar.android;
import
android.annotation.TargetApi
;
import
android.app.Application
;
import
android.app.Notification
;
import
android.app.NotificationChannel
;
import
android.app.NotificationManager
;
import
android.app.PendingIntent
;
...
...
@@ -12,7 +13,6 @@ import android.support.annotation.StringRes;
import
android.support.annotation.UiThread
;
import
android.support.v4.app.NotificationCompat
;
import
android.support.v4.app.TaskStackBuilder
;
import
android.support.v4.content.ContextCompat
;
import
org.briarproject.bramble.api.Multiset
;
import
org.briarproject.bramble.api.contact.ContactId
;
...
...
@@ -65,7 +65,6 @@ import javax.inject.Inject;
import
static
android
.
app
.
Notification
.
DEFAULT_LIGHTS
;
import
static
android
.
app
.
Notification
.
DEFAULT_SOUND
;
import
static
android
.
app
.
Notification
.
DEFAULT_VIBRATE
;
import
static
android
.
app
.
Notification
.
VISIBILITY_SECRET
;
import
static
android
.
app
.
NotificationManager
.
IMPORTANCE_DEFAULT
;
import
static
android
.
app
.
NotificationManager
.
IMPORTANCE_LOW
;
import
static
android
.
content
.
Context
.
NOTIFICATION_SERVICE
;
...
...
@@ -73,8 +72,12 @@ import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
import
static
android
.
content
.
Intent
.
FLAG_ACTIVITY_NEW_TASK
;
import
static
android
.
os
.
Build
.
VERSION
.
SDK_INT
;
import
static
android
.
support
.
v4
.
app
.
NotificationCompat
.
CATEGORY_MESSAGE
;
import
static
android
.
support
.
v4
.
app
.
NotificationCompat
.
CATEGORY_SERVICE
;
import
static
android
.
support
.
v4
.
app
.
NotificationCompat
.
CATEGORY_SOCIAL
;
import
static
android
.
support
.
v4
.
app
.
NotificationCompat
.
PRIORITY_LOW
;
import
static
android
.
support
.
v4
.
app
.
NotificationCompat
.
PRIORITY_MIN
;
import
static
android
.
support
.
v4
.
app
.
NotificationCompat
.
VISIBILITY_SECRET
;
import
static
android
.
support
.
v4
.
content
.
ContextCompat
.
getColor
;
import
static
java
.
util
.
logging
.
Level
.
WARNING
;
import
static
org
.
briarproject
.
bramble
.
util
.
LogUtils
.
logException
;
import
static
org
.
briarproject
.
briar
.
android
.
activity
.
BriarActivity
.
GROUP_ID
;
...
...
@@ -173,8 +176,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
nc
.
setLockscreenVisibility
(
VISIBILITY_SECRET
);
nc
.
enableVibration
(
true
);
nc
.
enableLights
(
true
);
nc
.
setLightColor
(
ContextCompat
.
getColor
(
appContext
,
R
.
color
.
briar_green_light
));
nc
.
setLightColor
(
getColor
(
appContext
,
R
.
color
.
briar_green_light
));
notificationManager
.
createNotificationChannel
(
nc
);
}
...
...
@@ -271,6 +273,47 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
});
}
@UiThread
@Override
public
Notification
getForegroundNotification
()
{
return
getForegroundNotification
(
false
);
}
@UiThread
private
Notification
getForegroundNotification
(
boolean
locked
)
{
int
title
=
locked
?
R
.
string
.
lock_is_locked
:
R
.
string
.
ongoing_notification_title
;
int
text
=
locked
?
R
.
string
.
lock_tap_to_unlock
:
R
.
string
.
ongoing_notification_text
;
int
icon
=
locked
?
R
.
drawable
.
startup_lock
:
R
.
drawable
.
notification_ongoing
;
// Ongoing foreground notification that shows BriarService is running
NotificationCompat
.
Builder
b
=
new
NotificationCompat
.
Builder
(
appContext
,
ONGOING_CHANNEL_ID
);
b
.
setSmallIcon
(
icon
);
b
.
setColor
(
getColor
(
appContext
,
R
.
color
.
briar_primary
));
b
.
setContentTitle
(
appContext
.
getText
(
title
));
b
.
setContentText
(
appContext
.
getText
(
text
));
b
.
setWhen
(
0
);
// Don't show the time
b
.
setOngoing
(
true
);
Intent
i
=
new
Intent
(
appContext
,
NavDrawerActivity
.
class
);
i
.
setFlags
(
FLAG_ACTIVITY_NEW_TASK
|
FLAG_ACTIVITY_CLEAR_TOP
);
b
.
setContentIntent
(
PendingIntent
.
getActivity
(
appContext
,
0
,
i
,
0
));
if
(
SDK_INT
>=
21
)
{
b
.
setCategory
(
CATEGORY_SERVICE
);
b
.
setVisibility
(
VISIBILITY_SECRET
);
}
b
.
setPriority
(
PRIORITY_MIN
);
return
b
.
build
();
}
@UiThread
@Override
public
void
updateForegroundNotification
(
boolean
locked
)
{
Notification
n
=
getForegroundNotification
(
locked
);
notificationManager
.
notify
(
ONGOING_NOTIFICATION_ID
,
n
);
}
private
void
showContactNotification
(
ContactId
c
)
{
androidExecutor
.
runOnUiThread
(()
->
{
if
(
blockContacts
)
return
;
...
...
@@ -636,7 +679,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
NotificationCompat
.
Builder
b
=
new
NotificationCompat
.
Builder
(
appContext
,
REMINDER_CHANNEL_ID
);
b
.
setSmallIcon
(
R
.
drawable
.
ic_signout
);
b
.
setColor
(
ContextCompat
.
getColor
(
appContext
,
R
.
color
.
briar_primary
));
b
.
setColor
(
getColor
(
appContext
,
R
.
color
.
briar_primary
));
b
.
setContentTitle
(
appContext
.
getText
(
R
.
string
.
reminder_notification_title
));
b
.
setContentText
(
...
...
briar-android/src/main/java/org/briarproject/briar/android/AppModule.java
View file @
42031631
...
...
@@ -29,8 +29,10 @@ import org.briarproject.bramble.plugin.tor.AndroidTorPluginFactory;
import
org.briarproject.bramble.plugin.tor.CircumventionProvider
;
import
org.briarproject.bramble.util.AndroidUtils
;
import
org.briarproject.bramble.util.StringUtils
;
import
org.briarproject.briar.android.account.LockManagerImpl
;
import
org.briarproject.briar.api.android.AndroidNotificationManager
;
import
org.briarproject.briar.api.android.DozeWatchdog
;
import
org.briarproject.briar.api.android.LockManager
;
import
org.briarproject.briar.api.android.ScreenFilterMonitor
;
import
java.io.File
;
...
...
@@ -200,4 +202,13 @@ public class AppModule {
return
dozeWatchdog
;
}
@Provides
@Singleton
LockManager
provideLockManager
(
LifecycleManager
lifecycleManager
,
EventBus
eventBus
,
LockManagerImpl
lockManager
)
{
lifecycleManager
.
registerService
(
lockManager
);
eventBus
.
addListener
(
lockManager
);
return
lockManager
;
}
}
briar-android/src/main/java/org/briarproject/briar/android/BriarService.java
View file @
42031631
...
...
@@ -2,6 +2,7 @@ package org.briarproject.briar.android;
import
android.app.ActivityManager
;
import
android.app.ActivityManager.RunningAppProcessInfo
;
import
android.app.Notification
;
import
android.app.NotificationChannel
;
import
android.app.NotificationManager
;
import
android.app.PendingIntent
;
...
...
@@ -15,7 +16,6 @@ import android.content.ServiceConnection;
import
android.os.Binder
;
import
android.os.IBinder
;
import
android.support.v4.app.NotificationCompat
;
import
android.support.v4.content.ContextCompat
;
import
org.briarproject.bramble.api.account.AccountManager
;
import
org.briarproject.bramble.api.crypto.SecretKey
;
...
...
@@ -25,6 +25,7 @@ import org.briarproject.bramble.api.system.AndroidExecutor;
import
org.briarproject.briar.R
;
import
org.briarproject.briar.android.logout.HideUiActivity
;
import
org.briarproject.briar.android.navdrawer.NavDrawerActivity
;
import
org.briarproject.briar.api.android.AndroidNotificationManager
;
import
java.util.concurrent.CountDownLatch
;
import
java.util.concurrent.atomic.AtomicBoolean
;
...
...
@@ -44,8 +45,6 @@ import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
import
static
android
.
content
.
Intent
.
FLAG_ACTIVITY_NEW_TASK
;
import
static
android
.
content
.
Intent
.
FLAG_ACTIVITY_NO_ANIMATION
;
import
static
android
.
os
.
Build
.
VERSION
.
SDK_INT
;
import
static
android
.
support
.
v4
.
app
.
NotificationCompat
.
CATEGORY_SERVICE
;
import
static
android
.
support
.
v4
.
app
.
NotificationCompat
.
PRIORITY_MIN
;
import
static
android
.
support
.
v4
.
app
.
NotificationCompat
.
VISIBILITY_SECRET
;
import
static
java
.
util
.
logging
.
Level
.
INFO
;
import
static
java
.
util
.
logging
.
Level
.
WARNING
;
...
...
@@ -74,6 +73,8 @@ public class BriarService extends Service {
@Nullable
private
BroadcastReceiver
receiver
=
null
;
@Inject
AndroidNotificationManager
notificationManager
;
@Inject
AccountManager
accountManager
;
...
...
@@ -121,24 +122,9 @@ public class BriarService extends Service {
failureChannel
.
setLockscreenVisibility
(
VISIBILITY_SECRET
);
nm
.
createNotificationChannel
(
failureChannel
);
}
// Show an ongoing notification that the service is running
NotificationCompat
.
Builder
b
=
new
NotificationCompat
.
Builder
(
this
,
ONGOING_CHANNEL_ID
);
b
.
setSmallIcon
(
R
.
drawable
.
notification_ongoing
);
b
.
setColor
(
ContextCompat
.
getColor
(
this
,
R
.
color
.
briar_primary
));
b
.
setContentTitle
(
getText
(
R
.
string
.
ongoing_notification_title
));
b
.
setContentText
(
getText
(
R
.
string
.
ongoing_notification_text
));
b
.
setWhen
(
0
);
// Don't show the time
b
.
setOngoing
(
true
);
Intent
i
=
new
Intent
(
this
,
NavDrawerActivity
.
class
);
i
.
setFlags
(
FLAG_ACTIVITY_NEW_TASK
|
FLAG_ACTIVITY_CLEAR_TOP
);
b
.
setContentIntent
(
PendingIntent
.
getActivity
(
this
,
0
,
i
,
0
));
if
(
SDK_INT
>=
21
)
{
b
.
setCategory
(
CATEGORY_SERVICE
);
b
.
setVisibility
(
VISIBILITY_SECRET
);
}
b
.
setPriority
(
PRIORITY_MIN
);
startForeground
(
ONGOING_NOTIFICATION_ID
,
b
.
build
());
Notification
foregroundNotification
=
notificationManager
.
getForegroundNotification
();
startForeground
(
ONGOING_NOTIFICATION_ID
,
foregroundNotification
);
// Start the services in a background thread
new
Thread
(()
->
{
StartResult
result
=
lifecycleManager
.
startServices
(
dbKey
);
...
...
briar-android/src/main/java/org/briarproject/briar/android/TestingConstants.java
View file @
42031631
...
...
@@ -40,4 +40,9 @@ public interface TestingConstants {
* Feature flag for enabling the sign-in reminder in release builds.
*/
boolean
FEATURE_FLAG_SIGN_IN_REMINDER
=
IS_DEBUG_BUILD
;
/**
* Feature flag for enabling the PIN lock in release builds.
*/
boolean
FEATURE_FLAG_PIN_LOCK
=
IS_DEBUG_BUILD
;
}
briar-android/src/main/java/org/briarproject/briar/android/account/LockManagerImpl.java
0 → 100644
View file @
42031631
package
org.briarproject.briar.android.account
;
import
android.app.Application
;
import
android.arch.lifecycle.LiveData
;
import
android.arch.lifecycle.MutableLiveData
;
import
android.content.Context
;
import
android.support.annotation.UiThread
;
import
org.briarproject.bramble.api.db.DatabaseExecutor
;
import
org.briarproject.bramble.api.db.DbException
;
import
org.briarproject.bramble.api.event.Event
;
import
org.briarproject.bramble.api.event.EventListener
;
import
org.briarproject.bramble.api.lifecycle.Service
;
import
org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault
;
import
org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault
;
import
org.briarproject.bramble.api.settings.Settings
;
import
org.briarproject.bramble.api.settings.SettingsManager
;
import
org.briarproject.bramble.api.settings.event.SettingsUpdatedEvent
;
import
org.briarproject.briar.api.android.AndroidNotificationManager
;
import
org.briarproject.briar.api.android.LockManager
;
import
java.util.concurrent.Executor
;
import
java.util.logging.Logger
;
import
javax.annotation.concurrent.ThreadSafe
;
import
javax.inject.Inject
;
import
static
java
.
util
.
logging
.
Level
.
WARNING
;
import
static
org
.
briarproject
.
bramble
.
util
.
LogUtils
.
logException
;
import
static
org
.
briarproject
.
briar
.
android
.
settings
.
SettingsFragment
.
PREF_SCREEN_LOCK
;
import
static
org
.
briarproject
.
briar
.
android
.
settings
.
SettingsFragment
.
SETTINGS_NAMESPACE
;
import
static
org
.
briarproject
.
briar
.
android
.
util
.
UiUtils
.
hasScreenLock
;
@ThreadSafe
@MethodsNotNullByDefault
@ParametersNotNullByDefault
public
class
LockManagerImpl
implements
LockManager
,
Service
,
EventListener
{
private
static
final
Logger
LOG
=
Logger
.
getLogger
(
LockManagerImpl
.
class
.
getName
());
private
final
Context
appContext
;
private
final
SettingsManager
settingsManager
;
private
final
AndroidNotificationManager
notificationManager
;
@DatabaseExecutor
private
final
Executor
dbExecutor
;
private
volatile
boolean
locked
=
false
;
private
volatile
boolean
lockableSetting
=
false
;
private
final
MutableLiveData
<
Boolean
>
lockable
=
new
MutableLiveData
<>();
@Inject
public
LockManagerImpl
(
Application
app
,
SettingsManager
settingsManager
,
AndroidNotificationManager
notificationManager
,
@DatabaseExecutor
Executor
dbExecutor
)
{
this
.
appContext
=
app
.
getApplicationContext
();
this
.
settingsManager
=
settingsManager
;
this
.
notificationManager
=
notificationManager
;
this
.
dbExecutor
=
dbExecutor
;
// setting this in the constructor makes #getValue() @NonNull
this
.
lockable
.
setValue
(
false
);
}
@Override
public
void
startService
()
{
// only load the setting here, because database isn't open before
loadLockableSetting
();
}
@Override
public
void
stopService
()
{
}
@Override
public
LiveData
<
Boolean
>
isLockable
()
{
return
lockable
;
}
@UiThread
@Override
public
void
checkIfLockable
()
{
boolean
oldValue
=
lockable
.
getValue
();
boolean
newValue
=
hasScreenLock
(
appContext
)
&&
lockableSetting
;
if
(
oldValue
!=
newValue
)
{
this
.
lockable
.
setValue
(
newValue
);
}
}
@Override
public
boolean
isLocked
()
{
if
(
locked
&&
!
hasScreenLock
(
appContext
))
{
lockable
.
postValue
(
false
);
locked
=
false
;
}
return
locked
;
}
@Override
public
void
setLocked
(
boolean
locked
)
{
this
.
locked
=
locked
;
notificationManager
.
updateForegroundNotification
(
locked
);
}
@Override
public
void
eventOccurred
(
Event
event
)
{
if
(
event
instanceof
SettingsUpdatedEvent
)
{
SettingsUpdatedEvent
e
=
(
SettingsUpdatedEvent
)
event
;
String
namespace
=
e
.
getNamespace
();
if
(
namespace
.
equals
(
SETTINGS_NAMESPACE
))
{
loadLockableSetting
();
}
}
}
private
void
loadLockableSetting
()
{
dbExecutor
.
execute
(()
->
{
try
{
Settings
settings
=
settingsManager
.
getSettings
(
SETTINGS_NAMESPACE
);
lockableSetting
=
settings
.
getBoolean
(
PREF_SCREEN_LOCK
,
false
);
boolean
newValue
=
hasScreenLock
(
appContext
)
&&
lockableSetting
;
lockable
.
postValue
(
newValue
);
}
catch
(
DbException
e
)
{
logException
(
LOG
,
WARNING
,
e
);
lockableSetting
=
false
;
lockable
.
postValue
(
false
);
}
});
}
}
briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java
View file @
42031631
...
...
@@ -37,6 +37,7 @@ import org.briarproject.briar.android.login.OpenDatabaseActivity;
import
org.briarproject.briar.android.login.PasswordActivity
;
import
org.briarproject.briar.android.login.PasswordFragment
;
import
org.briarproject.briar.android.login.SetupActivity
;
import
org.briarproject.briar.android.login.UnlockActivity
;
import
org.briarproject.briar.android.navdrawer.NavDrawerActivity
;
import
org.briarproject.briar.android.panic.PanicPreferencesActivity
;
import
org.briarproject.briar.android.panic.PanicResponderActivity
;
...
...
@@ -163,6 +164,8 @@ public interface ActivityComponent {
void
inject
(
StartupFailureActivity
activity
);
void
inject
(
UnlockActivity
activity
);
// Fragments
void
inject
(
AuthorNameFragment
fragment
);
...
...
briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java
View file @
42031631
...
...
@@ -16,7 +16,9 @@ import org.briarproject.briar.android.controller.BriarController;
import
org.briarproject.briar.android.controller.DbController
;
import
org.briarproject.briar.android.controller.handler.UiResultHandler
;
import
org.briarproject.briar.android.login.PasswordActivity
;
import
org.briarproject.briar.android.login.UnlockActivity
;
import
org.briarproject.briar.android.logout.ExitActivity
;
import
org.briarproject.briar.api.android.LockManager
;
import
java.util.logging.Logger
;
...
...
@@ -30,6 +32,7 @@ import static android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION;
import
static
android
.
os
.
Build
.
VERSION
.
SDK_INT
;
import
static
org
.
briarproject
.
briar
.
android
.
activity
.
RequestCodes
.
REQUEST_DOZE_WHITELISTING
;
import
static
org
.
briarproject
.
briar
.
android
.
activity
.
RequestCodes
.
REQUEST_PASSWORD
;
import
static
org
.
briarproject
.
briar
.
android
.
activity
.
RequestCodes
.
REQUEST_UNLOCK
;
import
static
org
.
briarproject
.
briar
.
android
.
util
.
UiUtils
.
getDozeWhitelistingIntent
;
import
static
org
.
briarproject
.
briar
.
android
.
util
.
UiUtils
.
isSamsung7
;
...
...
@@ -44,26 +47,43 @@ public abstract class BriarActivity extends BaseActivity {
@Inject
BriarController
briarController
;
@Deprecated
@Inject
DbController
dbController
;
@Inject
protected
LockManager
lockManager
;
@Override
protected
void
onActivityResult
(
int
request
,
int
result
,
Intent
data
)
{
super
.
onActivityResult
(
request
,
result
,
data
);
if
(
request
==
REQUEST_PASSWORD
)
{
if
(
result
==
RESULT_OK
)
briarController
.
startAndBindService
();
else
supportFinishAfterTransition
();
if
(
request
==
REQUEST_PASSWORD
&&
result
==
RESULT_OK
)
{
// PasswordActivity finishes when password was entered correctly.
// When back button is pressed there, it will bring itself back,
// so that we never arrive here with a result that is not OK.
briarController
.
startAndBindService
();
}
else
if
(
request
==
REQUEST_UNLOCK
&&
result
!=
RESULT_OK
)
{
// We arrive here, if the user presses 'back'
// in the Keyguard unlock screen, because UnlockActivity finishes.
// If we don't finish here, isFinishing will be false in onResume()
// and we launch a new UnlockActivity causing a loop.
supportFinishAfterTransition
();
// If the result is OK, we don't need to do anything here
// and can resume normally.
}
}
@Override
public
void
on
Start
()
{
super
.
on
Start
();
if
(!
briarController
.
accountSignedIn
()
&&
!
isFinishing
()
)
{
public
void
on
Resume
()
{
super
.
on
Resume
();
if
(!
briarController
.
accountSignedIn
())
{
Intent
i
=
new
Intent
(
this
,
PasswordActivity
.
class
);
startActivityForResult
(
i
,
REQUEST_PASSWORD
);
}
else
if
(
lockManager
.
isLocked
()
&&
!
isFinishing
())
{
// Also check that the activity isn't finishing already.
// This is possible if finishing in onActivityResult().
// Failure to do this check would cause an UnlockActivity loop.
Intent
i
=
new
Intent
(
this
,
UnlockActivity
.
class
);
startActivityForResult
(
i
,
REQUEST_UNLOCK
);
}
else
if
(
SDK_INT
>=
23
)
{
briarController
.
hasDozed
(
new
UiResultHandler
<
Boolean
>(
this
)
{
@Override
...
...
briar-android/src/main/java/org/briarproject/briar/android/activity/RequestCodes.java
View file @
42031631
...
...
@@ -12,5 +12,7 @@ public interface RequestCodes {
int
REQUEST_PERMISSION_CAMERA
=
8
;
int
REQUEST_DOZE_WHITELISTING
=
9
;
int
REQUEST_ENABLE_BLUETOOTH
=
10
;
int
REQUEST_UNLOCK
=
11
;
int
REQUEST_KEYGUARD_UNLOCK
=
12
;
}
briar-android/src/main/java/org/briarproject/briar/android/login/PasswordActivity.java
View file @
42031631
...
...
@@ -23,8 +23,6 @@ import org.briarproject.briar.api.android.AndroidNotificationManager;
import
javax.inject.Inject
;
import
static
android
.
content
.
Intent
.
ACTION_MAIN
;
import
static
android
.
content
.
Intent
.
CATEGORY_HOME
;
import
static
android
.
content
.
Intent
.
FLAG_ACTIVITY_CLEAR_TASK
;
import
static
android
.
content
.
Intent
.
FLAG_ACTIVITY_NEW_TASK
;
import
static
android
.
view
.
View
.
INVISIBLE
;
...
...
@@ -109,10 +107,9 @@ public class PasswordActivity extends BaseActivity {
@Override
public
void
onBackPressed
()
{
// Show the home screen rather than another password prompt
Intent
intent
=
new
Intent
(
ACTION_MAIN
);
intent
.
addCategory
(
CATEGORY_HOME
);
startActivity
(
intent
);
// Move task and activity to the background instead of showing another
// password prompt. onActivityResult() won't be called in BriarActivity
moveTaskToBack
(
true
);
}
private
void
deleteAccount
()
{
...
...
briar-android/src/main/java/org/briarproject/briar/android/login/UnlockActivity.java
0 → 100644
View file @
42031631
package
org.briarproject.briar.android.login
;
import
android.app.KeyguardManager
;
import
android.content.Intent
;
import
android.os.Bundle
;
import
android.support.annotation.Nullable
;
import
android.support.annotation.RequiresApi
;
import
android.widget.Button
;
import
org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault
;
import
org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault
;
import
org.briarproject.briar.R
;
import
org.briarproject.briar.android.activity.ActivityComponent
;
import
org.briarproject.briar.android.activity.BaseActivity
;
import
org.briarproject.briar.api.android.LockManager
;
import
java.util.logging.Logger
;
import
javax.inject.Inject
;
import
static
android
.
os
.
Build
.
VERSION
.
SDK_INT
;
import
static
org
.
briarproject
.
briar
.
android
.
activity
.
RequestCodes
.
REQUEST_KEYGUARD_UNLOCK
;
@RequiresApi
(
21
)
@MethodsNotNullByDefault
@ParametersNotNullByDefault
public
class
UnlockActivity
extends
BaseActivity
{
private
static
final
Logger
LOG
=
Logger
.
getLogger
(
UnlockActivity
.
class
.
getName
());
private
static
final
String
KEYGUARD_SHOWN
=
"keyguardShown"
;
@Inject
LockManager
lockManager
;
private
boolean
keyguardShown
=
false
;