diff --git a/app/build.gradle b/app/build.gradle index 1834955e15..c693aab79f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -52,7 +52,7 @@ android { applicationId "io.stormbird.wallet" minSdk 24 targetSdk 34 - versionCode 263 + versionCode 266 versionName "3.81" android.buildFeatures.buildConfig true @@ -64,13 +64,13 @@ android { def DEFAULT_INFURA_API_KEY = "\"da3717f25f824cc1baa32d812386d93f\"" def DEFAULT_OPENSEA_API_KEY = "\"...\""; //Put your OpenSea developer API key in here, otherwise you are reliant on the backup NFT fetch method (which usually works ok) def DEFAULT_POLYGONSCAN_API_KEY = "\"...\""; //Put your Polygonscan developer API key in here to get access to Polygon/Mumbai token discovery and transactions - def DEFUALT_WALLETCONNECT_PROJECT_ID = "\"40c6071febfd93f4fe485c232a8a4cd9\"" + def DEFAULT_WALLETCONNECT_PROJECT_ID = "\"40c6071febfd93f4fe485c232a8a4cd9\"" def DEFAULT_AURORA_API_KEY = "\"HFDDY5BNKGXBB82DE2G8S64C3C41B76PYI\""; //Put your Aurorascan.dev API key here - this one will rate limit as it is common buildConfigField 'int', 'DB_VERSION', '54' buildConfigField "String", XInfuraAPI, DEFAULT_INFURA_API_KEY - buildConfigField "String", "WALLETCONNECT_PROJECT_ID", DEFUALT_WALLETCONNECT_PROJECT_ID + buildConfigField "String", "WALLETCONNECT_PROJECT_ID", DEFAULT_WALLETCONNECT_PROJECT_ID buildConfigField "String", "NOTIFICATION_API_BASE_URL", NOTIFICATION_API_BASE_URL @@ -92,7 +92,7 @@ android { cFlags "-DOSKEY=" + DEFAULT_OPENSEA_API_KEY + "" cFlags "-DPSKEY=" + DEFAULT_POLYGONSCAN_API_KEY + "" cFlags "-DASKEY=" + DEFAULT_AURORA_API_KEY + "" - cFlags "-DWCKEY=" + DEFUALT_WALLETCONNECT_PROJECT_ID + "" + cFlags "-DWCKEY=" + DEFAULT_WALLETCONNECT_PROJECT_ID + "" } cmake { cFlags "-Wno-dev" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5ff288e72b..bebca4a7ce 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ - + - - - - diff --git a/app/src/main/java/com/alphawallet/app/service/WalletConnectV2Service.java b/app/src/main/java/com/alphawallet/app/service/WalletConnectV2Service.java deleted file mode 100644 index 3672524652..0000000000 --- a/app/src/main/java/com/alphawallet/app/service/WalletConnectV2Service.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.alphawallet.app.service; - -import android.app.Notification; -import android.app.NotificationChannel; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.app.Service; -import android.content.Intent; -import android.content.pm.ServiceInfo; -import android.os.Build; -import android.os.IBinder; - -import androidx.annotation.RequiresApi; -import androidx.core.app.NotificationCompat; - -import com.alphawallet.app.R; -import com.alphawallet.app.ui.WalletConnectNotificationActivity; - -import dagger.hilt.android.AndroidEntryPoint; - -@AndroidEntryPoint -public class WalletConnectV2Service extends Service -{ - private static final String TAG = WalletConnectV2Service.class.getName(); - - final String CHANNEL_ID = "WalletConnectV2Service"; - @Override - public IBinder onBind(Intent intent) - { - return null; - } - - @RequiresApi(api = Build.VERSION_CODES.O) - @Override - public void onCreate() - { - super.onCreate(); - } - - private Notification createNotification() - { - Intent notificationIntent = new Intent(this, WalletConnectNotificationActivity.class); - PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE); - - return new NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle(getString(R.string.notify_wallet_connect_title)) - .setContentText(getString(R.string.notify_wallet_connect_content)) - .setSmallIcon(R.drawable.ic_logo) - .setContentIntent(pendingIntent) - .build(); - } - - @RequiresApi(api = Build.VERSION_CODES.O) - private void createNotificationChannel() - { - CharSequence name = getString(R.string.notify_wallet_connect_title); - String description = getString(R.string.notify_wallet_connect_content); - NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, NotificationManager.IMPORTANCE_DEFAULT); - channel.setDescription(description); - NotificationManager notificationManager = getSystemService(NotificationManager.class); - notificationManager.createNotificationChannel(channel); - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) - { - createNotificationChannel(); - } - Notification notification = createNotification(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) - { - startForeground(startId, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE); - } - else - { - startForeground(startId, notification); - } - - return START_STICKY; - } - - @Override - public void onDestroy() - { - super.onDestroy(); - stopForeground(true); - } -} diff --git a/app/src/main/java/com/alphawallet/app/ui/HomeActivity.java b/app/src/main/java/com/alphawallet/app/ui/HomeActivity.java index eaf9e230fc..57d365aa22 100644 --- a/app/src/main/java/com/alphawallet/app/ui/HomeActivity.java +++ b/app/src/main/java/com/alphawallet/app/ui/HomeActivity.java @@ -931,27 +931,22 @@ private void hideDialog() } } - private boolean checkNotificationPermission(int permissionTag) + private void checkNotificationPermission(int permissionTag) { - if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) - != PackageManager.PERMISSION_GRANTED) + if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) + != PackageManager.PERMISSION_GRANTED) + { + String[] permissions; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) { - String[] permissions; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) - { - permissions = new String[]{Manifest.permission.POST_NOTIFICATIONS}; - } - else - { - permissions = new String[]{Manifest.permission.ACCESS_NOTIFICATION_POLICY}; - } - requestPermissions(permissions, permissionTag); - return false; + permissions = new String[]{Manifest.permission.POST_NOTIFICATIONS}; } else { - return true; + permissions = new String[]{Manifest.permission.ACCESS_NOTIFICATION_POLICY}; } + requestPermissions(permissions, permissionTag); + } } @Override diff --git a/app/src/main/java/com/alphawallet/app/walletconnect/AWWalletConnectClient.java b/app/src/main/java/com/alphawallet/app/walletconnect/AWWalletConnectClient.java index b41abcb580..7a60abc9f0 100644 --- a/app/src/main/java/com/alphawallet/app/walletconnect/AWWalletConnectClient.java +++ b/app/src/main/java/com/alphawallet/app/walletconnect/AWWalletConnectClient.java @@ -5,11 +5,16 @@ import static com.walletconnect.web3.wallet.client.Wallet.Model; import static com.walletconnect.web3.wallet.client.Wallet.Params; +import android.Manifest; import android.app.Activity; import android.app.Application; +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; import android.content.Context; import android.content.Intent; -import android.content.pm.ServiceInfo; +import android.content.pm.PackageManager; import android.os.Build; import android.os.Handler; import android.os.Looper; @@ -18,8 +23,12 @@ import androidx.activity.result.ActivityResultLauncher; import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; +import androidx.annotation.RequiresApi; +import androidx.core.app.ActivityCompat; +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; import androidx.lifecycle.MutableLiveData; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; import com.alphawallet.app.App; import com.alphawallet.app.C; @@ -34,7 +43,7 @@ import com.alphawallet.app.repository.KeyProviderFactory; import com.alphawallet.app.repository.PreferenceRepositoryType; import com.alphawallet.app.service.GasService; -import com.alphawallet.app.service.WalletConnectV2Service; +import com.alphawallet.app.ui.WalletConnectNotificationActivity; import com.alphawallet.app.ui.WalletConnectSessionActivity; import com.alphawallet.app.ui.WalletConnectV2Activity; import com.alphawallet.app.ui.widget.entity.ActionSheetCallback; @@ -86,6 +95,7 @@ public class AWWalletConnectClient implements Web3Wallet.WalletDelegate private boolean hasConnection; private Application application; private final PreferenceRepositoryType preferenceRepository; + private final int WC_NOTIFICATION_ID = 25964950; public AWWalletConnectClient(Context context, WalletConnectInteract walletConnectInteract, PreferenceRepositoryType preferenceRepository, GasService gasService) { @@ -270,18 +280,13 @@ private void updateService(List items) { try { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) + if (items.isEmpty()) { - if (items.isEmpty()) - { - context.stopService(new Intent(context, WalletConnectV2Service.class)); - //now signal - } - else - { - Intent serviceIntent = new Intent(context, WalletConnectV2Service.class); - ContextCompat.startForegroundService(context, serviceIntent); - } + removeNotification(); + } + else + { + displayNotification(); } } catch (Exception e) @@ -291,6 +296,63 @@ private void updateService(List items) } } + public void displayNotification() + { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) + { + createNotificationChannel(); + } + Notification notification = createNotification(); + + // Issue the notification if we have user permission + NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); + if (ActivityCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) + { + notificationManager.notify(WC_NOTIFICATION_ID, notification); + } + else + { + Intent intent = new Intent(C.REQUEST_NOTIFICATION_ACCESS); + LocalBroadcastManager.getInstance(context).sendBroadcast(intent); + } + } + + final String CHANNEL_ID = "WalletConnectV2Service"; + private Notification createNotification() + { + Intent notificationIntent = new Intent(context, WalletConnectNotificationActivity.class); + PendingIntent pendingIntent = PendingIntent.getActivity(context, WC_NOTIFICATION_ID, notificationIntent, PendingIntent.FLAG_IMMUTABLE); + + return new NotificationCompat.Builder(context, CHANNEL_ID) + .setContentTitle(context.getString(R.string.notify_wallet_connect_title)) + .setContentText(context.getString(R.string.notify_wallet_connect_content)) + .setSmallIcon(R.drawable.ic_logo) + .setContentIntent(pendingIntent) + .setPriority(NotificationCompat.PRIORITY_DEFAULT) + .build(); + } + + @RequiresApi(api = Build.VERSION_CODES.O) + private void createNotificationChannel() + { + CharSequence name = context.getString(R.string.notify_wallet_connect_title); + String description = context.getString(R.string.notify_wallet_connect_content); + NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, NotificationManager.IMPORTANCE_DEFAULT); + channel.setDescription(description); + NotificationManager notificationManager = context.getSystemService(NotificationManager.class); + notificationManager.createNotificationChannel(channel); + } + + //remove notification + private void removeNotification() + { + NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); + if (ActivityCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) + { + notificationManager.cancel(WC_NOTIFICATION_ID); + } + } + public void reject(Model.SessionProposal sessionProposal, WalletConnectV2Callback callback) {