001
014
015 package com.liferay.portal.kernel.mobile.device;
016
017 import com.liferay.portal.kernel.security.pacl.permission.PortalRuntimePermission;
018 import com.liferay.portal.kernel.util.Validator;
019 import com.liferay.registry.Registry;
020 import com.liferay.registry.RegistryUtil;
021 import com.liferay.registry.ServiceReference;
022 import com.liferay.registry.ServiceTracker;
023 import com.liferay.registry.ServiceTrackerCustomizer;
024
025 import java.util.Map;
026 import java.util.Set;
027
028 import javax.servlet.http.HttpServletRequest;
029
030
034 public class DeviceDetectionUtil {
035
036 public static Device detectDevice(HttpServletRequest request) {
037 DeviceRecognitionProvider deviceRecognitionProvider =
038 getDeviceRecognitionProvider();
039
040 if (deviceRecognitionProvider == null) {
041 return UnknownDevice.getInstance();
042 }
043
044 return deviceRecognitionProvider.detectDevice(request);
045 }
046
047 public static DeviceRecognitionProvider getDeviceRecognitionProvider() {
048 PortalRuntimePermission.checkGetBeanProperty(DeviceDetectionUtil.class);
049
050 if (_instance._deviceRecognitionProvider != null) {
051 return _instance._deviceRecognitionProvider;
052 }
053
054 return _instance._defaultDeviceRecognitionProvider;
055 }
056
057 public static Set<VersionableName> getKnownBrands() {
058 KnownDevices knownDevices = getKnownDevices();
059
060 return knownDevices.getBrands();
061 }
062
063 public static Set<VersionableName> getKnownBrowsers() {
064 KnownDevices knownDevices = getKnownDevices();
065
066 return knownDevices.getBrowsers();
067 }
068
069 public static Set<String> getKnownDeviceIdsByCapability(
070 Capability capability) {
071
072 KnownDevices knownDevices = getKnownDevices();
073
074 Map<Capability, Set<String>> deviceIds = knownDevices.getDeviceIds();
075
076 return deviceIds.get(capability);
077 }
078
079 public static Set<VersionableName> getKnownOperatingSystems() {
080 KnownDevices knownDevices = getKnownDevices();
081
082 return knownDevices.getOperatingSystems();
083 }
084
085 public static Set<String> getKnownPointingMethods() {
086 KnownDevices knownDevices = getKnownDevices();
087
088 return knownDevices.getPointingMethods();
089 }
090
091 public DeviceDetectionUtil() {
092 Registry registry = RegistryUtil.getRegistry();
093
094 _serviceTracker = registry.trackServices(
095 DeviceRecognitionProvider.class,
096 new DeviceRecognitionProviderServiceTrackerCustomizer());
097
098 _serviceTracker.open();
099 }
100
101 protected static KnownDevices getKnownDevices() {
102 DeviceRecognitionProvider deviceRecognitionProvider =
103 getDeviceRecognitionProvider();
104
105 KnownDevices knownDevices = null;
106
107 if (deviceRecognitionProvider == null) {
108 knownDevices = NoKnownDevices.getInstance();
109 }
110 else {
111 knownDevices = deviceRecognitionProvider.getKnownDevices();
112 }
113
114 return knownDevices;
115 }
116
117 private static final DeviceDetectionUtil _instance =
118 new DeviceDetectionUtil();
119
120 private volatile DeviceRecognitionProvider
121 _defaultDeviceRecognitionProvider;
122 private volatile DeviceRecognitionProvider _deviceRecognitionProvider;
123 private final ServiceTracker
124 <DeviceRecognitionProvider, DeviceRecognitionProvider> _serviceTracker;
125
126 private class DeviceRecognitionProviderServiceTrackerCustomizer
127 implements ServiceTrackerCustomizer
128 <DeviceRecognitionProvider, DeviceRecognitionProvider> {
129
130 @Override
131 public DeviceRecognitionProvider addingService(
132 ServiceReference<DeviceRecognitionProvider> serviceReference) {
133
134 Registry registry = RegistryUtil.getRegistry();
135
136 DeviceRecognitionProvider deviceRecognitionProvider =
137 registry.getService(serviceReference);
138
139 String type = (String)serviceReference.getProperty("type");
140
141 if (Validator.isNotNull(type) && type.equals("default")) {
142 _defaultDeviceRecognitionProvider = deviceRecognitionProvider;
143 }
144 else {
145 _deviceRecognitionProvider = deviceRecognitionProvider;
146 }
147
148 return deviceRecognitionProvider;
149 }
150
151 @Override
152 public void modifiedService(
153 ServiceReference<DeviceRecognitionProvider> serviceReference,
154 DeviceRecognitionProvider deviceRecognitionProvider) {
155 }
156
157 @Override
158 public void removedService(
159 ServiceReference<DeviceRecognitionProvider> serviceReference,
160 DeviceRecognitionProvider deviceRecognitionProvider) {
161
162 Registry registry = RegistryUtil.getRegistry();
163
164 String type = (String)serviceReference.getProperty("type");
165
166 if (type.equals("default")) {
167 _defaultDeviceRecognitionProvider = null;
168 }
169 else {
170 _deviceRecognitionProvider = null;
171 }
172
173 registry.ungetService(serviceReference);
174 }
175
176 }
177
178 }