package org.commcare.android.resource.installers; import android.support.v4.util.Pair; import org.commcare.resources.model.Resource; import org.commcare.resources.model.ResourceLocation; import org.commcare.resources.model.UnresolvedResourceException; import org.commcare.utils.AndroidCommCarePlatform; import org.commcare.utils.FileUtil; import org.javarosa.core.reference.Reference; import org.javarosa.core.util.externalizable.DeserializationException; import org.javarosa.core.util.externalizable.ExtUtil; import org.javarosa.core.util.externalizable.PrototypeFactory; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; /** * @author ctsims */ public class MediaFileAndroidInstaller extends FileSystemInstaller { private String path; @SuppressWarnings("unused") public MediaFileAndroidInstaller() { // For externalization } public MediaFileAndroidInstaller(String destination, String upgradeDestination, String path) { super(destination + (path == null ? "" : "/" + path), upgradeDestination + (path == null ? "" : "/" + path)); //establish whether dir structure needs to be extended? this.path = path; } @Override public boolean uninstall(Resource r) throws UnresolvedResourceException { boolean success = super.uninstall(r); if (!success) { return false; } //cleanup dirs return FileUtil.cleanFilePath(this.localDestination, path); } @Override protected int customInstall(Resource r, Reference local, boolean upgrade) throws IOException, UnresolvedResourceException { return upgrade ? Resource.RESOURCE_STATUS_UPGRADE : Resource.RESOURCE_STATUS_INSTALLED; } @Override public boolean requiresRuntimeInitialization() { return false; } @Override public boolean initialize(AndroidCommCarePlatform instance, boolean isUpgrade) { return false; } @Override public void readExternal(DataInputStream in, PrototypeFactory pf) throws IOException, DeserializationException { super.readExternal(in, pf); path = ExtUtil.nullIfEmpty(ExtUtil.readString(in)); } @Override public void writeExternal(DataOutputStream out) throws IOException { super.writeExternal(out); ExtUtil.writeString(out, ExtUtil.emptyIfNull(path)); } @Override public Pair<String, String> getResourceName(Resource r, ResourceLocation loc) { int index = loc.getLocation().lastIndexOf("/"); if (index == -1) { return new Pair<>(loc.getLocation(), ".dat"); } String fileName = loc.getLocation().substring(index); String extension = ".dat"; int lastDot = fileName.lastIndexOf("."); if (lastDot != -1) { extension = fileName.substring(lastDot); fileName = fileName.substring(0, lastDot); } return new Pair<>(fileName, extension); } }