2018-02-26 14:27:32 +01:00
/ * Copyright ( C ) 2015 - 2018 Andreas Shimokawa , Carsten Pfeiffer , Daniele
2018-03-22 22:47:40 +01:00
Gobbetti , Felix Konstantin Maurer , Taavi Eomäe , Uwe Hermann , Yar
2017-03-10 14:53:19 +01:00
This file is part of Gadgetbridge .
Gadgetbridge is free software : you can redistribute it and / or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation , either version 3 of the License , or
( at your option ) any later version .
Gadgetbridge is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU Affero General Public License for more details .
You should have received a copy of the GNU Affero General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>. */
2015-08-03 23:09:49 +02:00
package nodomain.freeyourgadget.gadgetbridge.util ;
2015-04-13 01:01:52 +02:00
2015-07-11 21:49:51 +02:00
import android.app.Activity ;
2015-04-13 01:01:52 +02:00
import android.app.Notification ;
2018-06-19 22:03:49 +02:00
import android.app.NotificationChannel ;
import android.app.NotificationManager ;
2015-04-13 01:01:52 +02:00
import android.app.PendingIntent ;
2015-05-07 22:15:53 +02:00
import android.bluetooth.BluetoothAdapter ;
2015-04-13 01:01:52 +02:00
import android.content.Context ;
import android.content.Intent ;
import android.content.pm.PackageManager ;
2015-07-11 21:49:51 +02:00
import android.os.Handler ;
import android.os.Looper ;
2015-08-29 20:38:53 +02:00
import android.support.annotation.Nullable ;
2015-04-13 01:01:52 +02:00
import android.support.v4.app.NotificationCompat ;
2018-02-14 21:27:24 +01:00
import android.support.v4.app.NotificationManagerCompat ;
2015-07-11 21:49:51 +02:00
import android.widget.Toast ;
2015-05-12 06:28:11 +02:00
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
2015-05-01 01:49:43 +02:00
2015-06-25 23:34:50 +02:00
import java.io.File ;
import java.io.FileOutputStream ;
import java.io.IOException ;
import java.nio.ByteBuffer ;
import java.nio.ByteOrder ;
2015-08-03 23:09:49 +02:00
import nodomain.freeyourgadget.gadgetbridge.GBApplication ;
2015-08-22 01:08:46 +02:00
import nodomain.freeyourgadget.gadgetbridge.GBEnvironment ;
2015-08-03 23:09:49 +02:00
import nodomain.freeyourgadget.gadgetbridge.R ;
2016-10-25 17:49:21 +02:00
import nodomain.freeyourgadget.gadgetbridge.activities.ControlCenterv2 ;
2018-01-07 12:50:59 +01:00
import nodomain.freeyourgadget.gadgetbridge.activities.SettingsActivity ;
2015-06-24 23:55:51 +02:00
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventScreenshot ;
2017-10-20 22:49:53 +02:00
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice ;
import nodomain.freeyourgadget.gadgetbridge.model.DeviceService ;
import nodomain.freeyourgadget.gadgetbridge.service.DeviceCommunicationService ;
2015-04-20 22:39:35 +02:00
2018-06-19 22:03:49 +02:00
import static nodomain.freeyourgadget.gadgetbridge.GBApplication.isRunningOreoOrLater ;
2015-04-13 01:01:52 +02:00
public class GB {
2018-02-14 21:27:24 +01:00
public static final String NOTIFICATION_CHANNEL_ID = " gadgetbridge " ;
2018-06-19 22:03:49 +02:00
public static final String NOTIFICATION_CHANNEL_ID_TRANSFER = " gadgetbridge transfer " ;
2018-02-14 21:27:24 +01:00
2015-04-13 01:01:52 +02:00
public static final int NOTIFICATION_ID = 1 ;
2015-07-28 23:10:21 +02:00
public static final int NOTIFICATION_ID_INSTALL = 2 ;
2015-08-18 17:37:51 +02:00
public static final int NOTIFICATION_ID_LOW_BATTERY = 3 ;
2015-09-24 14:03:01 +02:00
public static final int NOTIFICATION_ID_TRANSFER = 4 ;
2018-01-07 12:50:59 +01:00
public static final int NOTIFICATION_ID_EXPORT_FAILED = 5 ;
2015-07-28 23:10:21 +02:00
2015-05-12 06:28:11 +02:00
private static final Logger LOG = LoggerFactory . getLogger ( GB . class ) ;
2015-07-11 21:49:51 +02:00
public static final int INFO = 1 ;
public static final int WARN = 2 ;
public static final int ERROR = 3 ;
2016-04-03 00:50:45 +02:00
public static final String ACTION_DISPLAY_MESSAGE = " GB_Display_Message " ;
public static final String DISPLAY_MESSAGE_MESSAGE = " message " ;
public static final String DISPLAY_MESSAGE_DURATION = " duration " ;
public static final String DISPLAY_MESSAGE_SEVERITY = " severity " ;
2015-04-13 01:01:52 +02:00
2017-10-20 22:49:53 +02:00
private static PendingIntent getContentIntent ( Context context ) {
2016-10-25 17:49:21 +02:00
Intent notificationIntent = new Intent ( context , ControlCenterv2 . class ) ;
2015-04-13 01:01:52 +02:00
notificationIntent . setFlags ( Intent . FLAG_ACTIVITY_NEW_TASK
| Intent . FLAG_ACTIVITY_CLEAR_TASK ) ;
PendingIntent pendingIntent = PendingIntent . getActivity ( context , 0 ,
notificationIntent , 0 ) ;
2017-10-20 22:49:53 +02:00
return pendingIntent ;
}
public static Notification createNotification ( GBDevice device , Context context ) {
2017-10-30 21:37:31 +01:00
String deviceName = device . getName ( ) ;
String text = device . getStateString ( ) ;
if ( device . getBatteryLevel ( ) ! = GBDevice . BATTERY_UNKNOWN ) {
text + = " : " + context . getString ( R . string . battery ) + " " + device . getBatteryLevel ( ) + " % " ;
}
2018-09-15 23:56:44 +02:00
boolean connected = device . isInitialized ( ) ;
2018-02-14 21:27:24 +01:00
NotificationCompat . Builder builder = new NotificationCompat . Builder ( context , NOTIFICATION_CHANNEL_ID ) ;
2017-10-30 21:37:31 +01:00
builder . setContentTitle ( deviceName )
2018-01-21 02:37:17 +01:00
. setTicker ( deviceName + " - " + text )
2017-10-20 22:49:53 +02:00
. setContentText ( text )
. setSmallIcon ( connected ? R . drawable . ic_notification : R . drawable . ic_notification_disconnected )
. setContentIntent ( getContentIntent ( context ) )
2017-10-30 21:37:31 +01:00
. setColor ( context . getResources ( ) . getColor ( R . color . accent ) )
2017-10-20 22:49:53 +02:00
. setOngoing ( true ) ;
Intent deviceCommunicationServiceIntent = new Intent ( context , DeviceCommunicationService . class ) ;
if ( connected ) {
deviceCommunicationServiceIntent . setAction ( DeviceService . ACTION_DISCONNECT ) ;
2017-10-30 21:37:31 +01:00
PendingIntent disconnectPendingIntent = PendingIntent . getService ( context , 0 , deviceCommunicationServiceIntent , PendingIntent . FLAG_ONE_SHOT ) ;
2017-10-20 22:49:53 +02:00
builder . addAction ( R . drawable . ic_notification_disconnected , context . getString ( R . string . controlcenter_disconnect ) , disconnectPendingIntent ) ;
2017-11-19 16:39:44 +01:00
if ( GBApplication . isRunningLollipopOrLater ( ) & & DeviceHelper . getInstance ( ) . getCoordinator ( device ) . supportsActivityDataFetching ( ) ) { //for some reason this fails on KK
2018-03-31 16:21:25 +02:00
deviceCommunicationServiceIntent . setAction ( DeviceService . ACTION_FETCH_RECORDED_DATA ) ;
2017-10-30 21:37:31 +01:00
PendingIntent fetchPendingIntent = PendingIntent . getService ( context , 1 , deviceCommunicationServiceIntent , PendingIntent . FLAG_ONE_SHOT ) ;
2017-10-20 22:49:53 +02:00
builder . addAction ( R . drawable . ic_action_fetch_activity_data , context . getString ( R . string . controlcenter_fetch_activity_data ) , fetchPendingIntent ) ;
}
} else if ( device . getState ( ) . equals ( GBDevice . State . WAITING_FOR_RECONNECT ) | | device . getState ( ) . equals ( GBDevice . State . NOT_CONNECTED ) ) {
deviceCommunicationServiceIntent . setAction ( DeviceService . ACTION_CONNECT ) ;
deviceCommunicationServiceIntent . putExtra ( GBDevice . EXTRA_DEVICE , device ) ;
2017-10-30 21:37:31 +01:00
PendingIntent reconnectPendingIntent = PendingIntent . getService ( context , 2 , deviceCommunicationServiceIntent , PendingIntent . FLAG_UPDATE_CURRENT ) ;
2017-10-20 22:49:53 +02:00
builder . addAction ( R . drawable . ic_notification , context . getString ( R . string . controlcenter_connect ) , reconnectPendingIntent ) ;
}
if ( GBApplication . isRunningLollipopOrLater ( ) ) {
builder . setVisibility ( NotificationCompat . VISIBILITY_PUBLIC ) ;
}
if ( GBApplication . minimizeNotification ( ) ) {
builder . setPriority ( Notification . PRIORITY_MIN ) ;
}
return builder . build ( ) ;
}
2017-10-30 21:37:31 +01:00
public static Notification createNotification ( String text , Context context ) {
2018-02-14 21:27:24 +01:00
NotificationCompat . Builder builder = new NotificationCompat . Builder ( context , NOTIFICATION_CHANNEL_ID ) ;
2017-10-30 21:37:31 +01:00
builder . setTicker ( text )
2015-04-13 01:01:52 +02:00
. setContentText ( text )
2017-10-30 21:37:31 +01:00
. setSmallIcon ( R . drawable . ic_notification_disconnected )
2017-10-20 22:49:53 +02:00
. setContentIntent ( getContentIntent ( context ) )
2017-11-19 16:39:44 +01:00
. setColor ( context . getResources ( ) . getColor ( R . color . accent ) )
2015-12-07 23:08:24 +01:00
. setOngoing ( true ) ;
2017-10-30 21:37:31 +01:00
if ( GBApplication . getPrefs ( ) . getString ( " last_device_address " , null ) ! = null ) {
Intent deviceCommunicationServiceIntent = new Intent ( context , DeviceCommunicationService . class ) ;
deviceCommunicationServiceIntent . setAction ( DeviceService . ACTION_CONNECT ) ;
PendingIntent reconnectPendingIntent = PendingIntent . getService ( context , 2 , deviceCommunicationServiceIntent , PendingIntent . FLAG_ONE_SHOT ) ;
builder . addAction ( R . drawable . ic_notification , context . getString ( R . string . controlcenter_connect ) , reconnectPendingIntent ) ;
}
2015-12-07 23:08:24 +01:00
if ( GBApplication . isRunningLollipopOrLater ( ) ) {
2017-05-28 18:50:41 +02:00
builder . setVisibility ( NotificationCompat . VISIBILITY_PUBLIC ) ;
2015-12-07 23:08:24 +01:00
}
2017-01-08 15:51:56 +01:00
if ( GBApplication . minimizeNotification ( ) ) {
builder . setPriority ( Notification . PRIORITY_MIN ) ;
}
2015-12-07 23:08:24 +01:00
return builder . build ( ) ;
2015-04-13 01:01:52 +02:00
}
2017-10-20 22:49:53 +02:00
public static void updateNotification ( GBDevice device , Context context ) {
Notification notification = createNotification ( device , context ) ;
2015-08-29 20:38:53 +02:00
updateNotification ( notification , NOTIFICATION_ID , context ) ;
}
2015-04-13 01:01:52 +02:00
2015-08-29 20:38:53 +02:00
private static void updateNotification ( @Nullable Notification notification , int id , Context context ) {
if ( notification = = null ) {
return ;
}
2018-02-14 21:27:24 +01:00
// TODO: I believe it's better do always use the NMC instead of the old call, but old code works
NotificationManagerCompat nm = NotificationManagerCompat . from ( context ) ;
// NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
2015-08-29 20:38:53 +02:00
nm . notify ( id , notification ) ;
2015-04-13 01:01:52 +02:00
}
2015-09-24 14:03:01 +02:00
private static void removeNotification ( int id , Context context ) {
2018-02-14 21:27:24 +01:00
// TODO: I believe it's better do always use the NMC instead of the old call, but old code works
NotificationManagerCompat nm = NotificationManagerCompat . from ( context ) ;
// NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
2015-09-24 14:03:01 +02:00
nm . cancel ( id ) ;
}
2015-08-03 23:09:49 +02:00
public static boolean isBluetoothEnabled ( ) {
2015-05-07 22:15:53 +02:00
BluetoothAdapter adapter = BluetoothAdapter . getDefaultAdapter ( ) ;
return adapter ! = null & & adapter . isEnabled ( ) ;
}
2015-05-09 23:54:47 +02:00
public static boolean supportsBluetoothLE ( ) {
return GBApplication . getContext ( ) . getPackageManager ( ) . hasSystemFeature ( PackageManager . FEATURE_BLUETOOTH_LE ) ;
}
2015-04-26 00:53:48 +02:00
public static String hexdump ( byte [ ] buffer , int offset , int length ) {
2015-06-24 23:55:51 +02:00
if ( length = = - 1 ) {
2015-10-04 15:42:21 +02:00
length = buffer . length - offset ;
2015-06-16 23:14:51 +02:00
}
2015-04-25 23:13:22 +02:00
final char [ ] hexArray = " 0123456789ABCDEF " . toCharArray ( ) ;
char [ ] hexChars = new char [ length * 2 ] ;
2015-04-26 00:53:48 +02:00
for ( int i = 0 ; i < length ; i + + ) {
int v = buffer [ i + offset ] & 0xFF ;
hexChars [ i * 2 ] = hexArray [ v > > > 4 ] ;
hexChars [ i * 2 + 1 ] = hexArray [ v & 0x0F ] ;
2015-04-25 23:13:22 +02:00
}
return new String ( hexChars ) ;
}
2015-05-05 00:48:02 +02:00
public static String formatRssi ( short rssi ) {
return String . valueOf ( rssi ) ;
}
2015-06-24 23:55:51 +02:00
2015-10-28 23:54:08 +01:00
public static String writeScreenshot ( GBDeviceEventScreenshot screenshot , String filename ) throws IOException {
2015-06-25 23:34:50 +02:00
LOG . info ( " Will write screenshot: " + screenshot . width + " x " + screenshot . height + " x " + screenshot . bpp + " bpp " ) ;
final int FILE_HEADER_SIZE = 14 ;
final int INFO_HEADER_SIZE = 40 ;
2015-10-28 23:54:08 +01:00
File dir = FileUtils . getExternalFilesDir ( ) ;
File outputFile = new File ( dir , filename ) ;
try ( FileOutputStream fos = new FileOutputStream ( outputFile ) ) {
2015-06-29 22:38:37 +02:00
ByteBuffer headerbuf = ByteBuffer . allocate ( FILE_HEADER_SIZE + INFO_HEADER_SIZE + screenshot . clut . length ) ;
headerbuf . order ( ByteOrder . LITTLE_ENDIAN ) ;
// file header
headerbuf . put ( ( byte ) 'B' ) ;
headerbuf . put ( ( byte ) 'M' ) ;
2016-12-01 20:18:36 +01:00
headerbuf . putInt ( 0 ) ; // size in bytes (uncompressed = 0)
2015-06-29 22:38:37 +02:00
headerbuf . putInt ( 0 ) ; // reserved
headerbuf . putInt ( FILE_HEADER_SIZE + INFO_HEADER_SIZE + screenshot . clut . length ) ;
// info header
headerbuf . putInt ( INFO_HEADER_SIZE ) ;
headerbuf . putInt ( screenshot . width ) ;
headerbuf . putInt ( - screenshot . height ) ;
headerbuf . putShort ( ( short ) 1 ) ; // planes
2015-08-22 00:14:14 +02:00
headerbuf . putShort ( ( short ) screenshot . bpp ) ;
2015-06-29 22:38:37 +02:00
headerbuf . putInt ( 0 ) ; // compression
2016-12-01 20:18:36 +01:00
headerbuf . putInt ( 0 ) ; // length of pixeldata in bytes (uncompressed=0)
2015-06-29 22:38:37 +02:00
headerbuf . putInt ( 0 ) ; // pixels per meter (x)
headerbuf . putInt ( 0 ) ; // pixels per meter (y)
2015-08-22 00:14:14 +02:00
headerbuf . putInt ( screenshot . clut . length / 4 ) ; // number of colors in CLUT
headerbuf . putInt ( 0 ) ; // numbers of used colors
2015-06-29 22:38:37 +02:00
headerbuf . put ( screenshot . clut ) ;
2015-06-25 23:34:50 +02:00
fos . write ( headerbuf . array ( ) ) ;
2015-08-22 00:14:14 +02:00
int rowbytes = ( screenshot . width * screenshot . bpp ) / 8 ;
2015-06-25 23:34:50 +02:00
byte [ ] pad = new byte [ rowbytes % 4 ] ;
for ( int i = 0 ; i < screenshot . height ; i + + ) {
fos . write ( screenshot . data , rowbytes * i , rowbytes ) ;
fos . write ( pad ) ;
}
}
2015-10-28 23:54:08 +01:00
return outputFile . getAbsolutePath ( ) ;
2015-06-24 23:55:51 +02:00
}
2015-07-11 21:49:51 +02:00
/ * *
* Creates and display a Toast message using the application context .
* Additionally the toast is logged using the provided severity .
* Can be called from any thread .
2015-07-25 21:52:52 +02:00
*
* @param message the message to display .
2015-07-11 21:49:51 +02:00
* @param displayTime something like Toast . LENGTH_SHORT
2015-07-25 21:52:52 +02:00
* @param severity either INFO , WARNING , ERROR
2015-07-11 21:49:51 +02:00
* /
public static void toast ( String message , int displayTime , int severity ) {
toast ( GBApplication . getContext ( ) , message , displayTime , severity , null ) ;
}
/ * *
* Creates and display a Toast message using the application context .
* Additionally the toast is logged using the provided severity .
* Can be called from any thread .
2015-07-25 21:52:52 +02:00
*
* @param message the message to display .
2015-07-11 21:49:51 +02:00
* @param displayTime something like Toast . LENGTH_SHORT
2015-07-25 21:52:52 +02:00
* @param severity either INFO , WARNING , ERROR
2015-07-11 21:49:51 +02:00
* /
public static void toast ( String message , int displayTime , int severity , Throwable ex ) {
toast ( GBApplication . getContext ( ) , message , displayTime , severity , ex ) ;
}
/ * *
* Creates and display a Toast message using the application context
* Can be called from any thread .
2015-07-25 21:52:52 +02:00
*
* @param context the context to use
* @param message the message to display
2015-07-11 21:49:51 +02:00
* @param displayTime something like Toast . LENGTH_SHORT
2015-07-25 21:52:52 +02:00
* @param severity either INFO , WARNING , ERROR
2015-07-11 21:49:51 +02:00
* /
public static void toast ( final Context context , final String message , final int displayTime , final int severity ) {
2015-07-25 21:52:52 +02:00
toast ( context , message , displayTime , severity , null ) ;
2015-07-11 21:49:51 +02:00
}
/ * *
* Creates and display a Toast message using the application context
* Can be called from any thread .
2015-07-25 21:52:52 +02:00
*
* @param context the context to use
* @param message the message to display
2015-07-11 21:49:51 +02:00
* @param displayTime something like Toast . LENGTH_SHORT
2015-07-25 21:52:52 +02:00
* @param severity either INFO , WARNING , ERROR
* @param ex optional exception to be logged
2015-07-11 21:49:51 +02:00
* /
public static void toast ( final Context context , final String message , final int displayTime , final int severity , final Throwable ex ) {
2016-02-24 23:53:30 +01:00
log ( message , severity , ex ) ; // log immediately, not delayed
2017-04-25 21:51:53 +02:00
if ( GBEnvironment . env ( ) . isLocalTest ( ) ) {
2015-08-22 01:08:46 +02:00
return ;
}
2015-07-11 21:49:51 +02:00
Looper mainLooper = Looper . getMainLooper ( ) ;
if ( Thread . currentThread ( ) = = mainLooper . getThread ( ) ) {
Toast . makeText ( context , message , displayTime ) . show ( ) ;
} else {
Runnable runnable = new Runnable ( ) {
@Override
public void run ( ) {
Toast . makeText ( context , message , displayTime ) . show ( ) ;
}
} ;
if ( context instanceof Activity ) {
( ( Activity ) context ) . runOnUiThread ( runnable ) ;
} else {
new Handler ( mainLooper ) . post ( runnable ) ;
}
}
}
2016-04-03 00:50:45 +02:00
public static void log ( String message , int severity , Throwable ex ) {
2015-07-11 21:49:51 +02:00
switch ( severity ) {
case INFO :
LOG . info ( message , ex ) ;
break ;
case WARN :
LOG . warn ( message , ex ) ;
break ;
case ERROR :
LOG . error ( message , ex ) ;
break ;
}
}
2015-07-20 23:11:16 +02:00
2018-06-19 22:03:49 +02:00
private static Notification createTransferNotification ( String title , String text , boolean ongoing ,
2015-09-24 14:03:01 +02:00
int percentage , Context context ) {
2016-10-25 17:49:21 +02:00
Intent notificationIntent = new Intent ( context , ControlCenterv2 . class ) ;
2018-06-19 22:03:49 +02:00
NotificationManager notificationManager = ( NotificationManager ) context . getSystemService ( Context . NOTIFICATION_SERVICE ) ;
if ( isRunningOreoOrLater ( ) ) {
NotificationChannel channel = notificationManager . getNotificationChannel ( NOTIFICATION_CHANNEL_ID_TRANSFER ) ;
if ( channel = = null ) {
channel = new NotificationChannel ( NOTIFICATION_CHANNEL_ID_TRANSFER ,
context . getString ( R . string . notification_channel_name ) ,
NotificationManager . IMPORTANCE_LOW ) ;
notificationManager . createNotificationChannel ( channel ) ;
}
}
2015-09-24 14:03:01 +02:00
notificationIntent . setFlags ( Intent . FLAG_ACTIVITY_NEW_TASK
| Intent . FLAG_ACTIVITY_CLEAR_TASK ) ;
PendingIntent pendingIntent = PendingIntent . getActivity ( context , 0 ,
notificationIntent , 0 ) ;
2018-06-19 22:03:49 +02:00
NotificationCompat . Builder nb = new NotificationCompat . Builder ( context , NOTIFICATION_CHANNEL_ID_TRANSFER )
. setTicker ( ( title = = null ) ? context . getString ( R . string . app_name ) : title )
2017-05-28 18:50:41 +02:00
. setVisibility ( NotificationCompat . VISIBILITY_PUBLIC )
2018-06-19 22:03:49 +02:00
. setContentTitle ( ( title = = null ) ? context . getString ( R . string . app_name ) : title )
. setStyle ( new NotificationCompat . BigTextStyle ( ) . bigText ( text ) )
2015-09-24 14:03:01 +02:00
. setContentText ( text )
. setContentIntent ( pendingIntent )
. setOngoing ( ongoing ) ;
if ( ongoing ) {
nb . setProgress ( 100 , percentage , percentage = = 0 ) ;
nb . setSmallIcon ( android . R . drawable . stat_sys_download ) ;
} else {
nb . setProgress ( 0 , 0 , false ) ;
nb . setSmallIcon ( android . R . drawable . stat_sys_download_done ) ;
}
return nb . build ( ) ;
}
2015-12-07 23:33:32 +01:00
public static void removeAllNotifications ( Context context ) {
removeNotification ( NOTIFICATION_ID_TRANSFER , context ) ;
removeNotification ( NOTIFICATION_ID_INSTALL , context ) ;
removeNotification ( NOTIFICATION_ID_LOW_BATTERY , context ) ;
}
2018-06-19 22:03:49 +02:00
public static void updateTransferNotification ( String title , String text , boolean ongoing , int percentage , Context context ) {
2015-09-25 00:53:40 +02:00
if ( percentage = = 100 ) {
2015-09-24 14:03:01 +02:00
removeNotification ( NOTIFICATION_ID_TRANSFER , context ) ;
} else {
2018-06-19 22:03:49 +02:00
Notification notification = createTransferNotification ( title , text , ongoing , percentage , context ) ;
2015-09-24 14:03:01 +02:00
updateNotification ( notification , NOTIFICATION_ID_TRANSFER , context ) ;
}
}
2015-07-28 18:44:54 +02:00
private static Notification createInstallNotification ( String text , boolean ongoing ,
2015-07-28 23:10:21 +02:00
int percentage , Context context ) {
2016-10-25 17:49:21 +02:00
Intent notificationIntent = new Intent ( context , ControlCenterv2 . class ) ;
2015-07-28 18:44:54 +02:00
notificationIntent . setFlags ( Intent . FLAG_ACTIVITY_NEW_TASK
| Intent . FLAG_ACTIVITY_CLEAR_TASK ) ;
PendingIntent pendingIntent = PendingIntent . getActivity ( context , 0 ,
notificationIntent , 0 ) ;
2018-02-14 21:27:24 +01:00
NotificationCompat . Builder nb = new NotificationCompat . Builder ( context , NOTIFICATION_CHANNEL_ID )
2015-07-28 18:44:54 +02:00
. setContentTitle ( context . getString ( R . string . app_name ) )
. setContentText ( text )
. setTicker ( text )
. setContentIntent ( pendingIntent )
. setOngoing ( ongoing ) ;
if ( ongoing ) {
nb . setProgress ( 100 , percentage , percentage = = 0 ) ;
2015-07-28 23:10:21 +02:00
nb . setSmallIcon ( android . R . drawable . stat_sys_upload ) ;
} else {
nb . setSmallIcon ( android . R . drawable . stat_sys_upload_done ) ;
2015-07-28 18:44:54 +02:00
}
return nb . build ( ) ;
}
public static void updateInstallNotification ( String text , boolean ongoing , int percentage , Context context ) {
Notification notification = createInstallNotification ( text , ongoing , percentage , context ) ;
2015-08-29 20:38:53 +02:00
updateNotification ( notification , NOTIFICATION_ID_INSTALL , context ) ;
2015-07-28 18:44:54 +02:00
}
2015-08-18 17:37:51 +02:00
2015-08-19 17:36:53 +02:00
private static Notification createBatteryNotification ( String text , String bigText , Context context ) {
2016-10-25 17:49:21 +02:00
Intent notificationIntent = new Intent ( context , ControlCenterv2 . class ) ;
2015-08-18 17:37:51 +02:00
notificationIntent . setFlags ( Intent . FLAG_ACTIVITY_NEW_TASK
| Intent . FLAG_ACTIVITY_CLEAR_TASK ) ;
PendingIntent pendingIntent = PendingIntent . getActivity ( context , 0 ,
notificationIntent , 0 ) ;
2018-02-14 21:27:24 +01:00
NotificationCompat . Builder nb = new NotificationCompat . Builder ( context , NOTIFICATION_CHANNEL_ID )
2015-09-24 14:45:21 +02:00
. setContentTitle ( context . getString ( R . string . notif_battery_low_title ) )
2015-08-19 17:36:53 +02:00
. setContentText ( text )
2015-08-18 17:37:51 +02:00
. setContentIntent ( pendingIntent )
2015-08-19 17:36:53 +02:00
. setSmallIcon ( R . drawable . ic_notification_low_battery )
2015-08-29 20:38:53 +02:00
. setPriority ( Notification . PRIORITY_HIGH )
2015-08-18 17:37:51 +02:00
. setOngoing ( false ) ;
2015-08-19 17:36:53 +02:00
if ( bigText ! = null ) {
nb . setStyle ( new NotificationCompat . BigTextStyle ( ) . bigText ( bigText ) ) ;
}
2015-08-18 17:37:51 +02:00
return nb . build ( ) ;
}
2015-08-19 17:36:53 +02:00
public static void updateBatteryNotification ( String text , String bigText , Context context ) {
2017-04-25 21:51:53 +02:00
if ( GBEnvironment . env ( ) . isLocalTest ( ) ) {
2015-08-29 20:38:53 +02:00
return ;
}
2015-08-19 17:36:53 +02:00
Notification notification = createBatteryNotification ( text , bigText , context ) ;
2015-08-29 20:38:53 +02:00
updateNotification ( notification , NOTIFICATION_ID_LOW_BATTERY , context ) ;
2015-08-18 17:37:51 +02:00
}
2015-08-24 17:48:17 +02:00
2017-04-24 09:53:48 +02:00
public static void removeBatteryNotification ( Context context ) {
removeNotification ( NOTIFICATION_ID_LOW_BATTERY , context ) ;
}
2018-01-07 12:50:59 +01:00
public static Notification createExportFailedNotification ( String text , Context context ) {
Intent notificationIntent = new Intent ( context , SettingsActivity . class ) ;
notificationIntent . setFlags ( Intent . FLAG_ACTIVITY_NEW_TASK
| Intent . FLAG_ACTIVITY_CLEAR_TASK ) ;
PendingIntent pendingIntent = PendingIntent . getActivity ( context , 0 ,
notificationIntent , 0 ) ;
2018-02-14 21:27:24 +01:00
NotificationCompat . Builder nb = new NotificationCompat . Builder ( context , NOTIFICATION_CHANNEL_ID )
2018-01-07 12:50:59 +01:00
. setContentTitle ( context . getString ( R . string . notif_export_failed_title ) )
. setContentText ( text )
. setContentIntent ( pendingIntent )
. setSmallIcon ( R . drawable . ic_notification )
. setPriority ( Notification . PRIORITY_HIGH )
. setOngoing ( false ) ;
return nb . build ( ) ;
}
public static void updateExportFailedNotification ( String text , Context context ) {
if ( GBEnvironment . env ( ) . isLocalTest ( ) ) {
return ;
}
Notification notification = createExportFailedNotification ( text , context ) ;
updateNotification ( notification , NOTIFICATION_ID_EXPORT_FAILED , context ) ;
}
public static void removeExportFailedNotification ( Context context ) {
removeNotification ( NOTIFICATION_ID_EXPORT_FAILED , context ) ;
}
2015-09-19 23:32:10 +02:00
public static void assertThat ( boolean condition , String errorMessage ) {
if ( ! condition ) {
throw new AssertionError ( errorMessage ) ;
}
}
2015-04-13 01:01:52 +02:00
}