Commit b72847bb authored by alep's avatar alep

merge with master

parents 94f91fc0 c6c3917f
This diff is collapsed.
...@@ -23,8 +23,8 @@ class IncomingCallService : CallScreeningService() { ...@@ -23,8 +23,8 @@ class IncomingCallService : CallScreeningService() {
// Lookup VIPs // Lookup VIPs
// val prefs = getSharedPreferences("WhoscallPrefs", MODE_PRIVATE) // val prefs = getSharedPreferences("WhoscallPrefs", MODE_PRIVATE)
val vipNumber = "+60108222562" val vipNumber = "+60164034061"
val vipName = "Arvin" val vipName = "Alyp"
Log.d("IncomingCallReceiver", "Looking up number: $number, Found VIPNumber: $vipNumber, Found VIPName: $vipName") Log.d("IncomingCallReceiver", "Looking up number: $number, Found VIPNumber: $vipNumber, Found VIPName: $vipName")
// Only show overlay if VIP // Only show overlay if VIP
......
...@@ -8,6 +8,7 @@ import android.provider.Settings ...@@ -8,6 +8,7 @@ import android.provider.Settings
import android.app.role.RoleManager import android.app.role.RoleManager
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import com.facebook.react.ReactActivity import com.facebook.react.ReactActivity
import android.os.Bundle
class MainActivity : ReactActivity() { class MainActivity : ReactActivity() {
...@@ -35,11 +36,24 @@ class MainActivity : ReactActivity() { ...@@ -35,11 +36,24 @@ class MainActivity : ReactActivity() {
private fun requestCallScreeningRoleIfNeeded() { private fun requestCallScreeningRoleIfNeeded() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val roleManager = getSystemService(Context.ROLE_SERVICE) as RoleManager val roleManager = getSystemService(Context.ROLE_SERVICE) as RoleManager
val intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_CALL_SCREENING) if (!roleManager.isRoleHeld(RoleManager.ROLE_CALL_SCREENING)) {
roleLauncher.launch(intent) val intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_CALL_SCREENING)
roleLauncher.launch(intent)
}
} }
} }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Ask for overlay if needed
requestOverlay()
// Ask for call screening role if needed
requestCallScreeningRoleIfNeeded()
}
private fun simulateVipCall() { private fun simulateVipCall() {
val vipNumber = "+60189884118" val vipNumber = "+60189884118"
val vipName = "Wei Yi" val vipName = "Wei Yi"
......
// OverlayPermissionModule.kt
package com.whoscall package com.whoscall
import android.content.Intent import com.facebook.react.bridge.ReactApplicationContext
import android.net.Uri import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod
import com.facebook.react.bridge.Promise
import android.os.Build import android.os.Build
import android.provider.Settings import android.provider.Settings
import com.facebook.react.bridge.*
class OverlayPermissionModule(private val reactContext: ReactApplicationContext) class OverlayPermissionModule(reactContext: ReactApplicationContext) :
: ReactContextBaseJavaModule(reactContext) { ReactContextBaseJavaModule(reactContext) {
override fun getName(): String = "OverlayPermission" override fun getName(): String {
return "OverlayPermission"
@ReactMethod
fun hasOverlayPermission(promise: Promise) {
try {
val allowed = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Settings.canDrawOverlays(reactContext)
} else true
promise.resolve(allowed)
} catch (e: Exception) {
promise.reject("OVERLAY_CHECK_ERROR", e)
} }
}
@ReactMethod @ReactMethod
fun openOverlaySettings() { fun hasPermission(promise: Promise) {
try { val canDraw = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val ctx = reactContext.currentActivity ?: reactContext Settings.canDrawOverlays(reactApplicationContext)
val intent = Intent( } else {
Settings.ACTION_MANAGE_OVERLAY_PERMISSION, true
Uri.parse("package:${reactContext.packageName}") }
).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) promise.resolve(canDraw)
ctx.startActivity(intent) }
} catch (_: Exception) {
// best-effort
}
}
} }
...@@ -366,6 +366,7 @@ ...@@ -366,6 +366,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = SLK4N5KC2N;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = whoscall/Info.plist; INFOPLIST_FILE = whoscall/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.1; IPHONEOS_DEPLOYMENT_TARGET = 15.1;
...@@ -379,7 +380,7 @@ ...@@ -379,7 +380,7 @@
"-ObjC", "-ObjC",
"-lc++", "-lc++",
); );
PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_BUNDLE_IDENTIFIER = com.whoscall;
PRODUCT_NAME = whoscall; PRODUCT_NAME = whoscall;
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
...@@ -394,6 +395,7 @@ ...@@ -394,6 +395,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = SLK4N5KC2N;
INFOPLIST_FILE = whoscall/Info.plist; INFOPLIST_FILE = whoscall/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.1; IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
...@@ -406,7 +408,7 @@ ...@@ -406,7 +408,7 @@
"-ObjC", "-ObjC",
"-lc++", "-lc++",
); );
PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_BUNDLE_IDENTIFIER = com.whoscall;
PRODUCT_NAME = whoscall; PRODUCT_NAME = whoscall;
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
...@@ -427,6 +429,7 @@ ...@@ -427,6 +429,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = dwarf; DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = SLK4N5KC2N;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17; GCC_C_LANGUAGE_STANDARD = gnu17;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
...@@ -443,7 +446,7 @@ ...@@ -443,7 +446,7 @@
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.reactjs.native.example.whoscall.whoscallDirectoryExtension; PRODUCT_BUNDLE_IDENTIFIER = com.whoscall.whoscallDirectoryExtension;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
...@@ -469,6 +472,7 @@ ...@@ -469,6 +472,7 @@
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = SLK4N5KC2N;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17; GCC_C_LANGUAGE_STANDARD = gnu17;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
...@@ -484,7 +488,7 @@ ...@@ -484,7 +488,7 @@
LOCALIZATION_PREFERS_STRING_CATALOGS = YES; LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.reactjs.native.example.whoscall.whoscallDirectoryExtension; PRODUCT_BUNDLE_IDENTIFIER = com.whoscall.whoscallDirectoryExtension;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
SWIFT_COMPILATION_MODE = wholemodule; SWIFT_COMPILATION_MODE = wholemodule;
......
#if os(iOS) #if os(iOS)
#if os(iOS)
import Foundation import Foundation
import CallKit import CallKit
...@@ -19,10 +20,7 @@ class CallDirectoryHandler: CXCallDirectoryProvider { ...@@ -19,10 +20,7 @@ class CallDirectoryHandler: CXCallDirectoryProvider {
// Example: add VIP numbers // Example: add VIP numbers
// Numbers must be E.164 format (+60 for Malaysia) // Numbers must be E.164 format (+60 for Malaysia)
let vipNumbers: [(number: Int64, label: String)] = [ let vipNumbers: [(number: Int64, label: String)] = [
(60189884118, "Wei Yi"), (60189884118, "Wei Han"),
(60123456789, "Spam Caller"),
(60122553372, "Someone Else"),
(60123456789, "Scam Caller"),
] ]
for entry in vipNumbers { for entry in vipNumbers {
...@@ -50,3 +48,4 @@ extension CallDirectoryHandler: CXCallDirectoryExtensionContextDelegate { ...@@ -50,3 +48,4 @@ extension CallDirectoryHandler: CXCallDirectoryExtensionContextDelegate {
} }
} }
#endif #endif
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment