/** * Copyright (C) 2016 The Pure Nexus Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy * of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package com.nitrogen.settings.preferences; import android.app.Activity; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.Signature; import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.Resources.NotFoundException; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraManager; import android.net.ConnectivityManager; import android.os.UserManager; import android.telephony.TelephonyManager; import android.util.DisplayMetrics; import android.view.DisplayInfo; import android.view.Surface; import android.view.WindowManager; public final class Utils { private static final String TAG = "NitrogenSettingsUtils"; // Device types private static final int DEVICE_PHONE = 0; private static final int DEVICE_HYBRID = 1; private static final int DEVICE_TABLET = 2; // Device type reference private static int sDeviceType = -1; /** * Returns whether the device is voice-capable (meaning, it is also a phone). */ public static boolean isVoiceCapable(Context context) { TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return telephony != null && telephony.isVoiceCapable(); } public static boolean isWifiOnly(Context context) { ConnectivityManager cm = (ConnectivityManager)context.getSystemService( Context.CONNECTIVITY_SERVICE); return (cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE) == false); } public static boolean hasMultipleUsers(Context context) { return ((UserManager) context.getSystemService(Context.USER_SERVICE)) .getUsers().size() > 1; } private static int getScreenType(Context context) { if (sDeviceType == -1) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayInfo outDisplayInfo = new DisplayInfo(); wm.getDefaultDisplay().getDisplayInfo(outDisplayInfo); int shortSize = Math.min(outDisplayInfo.logicalHeight, outDisplayInfo.logicalWidth); int shortSizeDp = shortSize * DisplayMetrics.DENSITY_DEFAULT / outDisplayInfo.logicalDensityDpi; if (shortSizeDp < 600) { // 0-599dp: "phone" UI with a separate status & navigation bar sDeviceType = DEVICE_PHONE; } else if (shortSizeDp < 720) { // 600-719dp: "phone" UI with modifications for larger screens sDeviceType = DEVICE_HYBRID; } else { // 720dp: "tablet" UI with a single combined status & navigation bar sDeviceType = DEVICE_TABLET; } } return sDeviceType; } public static boolean isPhone(Context context) { return getScreenType(context) == DEVICE_PHONE; } public static boolean isHybrid(Context context) { return getScreenType(context) == DEVICE_HYBRID; } public static boolean isTablet(Context context) { return getScreenType(context) == DEVICE_TABLET; } /** * Determine whether a package is a "system package", in which case certain things (like * disabling notifications or disabling the package altogether) should be disallowed. */ public static boolean isSystemPackage(PackageManager pm, PackageInfo pkg) { if (sSystemSignature == null) { sSystemSignature = new Signature[]{ getSystemSignature(pm) }; } return sSystemSignature[0] != null && sSystemSignature[0].equals(getFirstSignature(pkg)); } private static Signature[] sSystemSignature; private static Signature getFirstSignature(PackageInfo pkg) { if (pkg != null && pkg.signatures != null && pkg.signatures.length > 0) { return pkg.signatures[0]; } return null; } private static Signature getSystemSignature(PackageManager pm) { try { final PackageInfo sys = pm.getPackageInfo("android", PackageManager.GET_SIGNATURES); return getFirstSignature(sys); } catch (NameNotFoundException e) { } return null; } public static boolean isPackageInstalled(Context context, String pkg, boolean ignoreState) { if (pkg != null) { try { PackageInfo pi = context.getPackageManager().getPackageInfo(pkg, 0); if (!pi.applicationInfo.enabled && !ignoreState) { return false; } } catch (NameNotFoundException e) { return false; } } return true; } public static boolean isPackageInstalled(Context context, String pkg) { return isPackageInstalled(context, pkg, true); } /** * Locks the activity orientation to the current device orientation * @param activity */ public static void lockCurrentOrientation(Activity activity) { int currentRotation = activity.getWindowManager().getDefaultDisplay().getRotation(); int orientation = activity.getResources().getConfiguration().orientation; int frozenRotation = 0; switch (currentRotation) { case Surface.ROTATION_0: frozenRotation = orientation == Configuration.ORIENTATION_LANDSCAPE ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; break; case Surface.ROTATION_90: frozenRotation = orientation == Configuration.ORIENTATION_PORTRAIT ? ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; break; case Surface.ROTATION_180: frozenRotation = orientation == Configuration.ORIENTATION_LANDSCAPE ? ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; break; case Surface.ROTATION_270: frozenRotation = orientation == Configuration.ORIENTATION_PORTRAIT ? ActivityInfo.SCREEN_ORIENTATION_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; break; } activity.setRequestedOrientation(frozenRotation); } public static boolean deviceSupportsFlashLight(Context context) { CameraManager cameraManager = (CameraManager) context.getSystemService( Context.CAMERA_SERVICE); try { String[] ids = cameraManager.getCameraIdList(); for (String id : ids) { CameraCharacteristics c = cameraManager.getCameraCharacteristics(id); Boolean flashAvailable = c.get(CameraCharacteristics.FLASH_INFO_AVAILABLE); Integer lensFacing = c.get(CameraCharacteristics.LENS_FACING); if (flashAvailable != null && flashAvailable && lensFacing != null && lensFacing == CameraCharacteristics.LENS_FACING_BACK) { return true; } } } catch (CameraAccessException e) { // Ignore } return false; } }