/* * Copyright (C) 2013 - 2014 Alexander "Evisceration" Martinz * * 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 3 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, see <http://www.gnu.org/licenses/>. * */ package org.namelessrom.devicecontrol.net; import android.content.Context; import android.net.wifi.WifiManager; import org.namelessrom.devicecontrol.App; import java.net.InetAddress; import java.net.NetworkInterface; import java.util.Collections; import java.util.List; import java.util.regex.Pattern; import timber.log.Timber; /** * Helper class for network informations like getting the ip address of the device */ public class NetworkInfo { private static final String TAG = NetworkInfo.class.getSimpleName(); public static String getAnyIpAddress() { String ip = getWifiIp(); if ("0.0.0.0".equals(ip)) { ip = getIpAddress(true); } return ip; } public static String getWifiIp() { final WifiManager wifiManager = (WifiManager) App.get().getSystemService(Context.WIFI_SERVICE); int ipAddress = wifiManager.getConnectionInfo().getIpAddress(); final String formattedIp = String.format("%d.%d.%d.%d", (ipAddress & 0xff), (ipAddress >> 8 & 0xff), (ipAddress >> 16 & 0xff), (ipAddress >> 24 & 0xff)); Timber.v("formattedIp (wifi) -> %s", formattedIp); return formattedIp; } public static String getIpAddress(final boolean useIPv4) { List<NetworkInterface> interfaces; try { interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); } catch (Exception e) { interfaces = null; } if (interfaces == null) { return "0.0.0.0"; } for (NetworkInterface intf : interfaces) { final List<InetAddress> addrs = Collections.list(intf.getInetAddresses()); for (final InetAddress addr : addrs) { if (!addr.isLoopbackAddress()) { final String sAddr = addr.getHostAddress().toUpperCase(); boolean isIPv4 = isIPv4Address(sAddr); if (useIPv4) { if (isIPv4) { return sAddr; } } else { if (!isIPv4) { final int delim = sAddr.indexOf('%'); // drop ip6 port suffix return ((delim < 0) ? sAddr : sAddr.substring(0, delim)); } } } } } return "0.0.0.0"; } private static final Pattern IPV4_PATTERN = Pattern.compile( "^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}$"); public static boolean isIPv4Address(final String input) { return IPV4_PATTERN.matcher(input).matches(); } }