Discovered) {
						File discoveredFile = getDiscoveredFile(id);
						if (discoveredFile.exists()) {
							int width = info.getWidth();
							byte[] discoveredBits = new byte[width * width / 8];
							FileInputStream reader = new FileInputStream(discoveredFile);
							reader.read(discoveredBits);
							reader.close();
							boolean[][] discovered = info.discovered;
							for (int x = 0; x < width; x++) {
								for (int y = 0; y < width; y += 8) {
									byte info8 = discoveredBits[(x * width + y) / 8];
									for (int b = 0; b < 8; b++) {
										boolean data = (info8 & 0x1 << b) > 0;
										discovered[x][y + b] = data;
									}
								}
							}
						}
						// else info already created empty array
					}
					map = new DrawingMap(id, info);
					maps.add(map);
				}
			} catch (Exception e) {
				Utils.printError("[WARN] Couldn't load map #" + id + "! (" + e.getClass().getSimpleName() + " : " + e.getMessage() + ")");
				Utils.printStackTracePeak(e, 3);
			}
		}
		
		return map;
	}
	
	public static void save(IMap map)
	{
		File file = new File(DIR, map.getId() + ".dat");
		try {
			if (map instanceof SmallMap) {
				SmallMap smallMap = (SmallMap) map;
				FileConfiguration ymlFormat = YamlConfiguration.loadConfiguration(file);
				ymlFormat.set("scale", smallMap.getScale());
				ymlFormat.set("start_x", smallMap.getX());
				ymlFormat.set("start_z", smallMap.getZ());
				ymlFormat.save(file);
			}
			if (map instanceof DrawingMap) {
				DrawingMap drawingMap = (DrawingMap) map;
				FileConfiguration ymlFormat = YamlConfiguration.loadConfiguration(file);
				ymlFormat.set("scale", drawingMap.getScale());
				ymlFormat.set("x_center", drawingMap.getX());
				ymlFormat.set("y_center", drawingMap.getY());
				ymlFormat.set("z_center", drawingMap.getZ());
				ymlFormat.set("position", drawingMap.getDirection().name());
				ymlFormat.set("is_discovered", drawingMap.isFullDicovered());
				ymlFormat.save(file);

				saveDiscovered(drawingMap);
			}
		} catch (IOException e) {
			Utils.printError("Error while creating map file '" + map.getId() + ".dat'.");
			e.printStackTrace();
		}
	}
	
	/** @return <b>false</b> if there was error */
	public static boolean saveDiscovered(DrawingMap map) {
		if (map.isFullDicovered()) {
			File discoveredFile = getDiscoveredFile(map.getId());
			if (discoveredFile.exists()) {
				discoveredFile.delete();
			}
			return true;
		} else {
			return saveBitset(getDiscoveredFile(map.getId()), map.getDicovered());
		}
	}

	public static void delete(IMap map) {
		File file = new File(DIR, map.getId() + ".dat");
		try {
			file.delete();
			if (map instanceof DrawingMap) {
				File discoveredFile = getDiscoveredFile(map.getId());
				if (discoveredFile.exists()) {
					discoveredFile.delete();
				}
				File imageFile = getImageFile(map.getId());
				if (imageFile.exists()) {
					imageFile.delete();
				}
			}
			maps.remove(map);
		} catch (Exception e) {
			Utils.printError("Error while deleting map file '" + map.getId() + ".dat'.");
			e.printStackTrace();
		}
	}
	
	private static File getDiscoveredFile(int id) {
		return new File(DIR + id + "." + BOOLEAN_ARRAY_FORMAT);
	}
	
	private static boolean saveBitset(File file, boolean[][] bitMap) {
		try {
			int width = bitMap.length;
			int height = bitMap[0].length;
			byte discoveredBits[] = new byte[width / 8 * height];
			int i = 0;
			for (int x = 0; x < width; x++) {
				for (int y = 0; y < height; y += 8) {
					byte info8 = 0;
					for (int b = 0; b < 8; b++) {
						int data = bitMap[x][y + b]? 1 : 0;
						info8 |= data << b;
					}
					discoveredBits[i] = info8;
					i++;
				}
			}
			FileOutputStream writer = new FileOutputStream(file);
			writer.write(discoveredBits);
			writer.close();
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
	
	private static File getImageFile(int id) {
		File imageFile = new File(DIR + id + "." + IMG_OLD_FORMAT);
		if (!imageFile.exists())
			imageFile = new File(DIR + id + "." + IMG_FORMAT);
		return imageFile;
	}
	
	public static BufferedImage loadImage(int id)
	{
		File imageFile = getImageFile(id);
		
		if (!imageFile.exists())
			return null;
		
		try {
			BufferedImage image = ImageIO.read(imageFile);
			if (imageFile.getName().endsWith(IMG_OLD_FORMAT)) {
				imageFile.delete();
				saveImage(id, image);
			}
			return image;
		} catch (IOException e) {
			Utils.printError("Error while loading image '" + imageFile.getName() +"'.");
			return null;
		}
	}
	
	public static void saveImage(int id, BufferedImage image)
	{
		File image_file = new File(DIR + id + "." + IMG_FORMAT);
		
		try {
			ImageIO.write(image, IMG_FORMAT, image_file);
		} catch (IOException e) {
			Utils.printError("Error while saving image '" + id + "." + IMG_FORMAT +"'.");
		}
	}
	
	@SuppressWarnings("deprecation")
	public static void saveMapCanvas(IMap map, MapCanvas canvas) {
		BufferedImage image = new BufferedImage(128, 128, BufferedImage.TYPE_INT_ARGB_PRE);
		
		for (int x = 0; x < 128; x++)
			for (int z = 0; z < 128; z++)
			{
				byte map_color = canvas.getPixel(x, z);
				Color color = DEFAULT_SAVE_COLOR;
				try {
					color = MapPalette.getColor(map_color);
				} catch (Exception e) {
					Utils.printError("Map saving color error: color id " + map_color);
				}
				if (0 <= map_color && map_color < PaletteUtils.SHADES_COUNT) {
					// FFFF FFFF FF00 0000
					color = new Color(0, 0, 0, 0);
				}
				image.setRGB(x, z, color.getRGB());
			}
		
		MapFileManager.saveImage(map.getId(), image);
	}
}
Some of this feature exists in Android... not widely used tho.

For example, I have an app called Untappd that is a social app for logging different beers that you drink and giving them a rating.  I can tell Google Now "OK Google" to "search untappd for &lt;name of beer&gt;" and it will open the app, and search for that beer.   
Another example - I could say "ok google, play &lt;song/album/playlist name&gt; on &lt;name of music app ie: spotify&gt; and it will do it.

In time I suspect more apps will begin to use this.Yup! 

  No one asked to be brought into this world, and some people really are un happy with their lives. It's selfish of others to want a chronic suicidal person to live a life they do not want.

(apologies for rambling off)That's strange cause like they could