Skip to content

Commit 56e20bf

Browse files
kadhar03hariramc
authored andcommitted
Merged in stage (pull request #198)
#MRN-774 Approved-by: Karthikeyan S Approved-by: Hariram Chandrasekaran
2 parents 5ad9d89 + d751ab1 commit 56e20bf

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+8673
-8271
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,6 @@ dist/
7777
mirrorfly-uikit-react-native-*.tgz
7878

7979
# zip file
80-
*.zip
80+
*.zip
81+
82+
patches/react-native-network-logger+1.16.1.patch

android/app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ android {
8282
minSdkVersion rootProject.ext.minSdkVersion
8383
targetSdkVersion rootProject.ext.targetSdkVersion
8484
versionCode 1
85-
versionName "2.4.33"
85+
versionName "2.4.37"
8686
/** Add this for react-native-camera */
8787
missingDimensionStrategy 'react-native-camera', 'general'
8888
multiDexEnabled true
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"project_info": {
3+
"project_number": "686921706810",
4+
"project_id": "thecollectiveapp-1dbc9",
5+
"storage_bucket": "thecollectiveapp-1dbc9.appspot.com"
6+
},
7+
"client": [
8+
{
9+
"client_info": {
10+
"mobilesdk_app_id": "1:686921706810:android:759989ce574808dacab403",
11+
"android_client_info": {
12+
"package_name": "com.thecollective.collective"
13+
}
14+
},
15+
"oauth_client": [],
16+
"api_key": [
17+
{
18+
"current_key": "AIzaSyA7Rv3gN-Tq3vJECbGVSiV_Rp49N6jPBD4"
19+
}
20+
],
21+
"services": {
22+
"appinvite_service": {
23+
"other_platform_oauth_client": []
24+
}
25+
}
26+
}
27+
],
28+
"configuration_version": "1"
29+
}

android/app/src/main/AndroidManifest.xml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
1+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2+
xmlns:tools="http://schemas.android.com/tools">
23

34
<uses-permission android:name="android.permission.INTERNET" />
45
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
@@ -30,6 +31,7 @@
3031
<uses-permission android:name="android.permission.BLUETOOTH" />
3132
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
3233
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
34+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
3335

3436
<uses-feature
3537
android:name="android.hardware.camera"
@@ -103,6 +105,12 @@
103105
android:supportsPictureInPicture="true"
104106
android:turnScreenOn="true"
105107
android:windowSoftInputMode="stateHidden" />
108+
<service
109+
android:name="app.notifee.core.ForegroundService"
110+
android:exported="false"
111+
android:foregroundServiceType="location|camera|microphone|phoneCall"
112+
tools:replace="android:foregroundServiceType"
113+
/>
106114
</application>
107115
<queries>
108116
<intent>

android/app/src/main/java/com/mirrorfly_rn/CallScreenActivity.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import android.content.SharedPreferences;
1010
import android.content.res.Configuration;
1111
import android.graphics.Color;
12+
import android.graphics.Rect;
1213
import android.os.Build;
1314
import android.os.Bundle;
1415
import android.os.Process;
@@ -133,7 +134,10 @@ protected void onUserLeaveHint() {
133134
PictureInPictureParams.Builder pipBuilder = null;
134135

135136
pipBuilder = new PictureInPictureParams.Builder();
137+
final Rect sourceRectHint = new Rect();
138+
getWindow().getDecorView().getGlobalVisibleRect(sourceRectHint);
136139
pipBuilder.setAspectRatio(ratio).build();
140+
pipBuilder.setSourceRectHint(sourceRectHint);
137141
CallScreenActivity.this.enterPictureInPictureMode(pipBuilder.build());
138142
}
139143
} catch (Exception e) {

android/app/src/main/java/com/mirrorfly_rn/PipAndroidModule.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.app.PictureInPictureParams;
55
import android.content.Context;
66
import android.content.Intent;
7+
import android.graphics.Rect;
78
import android.net.Uri;
89
import android.os.Build;
910
import android.os.Process;
@@ -99,7 +100,10 @@ public void enterPipMode(int width, int height, boolean shouldOpenPermissionScre
99100
PictureInPictureParams.Builder pipBuilder = null;
100101

101102
pipBuilder = new PictureInPictureParams.Builder();
103+
final Rect sourceRectHint = new Rect();
104+
this.getCurrentActivity().getWindow().getDecorView().getGlobalVisibleRect(sourceRectHint);
102105
pipBuilder.setAspectRatio(ratio).build();
106+
pipBuilder.setSourceRectHint(sourceRectHint);
103107
reactApplicationContext.getCurrentActivity().enterPictureInPictureMode(pipBuilder.build());
104108
}
105109
} else if (shouldOpenPermissionScreenIfPipNotAllowed) {

android/fastlane/Fastfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ platform :android do
5454
firebase_app_distribution(
5555
app: "1:235373697524:android:8b3becf8d8ff9be3a0c1a1",
5656
groups: "reactnative",
57-
release_notes: "React-Native android build for bug-fixes MRN-759",
57+
release_notes: "React-Native android build for feature MRN-774",
5858
apk_path: "../android/app/build/outputs/apk/release/app-release.apk",
5959
firebase_cli_token: "1//0gfTJ_oWJ0mHNCgYIARAAGBASNwF-L9IrYZM4cUIV5EB8gVnSvtMC6Q7aAtgrgG8R1ybhSY1Np_5r5UuZu28N144_weOQDyONcW4",
6060
)

index.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@
22
* @format
33
*/
44
import messaging from '@react-native-firebase/messaging';
5-
import { AppRegistry, Platform } from 'react-native';
5+
import { AppRegistry, AppState, Platform } from 'react-native';
66
import App from './App';
77
import { name as appName } from './app.json';
88
import config from './src/config/config';
9-
import { mirrorflyInitialize, mirrorflyNotificationHandler, setupCallScreen } from './src/uikitMethods';
9+
import { isPipModeEnabled } from './src/Helper/Calls/Utility';
10+
import { MIRRORFLY_RN } from './src/helpers/constants';
11+
import { mirrorflyInitialize, mirrorflyNotificationHandler, setAppConfig, setupCallScreen } from './src/uikitMethods';
12+
13+
setAppConfig({ appSchema: MIRRORFLY_RN });
1014

1115
/**
1216
// import { startNetworkLogging } from 'react-native-network-logger';
@@ -28,7 +32,7 @@ messaging().setBackgroundMessageHandler(async remoteMessage => {
2832
});
2933

3034
messaging().onMessage(async remoteMessage => {
31-
if (remoteMessage?.data.type === 'mediacall') {
35+
if (remoteMessage?.data.type === 'mediacall' || (isPipModeEnabled() && AppState.currentState === 'background')) {
3236
mirrorflyNotificationHandler(remoteMessage);
3337
}
3438
});

ios/MediaConverter.m

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#import <React/RCTBridgeModule.h>
2+
#import <Photos/Photos.h>
3+
#import <MobileCoreServices/MobileCoreServices.h>
4+
5+
@interface MediaConverter : NSObject <RCTBridgeModule>
6+
@end
7+
8+
@implementation MediaConverter
9+
10+
RCT_EXPORT_MODULE();
11+
12+
RCT_EXPORT_METHOD(convertMedia:(NSString *)uri
13+
resolver:(RCTPromiseResolveBlock)resolve
14+
rejecter:(RCTPromiseRejectBlock)reject)
15+
{
16+
if ([uri hasPrefix:@"ph://"]) {
17+
NSString *assetID = [uri stringByReplacingOccurrencesOfString:@"ph://" withString:@""];
18+
PHFetchResult<PHAsset *> *result = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetID] options:nil];
19+
20+
if (result.count == 0) {
21+
reject(@"E_PHOTO_NOT_FOUND", @"Photo not found", nil);
22+
return;
23+
}
24+
25+
PHAsset *asset = result.firstObject;
26+
27+
if (asset.mediaType == PHAssetMediaTypeImage) {
28+
// Handle image conversion
29+
[self convertImageAsset:asset resolver:resolve rejecter:reject];
30+
} else if (asset.mediaType == PHAssetMediaTypeVideo) {
31+
// Handle video conversion
32+
[self convertVideoAsset:asset resolver:resolve rejecter:reject];
33+
} else {
34+
reject(@"E_UNSUPPORTED_MEDIA_TYPE", @"Unsupported media type", nil);
35+
}
36+
} else {
37+
reject(@"E_INVALID_URI", @"Invalid URI format", nil);
38+
}
39+
}
40+
41+
- (void)convertImageAsset:(PHAsset *)asset
42+
resolver:(RCTPromiseResolveBlock)resolve
43+
rejecter:(RCTPromiseRejectBlock)reject
44+
{
45+
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
46+
options.synchronous = YES;
47+
options.networkAccessAllowed = YES;
48+
49+
[[PHImageManager defaultManager] requestImageDataAndOrientationForAsset:asset options:options resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, CGImagePropertyOrientation orientation, NSDictionary * _Nullable info) {
50+
if (imageData) {
51+
NSString *fileExtension = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)dataUTI, kUTTagClassFilenameExtension);
52+
NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", [[NSUUID UUID] UUIDString], fileExtension]];
53+
54+
NSError *error = nil;
55+
[imageData writeToFile:filePath options:NSDataWritingAtomic error:&error];
56+
57+
if (error) {
58+
reject(@"E_FILE_SAVE_FAILED", @"Failed to save image file", error);
59+
} else {
60+
resolve(filePath);
61+
}
62+
} else {
63+
reject(@"E_IMAGE_REQUEST_FAILED", @"Failed to get image data", nil);
64+
}
65+
}];
66+
}
67+
68+
- (void)convertVideoAsset:(PHAsset *)asset
69+
resolver:(RCTPromiseResolveBlock)resolve
70+
rejecter:(RCTPromiseRejectBlock)reject
71+
{
72+
PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init];
73+
options.networkAccessAllowed = YES;
74+
75+
[[PHImageManager defaultManager] requestAVAssetForVideo:asset options:options resultHandler:^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary *info) {
76+
if ([avAsset isKindOfClass:[AVURLAsset class]]) {
77+
AVURLAsset *urlAsset = (AVURLAsset *)avAsset;
78+
NSURL *url = urlAsset.URL;
79+
NSString *fileExtension = [url pathExtension];
80+
81+
NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", [[NSUUID UUID] UUIDString], fileExtension]];
82+
NSError *error = nil;
83+
[[NSFileManager defaultManager] copyItemAtURL:url toURL:[NSURL fileURLWithPath:filePath] error:&error];
84+
85+
if (error) {
86+
reject(@"E_VIDEO_SAVE_FAILED", @"Failed to save video file", error);
87+
} else {
88+
resolve(filePath);
89+
}
90+
} else {
91+
reject(@"E_VIDEO_REQUEST_FAILED", @"Failed to get video data", nil);
92+
}
93+
}];
94+
}
95+
96+
@end

0 commit comments

Comments
 (0)