22
33import static android .app .ActivityManager .RunningAppProcessInfo .IMPORTANCE_FOREGROUND ;
44import static android .content .Context .ACTIVITY_SERVICE ;
5+ import static android .content .pm .PackageInfo .REQUESTED_PERMISSION_GRANTED ;
56
67import android .annotation .SuppressLint ;
78import android .app .ActivityManager ;
1516import android .util .DisplayMetrics ;
1617import io .sentry .ILogger ;
1718import io .sentry .SentryLevel ;
19+ import io .sentry .protocol .App ;
1820import java .io .BufferedReader ;
1921import java .io .File ;
2022import java .io .FileReader ;
2123import java .io .IOException ;
2224import java .util .HashMap ;
2325import java .util .List ;
2426import java .util .Map ;
27+ import org .jetbrains .annotations .ApiStatus ;
2528import org .jetbrains .annotations .NotNull ;
2629import org .jetbrains .annotations .Nullable ;
2730
28- final class ContextUtils {
31+ @ ApiStatus .Internal
32+ public final class ContextUtils {
33+
34+ static class SideLoadedInfo {
35+ private final boolean isSideLoaded ;
36+ private final @ Nullable String installerStore ;
37+
38+ public SideLoadedInfo (final boolean isSideLoaded , final @ Nullable String installerStore ) {
39+ this .isSideLoaded = isSideLoaded ;
40+ this .installerStore = installerStore ;
41+ }
42+
43+ public boolean isSideLoaded () {
44+ return isSideLoaded ;
45+ }
46+
47+ public @ Nullable String getInstallerStore () {
48+ return installerStore ;
49+ }
50+
51+ public @ NotNull Map <String , String > asTags () {
52+ final Map <String , String > data = new HashMap <>();
53+ data .put ("isSideLoaded" , String .valueOf (isSideLoaded ));
54+ if (installerStore != null ) {
55+ data .put ("installerStore" , installerStore );
56+ }
57+ return data ;
58+ }
59+ }
2960
3061 private ContextUtils () {}
3162
@@ -187,8 +218,8 @@ static boolean isForegroundImportance(final @NotNull Context context) {
187218 return defaultVersion ;
188219 }
189220
190- @ SuppressWarnings ("deprecation" )
191- static @ Nullable Map < String , String > getSideLoadedInfo (
221+ @ SuppressWarnings ({ "deprecation" } )
222+ static @ Nullable SideLoadedInfo retrieveSideLoadedInfo (
192223 final @ NotNull Context context ,
193224 final @ NotNull ILogger logger ,
194225 final @ NotNull BuildInfoProvider buildInfoProvider ) {
@@ -202,20 +233,10 @@ static boolean isForegroundImportance(final @NotNull Context context) {
202233
203234 // getInstallSourceInfo requires INSTALL_PACKAGES permission which is only given to system
204235 // apps.
236+ // if it's installed via adb, system apps or untrusted sources
237+ // could be amazon, google play etc - or null in case of sideload
205238 final String installerPackageName = packageManager .getInstallerPackageName (packageName );
206-
207- final Map <String , String > sideLoadedInfo = new HashMap <>();
208-
209- if (installerPackageName != null ) {
210- sideLoadedInfo .put ("isSideLoaded" , "false" );
211- // could be amazon, google play etc
212- sideLoadedInfo .put ("installerStore" , installerPackageName );
213- } else {
214- // if it's installed via adb, system apps or untrusted sources
215- sideLoadedInfo .put ("isSideLoaded" , "true" );
216- }
217-
218- return sideLoadedInfo ;
239+ return new SideLoadedInfo (installerPackageName == null , installerPackageName );
219240 }
220241 } catch (IllegalArgumentException e ) {
221242 // it'll never be thrown as we are querying its own App's package.
@@ -324,4 +345,37 @@ static boolean isForegroundImportance(final @NotNull Context context) {
324345 return null ;
325346 }
326347 }
348+
349+ // we perform an if-check for that, but lint fails to recognize
350+ @ SuppressLint ("NewApi" )
351+ static void setAppPackageInfo (
352+ final @ NotNull PackageInfo packageInfo ,
353+ final @ NotNull BuildInfoProvider buildInfoProvider ,
354+ final @ NotNull App app ) {
355+ app .setAppIdentifier (packageInfo .packageName );
356+ app .setAppVersion (packageInfo .versionName );
357+ app .setAppBuild (ContextUtils .getVersionCode (packageInfo , buildInfoProvider ));
358+
359+ if (buildInfoProvider .getSdkInfoVersion () >= Build .VERSION_CODES .JELLY_BEAN ) {
360+ final Map <String , String > permissions = new HashMap <>();
361+ final String [] requestedPermissions = packageInfo .requestedPermissions ;
362+ final int [] requestedPermissionsFlags = packageInfo .requestedPermissionsFlags ;
363+
364+ if (requestedPermissions != null
365+ && requestedPermissions .length > 0
366+ && requestedPermissionsFlags != null
367+ && requestedPermissionsFlags .length > 0 ) {
368+ for (int i = 0 ; i < requestedPermissions .length ; i ++) {
369+ String permission = requestedPermissions [i ];
370+ permission = permission .substring (permission .lastIndexOf ('.' ) + 1 );
371+
372+ final boolean granted =
373+ (requestedPermissionsFlags [i ] & REQUESTED_PERMISSION_GRANTED )
374+ == REQUESTED_PERMISSION_GRANTED ;
375+ permissions .put (permission , granted ? "granted" : "not_granted" );
376+ }
377+ }
378+ app .setPermissions (permissions );
379+ }
380+ }
327381}
0 commit comments