| /* |
| * 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(); |
| } |
| if (pollingAddress != null) { |
| 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; |
| } |
| |
| } |