/*
* Copyright (C) 2016 Amit Shekhar
* Copyright (C) 2011 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.androidnetworking.common;
import com.androidnetworking.core.Core;
import com.androidnetworking.interfaces.ConnectionQualityChangeListener;
/**
* Created by amitshekhar on 29/05/16.
*/
public class ConnectionClassManager {
private static final int BYTES_TO_BITS = 8;
private static final int DEFAULT_SAMPLES_TO_QUALITY_CHANGE = 5;
private static final int MINIMUM_SAMPLES_TO_DECIDE_QUALITY = 2;
private static final int DEFAULT_POOR_BANDWIDTH = 150;
private static final int DEFAULT_MODERATE_BANDWIDTH = 550;
private static final int DEFAULT_GOOD_BANDWIDTH = 2000;
private static final long BANDWIDTH_LOWER_BOUND = 10;
private static ConnectionClassManager sInstance;
private ConnectionQuality mCurrentConnectionQuality = ConnectionQuality.UNKNOWN;
private int mCurrentBandwidthForSampling = 0;
private int mCurrentNumberOfSample = 0;
private int mCurrentBandwidth = 0;
private ConnectionQualityChangeListener mConnectionQualityChangeListener;
public static ConnectionClassManager getInstance() {
if (sInstance == null) {
synchronized (ConnectionClassManager.class) {
if (sInstance == null) {
sInstance = new ConnectionClassManager();
}
}
}
return sInstance;
}
public synchronized void updateBandwidth(long bytes, long timeInMs) {
if (timeInMs == 0 || bytes < 20000 || (bytes) * 1.0 / (timeInMs) *
BYTES_TO_BITS < BANDWIDTH_LOWER_BOUND) {
return;
}
double bandwidth = (bytes) * 1.0 / (timeInMs) * BYTES_TO_BITS;
mCurrentBandwidthForSampling = (int) ((mCurrentBandwidthForSampling *
mCurrentNumberOfSample + bandwidth) / (mCurrentNumberOfSample + 1));
mCurrentNumberOfSample++;
if (mCurrentNumberOfSample == DEFAULT_SAMPLES_TO_QUALITY_CHANGE ||
(mCurrentConnectionQuality == ConnectionQuality.UNKNOWN &&
mCurrentNumberOfSample == MINIMUM_SAMPLES_TO_DECIDE_QUALITY)) {
final ConnectionQuality lastConnectionQuality = mCurrentConnectionQuality;
mCurrentBandwidth = mCurrentBandwidthForSampling;
if (mCurrentBandwidthForSampling <= 0) {
mCurrentConnectionQuality = ConnectionQuality.UNKNOWN;
} else if (mCurrentBandwidthForSampling < DEFAULT_POOR_BANDWIDTH) {
mCurrentConnectionQuality = ConnectionQuality.POOR;
} else if (mCurrentBandwidthForSampling < DEFAULT_MODERATE_BANDWIDTH) {
mCurrentConnectionQuality = ConnectionQuality.MODERATE;
} else if (mCurrentBandwidthForSampling < DEFAULT_GOOD_BANDWIDTH) {
mCurrentConnectionQuality = ConnectionQuality.GOOD;
} else if (mCurrentBandwidthForSampling > DEFAULT_GOOD_BANDWIDTH) {
mCurrentConnectionQuality = ConnectionQuality.EXCELLENT;
}
if (mCurrentNumberOfSample == DEFAULT_SAMPLES_TO_QUALITY_CHANGE) {
mCurrentBandwidthForSampling = 0;
mCurrentNumberOfSample = 0;
}
if (mCurrentConnectionQuality != lastConnectionQuality &&
mConnectionQualityChangeListener != null) {
Core.getInstance().getExecutorSupplier().forMainThreadTasks()
.execute(new Runnable() {
@Override
public void run() {
mConnectionQualityChangeListener
.onChange(mCurrentConnectionQuality, mCurrentBandwidth);
}
});
}
}
}
public int getCurrentBandwidth() {
return mCurrentBandwidth;
}
public ConnectionQuality getCurrentConnectionQuality() {
return mCurrentConnectionQuality;
}
public void setListener(ConnectionQualityChangeListener connectionQualityChangeListener) {
mConnectionQualityChangeListener = connectionQualityChangeListener;
}
public void removeListener() {
mConnectionQualityChangeListener = null;
}
public static void shutDown() {
if (sInstance != null) {
sInstance = null;
}
}
}