FileDocCategorySizeDatePackage
PresencePollingManager.javaAPI DocAndroid 1.5 API3596Wed May 06 22:42:46 BST 2009com.android.im.imps

PresencePollingManager.java

/*
 * Copyright (C) 2008 Esmertec AG.
 * Copyright (C) 2008 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.im.imps;

/**
 * Manage presence polling from the server. If the server does not support
 * subscribing presence change or prefer the client polling presence, the client
 * should send GetPresence-Request periodically. 
 */
public class PresencePollingManager implements Runnable {
    private boolean mStopped;
    private boolean mFinished;

    private long mPollingInterval;
    private Object mLock = new Object();

    private ImpsAddress[] mPollingAddress;
    private ImpsAddress[] mContactLists;

    private ImpsContactListManager mManager;
    private Thread mPollingThread;

    public PresencePollingManager(ImpsContactListManager manager,
            long pollingIntervalMillis) {
        mManager = manager;
        mPollingInterval = pollingIntervalMillis;
        mStopped = true;
        mFinished = false;
    }

    public void resetPollingContacts() {
        synchronized (mLock) {
            mContactLists = null;
        }
    }

    public void startPolling() {
        synchronized (mLock) {
            // Clear the polling address; the polling thread will fetch the
            // presence of all the contacts in lists.
            mPollingAddress = null;
        }
        doStartPolling();
    }

    public void startPolling(ImpsUserAddress user){
        synchronized (mLock) {
            mPollingAddress = new ImpsAddress[] { user };
        }
        doStartPolling();
    }

    public void stopPolling() {
        mStopped = true;
    }

    public void shutdownPolling() {
        mFinished = true;
        synchronized (mLock) {
            mLock.notify();
        }
    }

    public void run() {
        while (!mFinished) {
            synchronized (mLock) {
                if (!mStopped) {
                    ImpsAddress[] pollingAddress = mPollingAddress;
                    if (pollingAddress == null) {
                        // Didn't specify of which contacts the presence will
                        // poll. Fetch the presence of all contacts in list.
                        pollingAddress = getContactLists();
                    }
                    mManager.fetchPresence(pollingAddress);
                }

                try {
                    mLock.wait(mPollingInterval);
                } catch (InterruptedException e) {
                    // ignore
                }
            }
        }
    }

    private void doStartPolling() {
        mStopped = false;
        if (mPollingThread == null) {
            mPollingThread = new Thread(this, "PollingThread");
            mPollingThread.setDaemon(true);
            mPollingThread.start();
        } else {
            synchronized (mLock) {
                mLock.notify();
            }
        }
    }

    private ImpsAddress[] getContactLists() {
        if (mContactLists == null) {
            mContactLists = mManager.getAllListAddress();
        }
        return mContactLists;
    }

}