/***************************************************************************** * AndroidDevices.java ***************************************************************************** * Copyright © 2011-2014 VLC authors and VideoLAN * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ package org.videolan.vlc.util; import android.annotation.TargetApi; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; import android.os.Environment; import android.telephony.TelephonyManager; import android.view.InputDevice; import android.view.MotionEvent; import org.videolan.libvlc.util.AndroidUtil; import org.videolan.vlc.VLCApplication; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.StringTokenizer; public class AndroidDevices { public final static String TAG = "VLC/Util/AndroidDevices"; public final static String EXTERNAL_PUBLIC_DIRECTORY = Environment.getExternalStorageDirectory().getPath(); final static boolean hasNavBar; final static boolean hasTsp; static { HashSet<String> devicesWithoutNavBar = new HashSet<String>(); devicesWithoutNavBar.add("HTC One V"); devicesWithoutNavBar.add("HTC One S"); devicesWithoutNavBar.add("HTC One X"); devicesWithoutNavBar.add("HTC One XL"); hasNavBar = AndroidUtil.isICSOrLater() && !devicesWithoutNavBar.contains(android.os.Build.MODEL); hasTsp = VLCApplication.getAppContext().getPackageManager().hasSystemFeature("android.hardware.touchscreen"); } public static boolean hasExternalStorage() { return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); } public static boolean hasNavBar() { return hasNavBar; } /** hasCombBar test if device has Combined Bar : only for tablet with Honeycomb or ICS */ public static boolean hasCombBar() { return (!AndroidDevices.isPhone() && ((VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB) && (VERSION.SDK_INT <= VERSION_CODES.JELLY_BEAN))); } public static boolean isPhone(){ TelephonyManager manager = (TelephonyManager)VLCApplication.getAppContext().getSystemService(Context.TELEPHONY_SERVICE); return manager.getPhoneType() != TelephonyManager.PHONE_TYPE_NONE; } public static boolean hasTsp(){ return hasTsp; } public static ArrayList<String> getStorageDirectories() { BufferedReader bufReader = null; ArrayList<String> list = new ArrayList<String>(); list.add(EXTERNAL_PUBLIC_DIRECTORY); List<String> typeWL = Arrays.asList("vfat", "exfat", "sdcardfs", "fuse", "ntfs", "fat32", "ext3", "ext4", "esdfs"); List<String> typeBL = Arrays.asList("tmpfs"); String[] mountWL = { "/mnt", "/Removable", "/storage" }; String[] mountBL = { "/mnt/secure", "/mnt/shell", "/mnt/asec", "/mnt/obb", "/mnt/media_rw/extSdCard", "/mnt/media_rw/sdcard", "/storage/emulated" }; String[] deviceWL = { "/dev/block/vold", "/dev/fuse", "/mnt/media_rw" }; try { bufReader = new BufferedReader(new FileReader("/proc/mounts")); String line; while((line = bufReader.readLine()) != null) { StringTokenizer tokens = new StringTokenizer(line, " "); String device = tokens.nextToken(); String mountpoint = tokens.nextToken(); String type = tokens.nextToken(); // skip if already in list or if type/mountpoint is blacklisted if (list.contains(mountpoint) || typeBL.contains(type) || Strings.startsWith(mountBL, mountpoint)) continue; // check that device is in whitelist, and either type or mountpoint is in a whitelist if (Strings.startsWith(deviceWL, device) && (typeWL.contains(type) || Strings.startsWith(mountWL, mountpoint))) { int position = Strings.containsName(list, Strings.getName(mountpoint)); if (position > -1) list.remove(position); list.add(mountpoint); } } } catch (FileNotFoundException e) {} catch (IOException e) {} finally { Util.close(bufReader); } return list; } public static String[] getMediaDirectories() { ArrayList<String> list = new ArrayList<String>(); list.addAll(getStorageDirectories()); list.addAll(Arrays.asList(CustomDirectories.getCustomDirectories())); return list.toArray(new String[list.size()]); } @TargetApi(VERSION_CODES.HONEYCOMB_MR1) public static float getCenteredAxis(MotionEvent event, InputDevice device, int axis) { final InputDevice.MotionRange range = device.getMotionRange(axis, event.getSource()); // A joystick at rest does not always report an absolute position of // (0,0). Use the getFlat() method to determine the range of values // bounding the joystick axis center. if (range != null) { final float flat = range.getFlat(); final float value = event.getAxisValue(axis); // Ignore axis values that are within the 'flat' region of the // joystick axis center. if (Math.abs(value) > flat) { return value; } } return 0; } public static boolean hasLANConnection(){ boolean networkEnabled = false; ConnectivityManager connectivity = (ConnectivityManager)(VLCApplication.getAppContext().getSystemService(Context.CONNECTIVITY_SERVICE)); if (connectivity != null) { NetworkInfo networkInfo = connectivity.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnected() && (networkInfo.getType() != ConnectivityManager.TYPE_MOBILE)) { networkEnabled = true; } } return networkEnabled; } }