blob: be044f6acdaab9404394b3121f95475411a36770 [file] [log] [blame]
/*
* Copyright 2018 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 androidx.work.impl.model;
import static androidx.work.BackoffPolicy.EXPONENTIAL;
import static androidx.work.BackoffPolicy.LINEAR;
import static androidx.work.WorkInfo.State.BLOCKED;
import static androidx.work.WorkInfo.State.CANCELLED;
import static androidx.work.WorkInfo.State.ENQUEUED;
import static androidx.work.WorkInfo.State.FAILED;
import static androidx.work.WorkInfo.State.RUNNING;
import static androidx.work.WorkInfo.State.SUCCEEDED;
import android.net.Uri;
import androidx.room.TypeConverter;
import androidx.work.BackoffPolicy;
import androidx.work.ContentUriTriggers;
import androidx.work.NetworkType;
import androidx.work.WorkInfo;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
* TypeConverters for WorkManager enums and classes.
*/
public class WorkTypeConverters {
/**
* Integer identifiers that map to {@link WorkInfo.State}.
*/
public interface StateIds {
int ENQUEUED = 0;
int RUNNING = 1;
int SUCCEEDED = 2;
int FAILED = 3;
int BLOCKED = 4;
int CANCELLED = 5;
String COMPLETED_STATES = "(" + SUCCEEDED + ", " + FAILED + ", " + CANCELLED + ")";
}
/**
* Integer identifiers that map to {@link BackoffPolicy}.
*/
public interface BackoffPolicyIds {
int EXPONENTIAL = 0;
int LINEAR = 1;
}
/**
* Integer identifiers that map to {@link NetworkType}.
*/
public interface NetworkTypeIds {
int NOT_REQUIRED = 0;
int CONNECTED = 1;
int UNMETERED = 2;
int NOT_ROAMING = 3;
int METERED = 4;
}
/**
* TypeConverter for a State to an int.
*
* @param state The input State
* @return The associated int constant
*/
@TypeConverter
public static int stateToInt(WorkInfo.State state) {
switch (state) {
case ENQUEUED:
return StateIds.ENQUEUED;
case RUNNING:
return StateIds.RUNNING;
case SUCCEEDED:
return StateIds.SUCCEEDED;
case FAILED:
return StateIds.FAILED;
case BLOCKED:
return StateIds.BLOCKED;
case CANCELLED:
return StateIds.CANCELLED;
default:
throw new IllegalArgumentException(
"Could not convert " + state + " to int");
}
}
/**
* TypeConverter for an int to a State.
*
* @param value The input integer
* @return The associated State enum value
*/
@TypeConverter
public static WorkInfo.State intToState(int value) {
switch (value) {
case StateIds.ENQUEUED:
return ENQUEUED;
case StateIds.RUNNING:
return RUNNING;
case StateIds.SUCCEEDED:
return SUCCEEDED;
case StateIds.FAILED:
return FAILED;
case StateIds.BLOCKED:
return BLOCKED;
case StateIds.CANCELLED:
return CANCELLED;
default:
throw new IllegalArgumentException(
"Could not convert " + value + " to State");
}
}
/**
* TypeConverter for a BackoffPolicy to an int.
*
* @param backoffPolicy The input BackoffPolicy
* @return The associated int constant
*/
@TypeConverter
public static int backoffPolicyToInt(BackoffPolicy backoffPolicy) {
switch (backoffPolicy) {
case EXPONENTIAL:
return BackoffPolicyIds.EXPONENTIAL;
case LINEAR:
return BackoffPolicyIds.LINEAR;
default:
throw new IllegalArgumentException(
"Could not convert " + backoffPolicy + " to int");
}
}
/**
* TypeConverter for an int to a BackoffPolicy.
*
* @param value The input integer
* @return The associated BackoffPolicy enum value
*/
@TypeConverter
public static BackoffPolicy intToBackoffPolicy(int value) {
switch (value) {
case BackoffPolicyIds.EXPONENTIAL:
return EXPONENTIAL;
case BackoffPolicyIds.LINEAR:
return LINEAR;
default:
throw new IllegalArgumentException(
"Could not convert " + value + " to BackoffPolicy");
}
}
/**
* TypeConverter for a NetworkType to an int.
*
* @param networkType The input NetworkType
* @return The associated int constant
*/
@TypeConverter
public static int networkTypeToInt(NetworkType networkType) {
switch (networkType) {
case NOT_REQUIRED:
return NetworkTypeIds.NOT_REQUIRED;
case CONNECTED:
return NetworkTypeIds.CONNECTED;
case UNMETERED:
return NetworkTypeIds.UNMETERED;
case NOT_ROAMING:
return NetworkTypeIds.NOT_ROAMING;
case METERED:
return NetworkTypeIds.METERED;
default:
throw new IllegalArgumentException(
"Could not convert " + networkType + " to int");
}
}
/**
* TypeConverter for an int to a NetworkType.
*
* @param value The input integer
* @return The associated NetworkType enum value
*/
@TypeConverter
public static NetworkType intToNetworkType(int value) {
switch (value) {
case NetworkTypeIds.NOT_REQUIRED:
return NetworkType.NOT_REQUIRED;
case NetworkTypeIds.CONNECTED:
return NetworkType.CONNECTED;
case NetworkTypeIds.UNMETERED:
return NetworkType.UNMETERED;
case NetworkTypeIds.NOT_ROAMING:
return NetworkType.NOT_ROAMING;
case NetworkTypeIds.METERED:
return NetworkType.METERED;
default:
throw new IllegalArgumentException(
"Could not convert " + value + " to NetworkType");
}
}
/**
* Converts a list of {@link ContentUriTriggers.Trigger}s to byte array representation
* @param triggers the list of {@link ContentUriTriggers.Trigger}s to convert
* @return corresponding byte array representation
*/
@TypeConverter
public static byte[] contentUriTriggersToByteArray(ContentUriTriggers triggers) {
if (triggers.size() == 0) {
return null;
}
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = null;
try {
objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeInt(triggers.size());
for (ContentUriTriggers.Trigger trigger : triggers.getTriggers()) {
objectOutputStream.writeUTF(trigger.getUri().toString());
objectOutputStream.writeBoolean(trigger.shouldTriggerForDescendants());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (objectOutputStream != null) {
try {
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return outputStream.toByteArray();
}
/**
* Converts a byte array to list of {@link ContentUriTriggers.Trigger}s
* @param bytes byte array representation to convert
* @return list of {@link ContentUriTriggers.Trigger}s
*/
@TypeConverter
public static ContentUriTriggers byteArrayToContentUriTriggers(byte[] bytes) {
ContentUriTriggers triggers = new ContentUriTriggers();
if (bytes == null) {
// bytes will be null if there are no Content Uri Triggers
return triggers;
}
ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
ObjectInputStream objectInputStream = null;
try {
objectInputStream = new ObjectInputStream(inputStream);
for (int i = objectInputStream.readInt(); i > 0; i--) {
Uri uri = Uri.parse(objectInputStream.readUTF());
boolean triggersForDescendants = objectInputStream.readBoolean();
triggers.add(uri, triggersForDescendants);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (objectInputStream != null) {
try {
objectInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return triggers;
}
private WorkTypeConverters() {
}
}