Merge remote-tracking branch 'upstream/master'
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
package org.joinmastodon.android.utils;
|
||||
|
||||
import android.os.SystemClock;
|
||||
|
||||
public class TransferSpeedTracker{
|
||||
private final double SMOOTHING_FACTOR=0.05;
|
||||
|
||||
private long lastKnownPos;
|
||||
private long lastKnownPosTime;
|
||||
private double lastSpeed;
|
||||
private double averageSpeed;
|
||||
private long totalBytes;
|
||||
|
||||
public void addSample(long position){
|
||||
if(lastKnownPosTime==0){
|
||||
lastKnownPosTime=SystemClock.uptimeMillis();
|
||||
lastKnownPos=position;
|
||||
}else{
|
||||
long time=SystemClock.uptimeMillis();
|
||||
lastSpeed=(position-lastKnownPos)/((double)(time-lastKnownPosTime)/1000.0);
|
||||
lastKnownPos=position;
|
||||
lastKnownPosTime=time;
|
||||
}
|
||||
}
|
||||
|
||||
public double getLastSpeed(){
|
||||
return lastSpeed;
|
||||
}
|
||||
|
||||
public double getAverageSpeed(){
|
||||
return averageSpeed;
|
||||
}
|
||||
|
||||
public long updateAndGetETA(){ // must be called at a constant interval
|
||||
if(averageSpeed==0.0)
|
||||
averageSpeed=lastSpeed;
|
||||
else
|
||||
averageSpeed=SMOOTHING_FACTOR*lastSpeed+(1.0-SMOOTHING_FACTOR)*averageSpeed;
|
||||
return Math.round((totalBytes-lastKnownPos)/averageSpeed);
|
||||
}
|
||||
|
||||
public void setTotalBytes(long totalBytes){
|
||||
this.totalBytes=totalBytes;
|
||||
}
|
||||
|
||||
public void reset(){
|
||||
lastKnownPos=lastKnownPosTime=0;
|
||||
lastSpeed=averageSpeed=0.0;
|
||||
totalBytes=0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package org.joinmastodon.android.utils;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Objects;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class TypedObjectPool<K, V>{
|
||||
private final Function<K, V> producer;
|
||||
private final HashMap<K, LinkedList<V>> pool=new HashMap<>();
|
||||
|
||||
public TypedObjectPool(Function<K, V> producer){
|
||||
this.producer=producer;
|
||||
}
|
||||
|
||||
public V obtain(K type){
|
||||
LinkedList<V> tp=pool.get(type);
|
||||
if(tp==null)
|
||||
pool.put(type, tp=new LinkedList<>());
|
||||
|
||||
V value=tp.poll();
|
||||
if(value==null)
|
||||
value=producer.apply(type);
|
||||
return value;
|
||||
}
|
||||
|
||||
public void reuse(K type, V obj){
|
||||
Objects.requireNonNull(obj);
|
||||
Objects.requireNonNull(type);
|
||||
|
||||
LinkedList<V> tp=pool.get(type);
|
||||
if(tp==null)
|
||||
pool.put(type, tp=new LinkedList<>());
|
||||
tp.add(obj);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user