/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.content; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.util.Log; import com.galaxy.meetup.client.android.service.Resource; import com.galaxy.meetup.client.util.EsLog; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesClient; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.panorama.PanoramaClient; /** * * @author sihai * */ public class PanoramaDetector extends HandlerThread implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener{ private static PanoramaDetector sDetector; private static final Map<Uri, Boolean> sPanoramaMap = new HashMap<Uri, Boolean>(); private PanoramaClient mClient; private Context mContext; private Handler mHandler; private List<DetectionRequest> mQueue; private boolean mWaitingForConnection; private PanoramaDetector(Context context) { super("PanoramaDetector", 10); mWaitingForConnection = true; mQueue = new ArrayList<DetectionRequest>(); mContext = context.getApplicationContext(); } public static void clearCache() { sPanoramaMap.clear(); } private synchronized void connect() { mWaitingForConnection = true; (new Handler(Looper.getMainLooper())).post(new Runnable() { public final void run() { mClient = new PanoramaClient(mContext, PanoramaDetector.this, PanoramaDetector.this); mClient.connect(); } }); } public static synchronized void detectPanorama(Context context, Resource resource, Uri uri) { Boolean boolean1 = (Boolean) sPanoramaMap.get(uri); if (null != boolean1) { if (boolean1.booleanValue()) resource.deliverResourceType(2); return; } if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(context) == 0) { if (sDetector == null) { PanoramaDetector panoramadetector = new PanoramaDetector( context); sDetector = panoramadetector; panoramadetector.start(); } sDetector.detectPanorama(resource, uri); } } private synchronized void detectPanorama(Resource resource, Uri uri) { if(mHandler != null) mHandler.removeMessages(1); DetectionRequest detectionrequest = new DetectionRequest(resource, uri); if((mClient == null || !mClient.isConnected()) && !mWaitingForConnection) connect(); if(!mWaitingForConnection) { mHandler.sendMessage(mHandler.obtainMessage(0, detectionrequest)); return; } mQueue.add(detectionrequest); } protected final void handleMessage(Message message) { if(0 == message.what) { DetectionRequest detectionrequest = (DetectionRequest)message.obj; if(mClient != null) { if(EsLog.isLoggable("PanoramaDetector", 3)) Log.d("PanoramaDetector", (new StringBuilder("Detecting if the image is a panorama: ")).append(detectionrequest.mUri).toString()); mClient.loadPanoramaInfo(detectionrequest, detectionrequest.mUri); } } else if(1 == message.what) { if(mClient != null) { if(EsLog.isLoggable("PanoramaDetector", 3)) Log.d("PanoramaDetector", "Disconnecting from GooglePlayServices"); mClient.disconnect(); } } else { } } public final synchronized void onConnected() { if(EsLog.isLoggable("PanoramaDetector", 3)) Log.d("PanoramaDetector", "Connected to GooglePlayServices"); int size = mQueue.size(); for(int i = 0; i < size; i++) mHandler.sendMessage(mHandler.obtainMessage(0, mQueue.get(i))); mQueue.clear(); mWaitingForConnection = false; } public final synchronized void onConnectionFailed(ConnectionResult result) { mClient = null; mQueue.clear(); } public final void onDisconnected() { mClient = null; mQueue.clear(); } public final synchronized void start() { super.start(); mHandler = new Handler(getLooper()) { public final void handleMessage(Message message) { PanoramaDetector.this.handleMessage(message); } }; connect(); } private final class DetectionRequest implements PanoramaClient.OnPanoramaInfoLoadedListener { private Resource mResource; private Uri mUri; public DetectionRequest(Resource resource, Uri uri) { super(); mResource = resource; mUri = uri; } public final void onPanoramaInfoLoaded(ConnectionResult result, Intent intent) { Resource resource = mResource; Uri uri = mUri; boolean flag; if (intent != null) flag = true; else flag = false; sPanoramaMap.put(uri, Boolean.valueOf(flag)); if(flag) resource.deliverResourceType(2); PanoramaDetector.this.mHandler.sendEmptyMessageDelayed(1, 3000L); } } }