Advertisement
Guest User

Untitled

a guest
Jul 29th, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.04 KB | None | 0 0
  1. package ua.kmd.transport.android;
  2.  
  3. import android.app.ActivityManager;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.content.IntentFilter;
  7. import android.content.pm.PackageManager;
  8.  
  9. import com.google.gson.JsonArray;
  10. import com.google.gson.JsonObject;
  11.  
  12. import java.util.ArrayList;
  13. import java.util.Arrays;
  14. import java.util.Date;
  15. import java.util.HashMap;
  16. import java.util.Iterator;
  17. import java.util.List;
  18. import java.util.Map;
  19. import java.util.Timer;
  20. import java.util.TimerTask;
  21.  
  22. import ua.kmd.transport.IMessageListener;
  23. import ua.kmd.transport.ITransport;
  24. import ua.kmd.transport.ITransportListener;
  25. import ua.kmd.transport.Logger;
  26. import ua.kmd.transport.TransportMessage;
  27. import ua.kmd.transport.Utils;
  28.  
  29. /**
  30. * Created by User on 26.04.2016.
  31. */
  32. public class IntentTransport implements ITransport {
  33. private final long DEFAULT_PING_INTERVAL = 1000;
  34. private final long UPDATE_INTERVAL = 500;
  35. private final long DEFAULT_CONNECT_TIMEOUT = 4200;
  36. private final boolean DEFAULT_ALLOW_ANAUTHORIZED = true;
  37. final String ACTION_MESSAGE = "ua.kmd.transport.message";
  38. final String ACTION_PING = "ua.kmd.transport.ping";
  39. final String DATA_KEY = "DATA_KEY";
  40.  
  41. private final Map<String, Date> onlineUsers = new HashMap<>();
  42. private final Map<String, Date> connectingUsers = new HashMap<>();
  43. private final List<String> users = new ArrayList<>();
  44. private final Timer pinger = new Timer();
  45.  
  46. IMessageListener<TransportMessage> messageListener;
  47. private ITransportListener transportListener;
  48.  
  49. private Context context;
  50. private long pingInterval;
  51. private long connectionTimeout;
  52. private boolean doPing;
  53. private boolean allowUnauthorized;
  54. String currentUser;
  55. static IntentTransport INSTANCE;
  56.  
  57. private IPingEntityGetter pingEntityGetter;
  58.  
  59. private long lastPing;
  60. private IntentReceiver receiver;
  61.  
  62. public static synchronized IntentTransport instance() {
  63. return INSTANCE;
  64. }
  65.  
  66. public IntentTransport(Context context, boolean receiverFromManifest) {
  67. this.context = context;
  68. INSTANCE = this;
  69. if (!receiverFromManifest) {
  70. IntentFilter intentFilter = new IntentFilter();
  71. intentFilter.addAction(ACTION_MESSAGE);
  72. intentFilter.addAction(ACTION_PING);
  73. receiver = new IntentReceiver();
  74. context.registerReceiver(receiver, intentFilter);
  75. }
  76. }
  77.  
  78. public IntentTransport(Context context) {
  79. this(context, false);
  80. }
  81.  
  82. private boolean load(JsonObject configJson)
  83. {
  84. try {
  85. Logger.INSTANCE.log("Loading IntentTransport config data");
  86. currentUser = configJson.get("user").getAsString();
  87. allowUnauthorized = configJson.has("allow_unauthorized") ? configJson.get("allow_unauthorized").getAsBoolean() : DEFAULT_ALLOW_ANAUTHORIZED;
  88. pingInterval = configJson.has("ping_interval") ? configJson.get("ping_interval").getAsLong() : DEFAULT_PING_INTERVAL;
  89. doPing = !configJson.has("ping") || configJson.get("ping").getAsBoolean();
  90. connectionTimeout = configJson.has("connection_timeout") ? configJson.get("connection_timeout").getAsLong() : DEFAULT_CONNECT_TIMEOUT;
  91. JsonArray userItems = configJson.get("users").getAsJsonArray();
  92. for (int i=0; i<userItems.size(); i++)
  93. {
  94. JsonObject obj = userItems.get(i).getAsJsonObject();
  95. users.add(obj.get("name").getAsString());
  96. }
  97. Logger.INSTANCE.log("IntentTransport config loaded successfully");
  98. } catch (Exception e) {
  99. Logger.INSTANCE.log("Error while loading IntentTransport config data");
  100. Logger.INSTANCE.log(e);
  101. return false;
  102. }
  103. return true;
  104. }
  105.  
  106. @Override
  107. public synchronized void start(JsonObject config) {
  108. if (!load(config))
  109. return;
  110.  
  111. // IntentFilter intentFilter = new IntentFilter();
  112. // intentFilter.addAction(ACTION_MESSAGE);
  113. // intentFilter.addAction(ACTION_PING);
  114. // context.registerReceiver(this, intentFilter);
  115.  
  116. INSTANCE = this;
  117.  
  118. if (pingInterval > 0) {
  119. pinger.schedule(new TimerTask() {
  120. @Override
  121. public synchronized void run() {
  122. //synchronized (connectingUsers) {
  123. Date now = new Date();
  124. long elapsed;
  125. Iterator<Map.Entry<String, Date>> iterator = onlineUsers.entrySet().iterator();
  126. while (iterator.hasNext()) {
  127. Map.Entry<String, Date> entry = iterator.next();
  128. elapsed = now.getTime() - entry.getValue().getTime();
  129. if (elapsed >= connectionTimeout) {
  130. iterator.remove();
  131. if (transportListener != null)
  132. transportListener.onDisconnected(entry.getKey());
  133. }
  134. }
  135.  
  136. elapsed = now.getTime() - lastPing;
  137. if (doPing && elapsed >= pingInterval && !users.isEmpty()) {
  138. ping(users.toArray(new String[users.size()]));
  139. lastPing = now.getTime();
  140. }
  141.  
  142. iterator = connectingUsers.entrySet().iterator();
  143. while (iterator.hasNext()) {
  144. Map.Entry<String, Date> entry = iterator.next();
  145. elapsed = now.getTime() - entry.getValue().getTime();
  146. if (!onlineUsers.containsKey(entry.getKey()) && elapsed >= connectionTimeout) {
  147. iterator.remove();
  148. if (transportListener != null)
  149. transportListener.onConnectionFailed(entry.getKey());
  150. }
  151. }
  152. //}
  153. }
  154. }, 0, UPDATE_INTERVAL);
  155. }
  156. }
  157.  
  158. public void setPingEntity(IPingEntityGetter pingEntityGetter) {
  159. this.pingEntityGetter = pingEntityGetter;
  160. }
  161.  
  162. @Override
  163. public synchronized void stop() {
  164. //synchronized (connectingUsers) {
  165. if (receiver != null)
  166. context.unregisterReceiver(receiver);
  167. if (pinger != null)
  168. pinger.cancel();
  169. connectingUsers.clear();
  170. users.clear();
  171. onlineUsers.clear();
  172. INSTANCE = null;
  173. //}
  174. }
  175.  
  176. @Override
  177. public synchronized void connect(String user) {
  178. //synchronized (connectingUsers) {
  179. if (!onlineUsers.containsKey(user) && !connectingUsers.containsKey(user)) {
  180. connectingUsers.put(user, new Date());
  181. ping(user);
  182. }
  183. //}
  184. }
  185.  
  186. @Override
  187. public void commit(TransportMessage transportMessage) {
  188. if (transportMessage.receivers.isEmpty())
  189. return;
  190. byte[] msg = Utils.tryWriteObject(transportMessage);
  191. Intent intent = new Intent();
  192. intent.setAction(ACTION_MESSAGE);
  193. intent.putExtra(DATA_KEY, msg);
  194. context.sendBroadcast(intent);
  195. }
  196.  
  197. @Override
  198. public void setListener(IMessageListener<TransportMessage> listener) {
  199. messageListener = listener;
  200. }
  201.  
  202. @Override
  203. public void setListener(ITransportListener listener) {
  204. transportListener = listener;
  205. }
  206.  
  207. @Override
  208. public String name() {
  209. return "Intent";
  210. }
  211.  
  212. private void ping(String... users) {
  213. if (users.length == 0)
  214. return;
  215. TransportMessage pingMessage = new TransportMessage();
  216. pingMessage.sender = currentUser;
  217. pingMessage.receivers.addAll(Arrays.asList(users));
  218. if (pingEntityGetter == null) {
  219. byte[] msg = Utils.tryWriteObject(pingMessage);
  220. Intent intent = new Intent();
  221. intent.setAction(ACTION_PING);
  222. intent.putExtra(DATA_KEY, msg);
  223. context.sendBroadcast(intent);
  224. } else {
  225. Object pingEntity = pingEntityGetter.getPingEntity();
  226. pingMessage.className = pingEntity.getClass().getName();
  227. pingMessage.data = Utils.tryWriteObject(pingEntity);
  228. commit(pingMessage);
  229. }
  230. }
  231.  
  232. boolean updateRespond(String user) {
  233. synchronized (connectingUsers) {
  234. if (!users.contains(user)) {
  235. if (allowUnauthorized)
  236. users.add(user);
  237. else
  238. return false;
  239. }
  240. if (connectingUsers.containsKey(user)) {
  241. connectingUsers.remove(user);
  242. if (transportListener != null)
  243. transportListener.onConnected(user);
  244. }
  245. if (!onlineUsers.containsKey(user)) {
  246. onlineUsers.put(user, new Date());
  247. if (transportListener != null)
  248. transportListener.onConnected(user);
  249. }
  250. else
  251. onlineUsers.get(user).setTime(new Date().getTime());
  252. return true;
  253. }
  254. }
  255.  
  256. public boolean isAppInstalled(String packageName) {
  257. PackageManager pm = context.getPackageManager();
  258. boolean appInstalled;
  259. try {
  260. pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
  261. appInstalled = true;
  262. }
  263. catch (PackageManager.NameNotFoundException e) {
  264. appInstalled = false;
  265. }
  266. return appInstalled ;
  267. }
  268.  
  269. public boolean isAppRunning(String packageName) {
  270. if (!isAppInstalled(packageName))
  271. return false;
  272. ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
  273. List<ActivityManager.RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
  274. for(int i = 0; i < procInfos.size(); i++)
  275. {
  276. if(procInfos.get(i).processName.equals(packageName))
  277. return true;
  278. }
  279. return false;
  280. }
  281.  
  282. public void launchApp(String packageName) {
  283. Intent launchIntent = context.getPackageManager()
  284. .getLaunchIntentForPackage(packageName);
  285.  
  286. // For proper behaviour we must setup our meteo app launch intent the same way the system does it
  287. launchIntent.setFlags(0);
  288. launchIntent.setPackage(null);
  289. launchIntent.setAction(Intent.ACTION_MAIN);
  290. launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
  291.  
  292. launchIntent.setFlags(268435456);
  293.  
  294. context.startActivity(launchIntent);
  295. }
  296.  
  297. public void startService(String packageName) {
  298. Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
  299. context.startService(intent);
  300. }
  301. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement