Skip to content

Commit

Permalink
feat: sample app updated
Browse files Browse the repository at this point in the history
  • Loading branch information
shubhamguptadream11 committed Nov 14, 2024
1 parent 1c26a6d commit 60ac11d
Show file tree
Hide file tree
Showing 9 changed files with 160 additions and 40 deletions.
7 changes: 6 additions & 1 deletion android/src/main/java/com/performancetracker/DrawEndEvent.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import com.facebook.react.bridge.WritableMap
import com.facebook.react.uimanager.events.Event
import com.facebook.react.uimanager.events.RCTEventEmitter

class DrawEndEvent(viewTag: Int, private val tagName: String, private val drawTime: Double, private val renderTime: Double) : Event<DrawEndEvent>(viewTag) {
class DrawEndEvent(viewTag: Int, private val tagName: String, private val drawTime: Double, private val renderTime: Double, private val diffTime: Double?) : Event<DrawEndEvent>(viewTag) {

override fun getEventName(): String {
return EVENT_NAME
Expand All @@ -24,6 +24,11 @@ class DrawEndEvent(viewTag: Int, private val tagName: String, private val drawT
eventData.putString("tagName", tagName)
eventData.putDouble("drawTime", drawTime)
eventData.putDouble("renderTime", renderTime)
if (diffTime != null) {
eventData.putDouble("diffTime", diffTime)
} else {
eventData.putNull("diffTime") // Explicitly set null if diffTime is null
}
return eventData
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,16 @@ object PerformanceTrackerStore {
return eventSequence.any { it["tagName"] == tagName }
}

fun getEventValue(tagName: String): Any? {
for (i in eventSequence.size - 1 downTo 0) {
val event = eventSequence[i]
if (event["tagName"] == tagName) {
return event["timestamp"]
}
}
return null
}

override fun toString(): String {
return eventSequence.joinToString(
prefix = "[ ",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class PerformanceTrackerView(context: Context) : ReactViewGroup(context) {
var tagName: String = ""
var eventTimeStamp = 0.0
var isTrackingEnabled = true;
var startMarker = "";

override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
Expand All @@ -18,11 +19,18 @@ class PerformanceTrackerView(context: Context) : ReactViewGroup(context) {
val reactContext: ReactContext = context as ReactContext
val reactTag: Int = id

var diffTime: Double? = null;
val time = System.currentTimeMillis().toDouble()

if (startMarker != "") {
val startTime = PerformanceTrackerStore.getEventValue(startMarker) as Double
diffTime = time - startTime;
}

PerformanceTrackerStore.addEvent(tagName, time)
val renderTime = time - eventTimeStamp
UIManagerHelper.getEventDispatcherForReactTag(reactContext, reactTag)
?.dispatchEvent(DrawEndEvent(reactTag, tagName, time, renderTime))
?.dispatchEvent(DrawEndEvent(reactTag, tagName, time, renderTime, diffTime))

PerformanceTrackerWriter.writeLogsInFile(tagName, time.toString(), context)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ class PerformanceTrackerViewImpl {
view.eventTimeStamp = value
}

fun setStartMarker(view: PerformanceTrackerView, value: String?) {
view.startMarker = value ?: ""
}

companion object {
const val NAME = "PerformanceTrackerView"
}
Expand Down
7 changes: 7 additions & 0 deletions android/src/newarch/PerformanceTrackerViewManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,13 @@ class PerformanceTrackerViewManager :
}
}

@ReactProp(name = "startMarker")
override fun setStartMarker(view: PerformanceTrackerView?, value: String?) {
if (view != null) {
performanceTrackerViewImpl.setStartMarker(view, value)
}
}

override fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Any>? {
val baseEventTypeConstants: Map<String, Any>? =
super.getExportedCustomDirectEventTypeConstants()
Expand Down
7 changes: 7 additions & 0 deletions android/src/oldarch/PerformanceTrackerViewManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,13 @@ class PerformanceTrackerViewManager : ViewGroupManager<PerformanceTrackerView>()
performanceTrackerViewImpl.setEventTimeStamp(view, value)
}

@ReactProp(name = "startMarker")
fun setStartMarker(view: PerformanceTrackerView?, value: String?) {
if (view != null) {
performanceTrackerViewImpl.setStartMarker(view, value)
}
}

override fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Any>? {
val baseEventTypeConstants: Map<String, Any>? =
super.getExportedCustomDirectEventTypeConstants()
Expand Down
2 changes: 1 addition & 1 deletion example/android/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
# your application. You should enable this flag either if you want
# to write custom TurboModules/Fabric components OR use libraries that
# are providing them.
newArchEnabled=true
newArchEnabled=false

# Use this property to enable or disable the Hermes JS engine.
# If set to false, you will be using JSC instead.
Expand Down
151 changes: 114 additions & 37 deletions example/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,52 +1,126 @@
import { useState } from 'react';
import { StyleSheet, Text, View, Button } from 'react-native';
import { useEffect, useState } from 'react';
import {
StyleSheet,
Text,
View,
Button,
FlatList,
SafeAreaView,
StatusBar,
Platform,
} from 'react-native';
import { PerformanceTracker } from 'react-native-performance-tracker';

PerformanceTracker.init({
persistToFile: false,
});

export default function App() {
const [showPTView, setShowPTView] = useState(false);
const [res, _] = useState(0);
interface ItemProps {
index: number;
}

const ItemCard = ({ index }: ItemProps) => {
const [endMarkers, setEndMarkers] = useState({
drawTime: '',
renderTime: '',
diffTime: '',
});

const isEnabled = index === 0 || index === 1;
return (
<PerformanceTracker
isEnabled={isEnabled}
startMarker="Screen_Mount"
tagName={`Item-${index}`}
eventTimeStamp={Date.now()}
style={{

Check warning on line 36 in example/src/App.tsx

View workflow job for this annotation

GitHub Actions / lint

Inline style: { margin: 20 }
margin: 20,
}}
onDrawEnd={({ nativeEvent }) => {
setEndMarkers({
drawTime: nativeEvent.drawTime.toString(),
renderTime: nativeEvent.renderTime.toString(),
diffTime: nativeEvent.diffTime?.toString() ?? '',
});
}}
>
<View
style={{
elevation: 1,
backgroundColor: 'white',
padding: 10,
height: 150,
width: '100%',
borderRadius: 20,
justifyContent: 'center',
alignItems: 'center',
}}
>
<Text style={styles.text}>{`Card: ${index}`}</Text>
{isEnabled && (
<Text
style={styles.text}
>{`onDraw Timestamp: ${endMarkers.drawTime}`}</Text>
)}
{isEnabled && (
<Text
style={styles.text}
>{`Render Time: ${endMarkers.renderTime}ms`}</Text>
)}
{endMarkers.diffTime && (
<Text
style={styles.text}
>{`(Draw - Mount) Time: ${endMarkers.diffTime}ms`}</Text>
)}
</View>
</PerformanceTracker>
);
};

const DATA = new Array(100).fill(null);

export default function App() {
const getLogsFromNative = async () => {
await PerformanceTracker.getLogs();
const data = await PerformanceTracker.getLogs();
console.log(`Platform: ${Platform.OS} All events ${JSON.stringify(data)}`);
};

const resetEvents = async () => {
PerformanceTracker.resetLogs();
};

useEffect(() => {
// Set Mount as T0 marker
PerformanceTracker.send('Screen_Mount', Date.now());
}, []);

return (
<View>
<Button
title="Toggle Native View Display "
onPress={(e) => {
PerformanceTracker.send('Button_onPress', e.nativeEvent.timestamp);
setShowPTView(!showPTView);
<SafeAreaView style={{ flex: 1 }}>
<StatusBar />
<View
style={{
flex: 1,
backgroundColor: 'white',
}}
/>
<Button title="GET ALL EVENTS" onPress={getLogsFromNative} />
{showPTView && (
<View style={styles.container}>
<PerformanceTracker
style={{ borderWidth: 1, flex: 1 }}
tagName={'Parent Tracker'}
eventTimeStamp={Date.now()}
onDrawEnd={() => {}}
>
<View
style={{
width: 200,
height: 200,
borderRadius: 100,
backgroundColor: 'pink',
justifyContent: 'center',
alignItems: 'center',
}}
>
<Text>First View: {res}</Text>
</View>
</PerformanceTracker>
>
<Button title="Get All Events" onPress={getLogsFromNative} />
<Button title="Reset" onPress={resetEvents} />
<View
style={{
flex: 1,
backgroundColor: '#D3D3D3',
}}
>
<FlatList
initialNumToRender={10}
data={DATA}
renderItem={({ index }) => {
return <ItemCard index={index} />;
}}
/>
</View>
)}
</View>
</View>
</SafeAreaView>
);
}

Expand All @@ -61,4 +135,7 @@ const styles = StyleSheet.create({
height: 60,
marginVertical: 20,
},
text: {
fontSize: 18,
},
});
2 changes: 2 additions & 0 deletions src/PerformanceTrackerViewNativeComponent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ interface FinishEventType {
tagName: string;
drawTime: Double;
renderTime: Double;
diffTime?: Double;
}

export interface NativeProps extends ViewProps {
startMarker?: string;
tagName: string;
isEnabled?: boolean;
eventTimeStamp: Double;
Expand Down

0 comments on commit 60ac11d

Please # to comment.