package me.piebridge.brevent.protocol;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.v4.util.SimpleArrayMap;
import android.util.SparseIntArray;
import java.util.Collection;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import me.piebridge.brevent.override.HideApiOverride;
/**
* status
* <p>
* Created by thom on 2017/2/5.
*/
public class BreventStatus extends BreventToken implements Parcelable {
public static final int PROCESS_STATE_IDLE = -2;
public static final int PROCESS_STATE_INACTIVE = -3;
public static final int PROCESS_STATE_PERSISTENT = -4;
public final Collection<String> mBrevent;
public final Collection<String> mPriority;
public final SimpleArrayMap<String, SparseIntArray> mProcesses;
public final Collection<String> mTrustAgents;
public final boolean mSupportStopped;
public final boolean mSupportStandby;
public final long mDaemonTime;
public final long mServerTime;
public final int mUid;
public final Collection<String> mAndroidProcesses;
public BreventStatus(UUID token, Collection<String> brevent, Collection<String> priority,
SimpleArrayMap<String, SparseIntArray> processes,
Collection<String> trustAgents, boolean supportStopped,
boolean supportStandby, long daemonTime, long serverTime, int uid,
Collection<String> androidProcesses) {
super(BreventProtocol.STATUS_RESPONSE, token);
mBrevent = brevent;
mPriority = priority;
mProcesses = processes;
mTrustAgents = trustAgents;
mSupportStopped = supportStopped;
mSupportStandby = supportStandby;
mDaemonTime = daemonTime;
mServerTime = serverTime;
mUid = uid;
mAndroidProcesses = androidProcesses;
}
BreventStatus(Parcel in) {
super(in);
mBrevent = ParcelUtils.readCollection(in);
mPriority = ParcelUtils.readCollection(in);
mProcesses = ParcelUtils.readSimpleArrayMap(in);
mTrustAgents = ParcelUtils.readCollection(in);
mSupportStopped = in.readInt() != 0;
mSupportStandby = in.readInt() != 0;
mDaemonTime = in.readLong();
mServerTime = in.readLong();
mUid = in.readInt();
mAndroidProcesses = ParcelUtils.readCollection(in);
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
ParcelUtils.writeCollection(dest, mBrevent);
ParcelUtils.writeCollection(dest, mPriority);
ParcelUtils.writeSimpleArrayMap(dest, mProcesses);
ParcelUtils.writeCollection(dest, mTrustAgents);
dest.writeInt(mSupportStopped ? 1 : 0);
dest.writeInt(mSupportStandby ? 1 : 0);
dest.writeLong(mDaemonTime);
dest.writeLong(mServerTime);
dest.writeInt(mUid);
ParcelUtils.writeCollection(dest, mAndroidProcesses);
}
public static final Creator<BreventStatus> CREATOR = new Creator<BreventStatus>() {
@Override
public BreventStatus createFromParcel(Parcel in) {
return new BreventStatus(in);
}
@Override
public BreventStatus[] newArray(int size) {
return new BreventStatus[size];
}
};
public static boolean isStandby(SparseIntArray status) {
return status != null && status.get(PROCESS_STATE_IDLE, 0) != 0;
}
public static boolean isRunning(SparseIntArray status) {
if (status == null) {
return false;
}
int size = status.size();
for (int i = 0; i < size; ++i) {
int processState = status.keyAt(i);
if (isProcess(processState)) {
return true;
}
}
return false;
}
public static int getInactive(SparseIntArray status) {
if (status == null) {
return 0;
} else {
return status.get(PROCESS_STATE_INACTIVE, 0);
}
}
public static boolean isPersistent(SparseIntArray status) {
return status != null && status.get(PROCESS_STATE_PERSISTENT, 0) != 0;
}
public static boolean isProcess(int processState) {
return processState >= 0;
}
public static boolean isService(int processState) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return HideApiOverride.isService(processState);
} else {
return HideApiOverride.isServiceL(processState);
}
}
public static boolean isTop(int processState) {
return HideApiOverride.isTop(processState);
}
public static boolean isCached(int processState) {
return HideApiOverride.isCached(processState);
}
public static boolean isService(@NonNull SparseIntArray status) {
int size = status.size();
for (int i = 0; i < size; ++i) {
int processState = status.keyAt(i);
if (isService(processState)) {
return true;
}
}
return false;
}
public static boolean isForegroundService(@NonNull SparseIntArray status) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int size = status.size();
for (int i = 0; i < size; ++i) {
int processState = status.keyAt(i);
if (HideApiOverride.isForegroundService(processState)) {
return true;
}
}
}
return false;
}
public static int now() {
// i don't think can larger than Integer.MAX_VALUE, which is boot since 68 years
return (int) TimeUnit.MILLISECONDS.toSeconds(SystemClock.elapsedRealtime());
}
}