<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
- <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
- try {
- Log.e("Ali::::", "Here1");
- t1 = new Table(CLOUD_SERVER, PASSWORD, LOCAL_MACHINE_ID, LISTENING_PORT, MainActivity.this);
- Log.e("Ali::::", "Here2");
- t1.rebuild(); // update
- Log.e("Ali::::", "Here3");
-
- } catch (Exception e) {
-
- StringWriter sw = new StringWriter();
- PrintWriter pw = new PrintWriter(sw);
- e.printStackTrace(pw);
- Log.e("ALI::::", sw.toString());
+ try {
+ Log.e("Ali::::", "Here1");
+ t1 = new Table(CLOUD_SERVER, PASSWORD, LOCAL_MACHINE_ID, LISTENING_PORT, MainActivity.this);
+ Log.e("Ali::::", "Here2");
+ //t1.initTable();
+ t1.rebuild(); // update
+ Log.e("Ali::::", "Here3");
+
+ } catch (Exception e) {
+
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ e.printStackTrace(pw);
+ Log.e("ALI::::", sw.toString());
}
// TextViews
bb.putLong(arbitratorLocalSequenceNumber);
}
- //public int getSize() { return (6 * Long.BYTES) + Byte.BYTES; }
- public int getSize() { return (6 * Long.SIZE/8) + (Byte.SIZE/8); }
+ public int getSize() {
+ //return (6 * Long.BYTES) + Byte.BYTES;
+ return (6 * Long.SIZE/8) + Byte.SIZE/8;
+ }
public byte getType() {
return Entry.TypeAbort;
import org.spongycastle.crypto.params.KeyParameter;
import org.spongycastle.crypto.PBEParametersGenerator;
import android.content.*;
+import java.nio.ByteBuffer;
+
/**
* This class provides a communication API to the webserver. It also
class CloudComm {
private static final int SALT_SIZE = 8;
private static final int TIMEOUT_MILLIS = 2000; // 100
+ public static final int IV_SIZE = 16;
/** Sets the size for the HMAC. */
static final int HMAC_SIZE = 32;
private String baseurl;
- private Cipher encryptCipher;
- private Cipher decryptCipher;
+ private SecretKeySpec key;
private Mac mac;
private String password;
private SecureRandom random;
initCrypt();
}
+ /**
+ * Inits the HMAC generator.
+ */
/**
* Inits the HMAC generator.
*/
}
try {
- SecretKeySpec key = initKey();
+ key = initKey();
password = null; // drop password
mac = Mac.getInstance("HmacSHA256");
mac.init(key);
- encryptCipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
- encryptCipher.init(Cipher.ENCRYPT_MODE, key);
- decryptCipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
- decryptCipher.init(Cipher.DECRYPT_MODE, key);
} catch (Exception e) {
e.printStackTrace();
throw new Error("Failed To Initialize Ciphers");
}
}
+
/*
* Builds the URL for the given request.
*/
}
}
+
+ private byte[] createIV(long machineId, long localSequenceNumber) {
+ ByteBuffer buffer = ByteBuffer.allocate(IV_SIZE);
+ buffer.putLong(machineId);
+ long localSequenceNumberShifted = localSequenceNumber << 16;
+ buffer.putLong(localSequenceNumberShifted);
+ return buffer.array();
+
+ }
+
+ private byte[] encryptSlotAndPrependIV(byte[] rawData, byte[] ivBytes) {
+ try {
+ ivBytes = new byte[IV_SIZE];
+ IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
+ //Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding");
+ // We no longer need PKCS5Padding for CTR mode
+ // There was a bug that the crypto library for Android that adds 16 more bytes into
+ // the existing 2048 bytes after HMAC is calculated so that this causes HMAC mismatch
+ // on the Java side that is expecting exactly 2048 bytes of padding.
+ Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
+ cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
+
+ byte[] encryptedBytes = cipher.doFinal(rawData);
+ byte[] bytes = new byte[encryptedBytes.length + IV_SIZE];
+ System.arraycopy(ivBytes, 0, bytes, 0, ivBytes.length);
+ System.arraycopy(encryptedBytes, 0, bytes, IV_SIZE, encryptedBytes.length);
+
+ return bytes;
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new Error("Failed To Encrypt");
+ }
+ }
+
+
+ private byte[] stripIVAndDecryptSlot(byte[] rawData) {
+ try {
+ byte[] ivBytes = new byte[IV_SIZE];
+ byte[] encryptedBytes = new byte[rawData.length - IV_SIZE];
+ System.arraycopy(rawData, 0, ivBytes, 0, IV_SIZE);
+ System.arraycopy(rawData, IV_SIZE, encryptedBytes, 0 , encryptedBytes.length);
+
+ IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
+
+ //Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding");
+ // We no longer need PKCS5Padding for CTR mode
+ // There was a bug that the crypto library for Android that adds 16 more bytes into
+ // the existing 2048 bytes after HMAC is calculated so that this causes HMAC mismatch
+ // on the Java side that is expecting exactly 2048 bytes of padding.
+ Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
+ cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
+
+ return cipher.doFinal(encryptedBytes);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new Error("Failed To Decrypt");
+ }
+ }
+
/*
* API for putting a slot into the queue. Returns null on success.
* On failure, the server will send slots with newer sequence
}
initCrypt();
}
-
long sequencenumber = slot.getSequenceNumber();
- byte[] bytes = slot.encode(mac);
- bytes = encryptCipher.doFinal(bytes);
+ byte[] slotBytes = slot.encode(mac);
+ // slotBytes = encryptCipher.doFinal(slotBytes);
+
+ // byte[] iVBytes = slot.getSlotCryptIV();
+
+ // byte[] bytes = new byte[slotBytes.length + IV_SIZE];
+ // System.arraycopy(iVBytes, 0, bytes, 0, iVBytes.length);
+ // System.arraycopy(slotBytes, 0, bytes, IV_SIZE, slotBytes.length);
+ byte[] bytes = encryptSlotAndPrependIV(slotBytes, slot.getSlotCryptIV());
+
url = buildRequest(true, sequencenumber, max);
for (int i = 0; i < numberofslots; i++) {
- byte[] data = new byte[sizesofslots[i]];
- dis.readFully(data);
+ byte[] rawData = new byte[sizesofslots[i]];
+ dis.readFully(rawData);
+
+
+ // byte[] data = new byte[rawData.length - IV_SIZE];
+ // System.arraycopy(rawData, IV_SIZE, data, 0, data.length);
- data = decryptCipher.doFinal(data);
+
+ byte[] data = stripIVAndDecryptSlot(rawData);
slots[i] = Slot.decode(table, data, mac);
return slots;
}
- public byte[] sendLocalData(byte[] sendData, String host, int port) {
+ public byte[] sendLocalData(byte[] sendData, long localSequenceNumber, String host, int port) {
if (salt == null) {
return null;
// Encrypt the data for sending
// byte[] encryptedData = encryptCipher.doFinal(totalData);
- byte[] encryptedData = encryptCipher.doFinal(totalData);
+// byte[] encryptedData = encryptCipher.doFinal(totalData);
+
+ byte[] iv = createIV(table.getMachineId(), table.getLocalSequenceNumber());
+ byte[] encryptedData = encryptSlotAndPrependIV(totalData, iv);
+
+
// Open a TCP socket connection to a local device
Socket socket = new Socket(host, port);
timer.endTime();
- returnData = decryptCipher.doFinal(returnData);
+// returnData = decryptCipher.doFinal(returnData);
+ returnData = stripIVAndDecryptSlot(returnData);
// We are done with this socket
socket.close();
System.arraycopy(returnData, 0, returnData2, 0, returnData2.length);
return returnData2;
- } catch (SocketTimeoutException e) {
-
- } catch (BadPaddingException e) {
-
- } catch (IllegalBlockSizeException e) {
-
- } catch (UnknownHostException e) {
-
- } catch (IOException e) {
+ } catch (Exception e) {
+ e.printStackTrace();
+ // throw new Error("Local comms failure...");
}
timer.endTime();
// Decrypt the data
- readData = decryptCipher.doFinal(readData);
+// readData = decryptCipher.doFinal(readData);
+ readData = stripIVAndDecryptSlot(readData);
+
mac.update(readData, 0, readData.length - HMAC_SIZE);
byte[] genmac = mac.doFinal();
System.arraycopy(realmac, 0, totalData, sendData.length, realmac.length);
// Encrypt the data for sending
- byte[] encryptedData = encryptCipher.doFinal(totalData);
+// byte[] encryptedData = encryptCipher.doFinal(totalData);
+ byte[] iv = createIV(table.getMachineId(), table.getLocalSequenceNumber());
+ byte[] encryptedData = encryptSlotAndPrependIV(totalData, iv);
timer.startTime();
// close the socket
socket.close();
- } catch (SocketTimeoutException e) {
-
- } catch (BadPaddingException e) {
-
- } catch (IllegalBlockSizeException e) {
-
- } catch (UnknownHostException e) {
-
- } catch (IOException e) {
+ } catch (Exception e) {
+ e.printStackTrace();
+ // throw new Error("Local comms failure...");
}
}
/** Reference to Table */
private Table table;
- Slot(Table _table, long _seqnum, long _machineid, byte[] _prevhmac, byte[] _hmac) {
+ private long localSequenceNumber;
+
+ Slot(Table _table, long _seqnum, long _machineid, byte[] _prevhmac, byte[] _hmac, long _localSequenceNumber) {
seqnum = _seqnum;
machineid = _machineid;
prevhmac = _prevhmac;
seqnumlive = true;
freespace = SLOT_SIZE - getBaseSize();
table = _table;
+ localSequenceNumber = _localSequenceNumber;
}
- Slot(Table _table, long _seqnum, long _machineid, byte[] _prevhmac) {
- this(_table, _seqnum, _machineid, _prevhmac, null);
+ Slot(Table _table, long _seqnum, long _machineid, byte[] _prevhmac, long _localSequenceNumber) {
+ this(_table, _seqnum, _machineid, _prevhmac, null, _localSequenceNumber);
}
- Slot(Table _table, long _seqnum, long _machineid) {
- this(_table, _seqnum, _machineid, new byte[HMAC_SIZE], null);
+ Slot(Table _table, long _seqnum, long _machineid, long _localSequenceNumber) {
+ this(_table, _seqnum, _machineid, new byte[HMAC_SIZE], null, _localSequenceNumber);
}
byte[] getHMAC() {
long seqnum = bb.getLong();
long machineid = bb.getLong();
int numentries = bb.getInt();
- Slot slot = new Slot(table, seqnum, machineid, prevhmac, hmac);
+ Slot slot = new Slot(table, seqnum, machineid, prevhmac, hmac, -1);
for (int i = 0; i < numentries; i++) {
slot.addShallowEntry(Entry.decode(slot, bb));
return livecount > 0;
}
+ public byte[] getSlotCryptIV() {
+ ByteBuffer buffer = ByteBuffer.allocate(CloudComm.IV_SIZE);
+ buffer.putLong(machineid);
+ long localSequenceNumberShift = localSequenceNumber << 16;
+ buffer.putLong(localSequenceNumberShift);
+ return buffer.array();
+ }
+
public String toString() {
return "<" + getSequenceNumber() + ">";
}
private long oldestLiveSlotSequenceNumver = 0; // Smallest sequence number of the slot with a live entry
private long localMachineId = 0; // Machine ID of this client device
private long sequenceNumber = 0; // Largest sequence number a client has received
+ private long localSequenceNumber = 0;
+
// private int smallestTableStatusSeen = -1; // Smallest Table Status that was seen in the latest slots sent from the server
// private int largestTableStatusSeen = -1; // Largest Table Status that was seen in the latest slots sent from the server
private long localTransactionSequenceNumber = 0; // Local sequence number counter for transactions
int livec = 0;
int deadc = 0;
+
+ int casdasd = 0;
+
+ int liveslo = 0;
+
for (long i = o; i < (n + 1); i++) {
Slot s = buffer.getSlot(i);
+
+ if (s.isLive()) {
+ liveslo++;
+ }
+
Vector<Entry> entries = s.getEntries();
for (Entry e : entries) {
if (e.isLive()) {
int type = e.getType();
+
+
+ if (type == 6) {
+ RejectedMessage rej = (RejectedMessage)e;
+ casdasd++;
+
+ System.out.println(rej.getMachineID());
+ }
+
+
types[type] = types[type] + 1;
num++;
livec++;
System.out.println(i + " " + types[i]);
}
System.out.println("Live count: " + livec);
+ System.out.println("Live Slot count: " + liveslo);
+
System.out.println("Dead count: " + deadc);
System.out.println("Old: " + o);
System.out.println("New: " + n);
cloud.initSecurity();
// Create the first insertion into the block chain which is the table status
- Slot s = new Slot(this, 1, localMachineId);
+ Slot s = new Slot(this, 1, localMachineId, localSequenceNumber);
+ localSequenceNumber++;
TableStatus status = new TableStatus(s, numberOfSlots);
s.addEntry(status);
Slot[] array = cloud.putSlot(s, numberOfSlots);
// Just pull the latest slots from the server
Slot[] newslots = cloud.getSlots(sequenceNumber + 1);
validateAndUpdate(newslots, true);
+ sendToServer(null);
+ updateLiveTransactionsAndStatus();
+
}
// public String toString() {
}
NewKey newKey = new NewKey(null, keyName, machineId);
+
if (sendToServer(newKey)) {
// If successfully inserted
return true;
bufferResizeThreshold = resizeLower - 1 + random.nextInt(numberOfSlots - resizeLower);
}
+ public long getLocalSequenceNumber() {
+ return localSequenceNumber;
+ }
+
boolean lastInsertedNewKey = false;
}
+
try {
// While we have stuff that needs inserting into the block chain
while ((pendingTransactionQueue.size() > 0) || (pendingSendArbitrationRounds.size() > 0) || (newKey != null)) {
+
fromRetry = false;
if (hadPartialSendToServer) {
}
// Create the slot
- Slot slot = new Slot(this, sequenceNumber + 1, localMachineId, buffer.getSlot(sequenceNumber).getHMAC());
+ Slot slot = new Slot(this, sequenceNumber + 1, localMachineId, buffer.getSlot(sequenceNumber).getHMAC(), localSequenceNumber);
+ localSequenceNumber++;
// Try to fill the slot with data
ThreeTuple<Boolean, Integer, Boolean> fillSlotsReturn = fillSlot(slot, false, newKey);
// Get the size of the send data
//int sendDataSize = Integer.BYTES + Long.BYTES;
- int sendDataSize = (Integer.SIZE + Long.SIZE)/8;
+ int sendDataSize = Integer.SIZE/8 + Long.SIZE/8;
Long lastArbitrationDataLocalSequenceNumber = (long) - 1;
if (lastArbitrationDataLocalSequenceNumberSeenFromArbitrator.get(machineId) != null) {
bbEncode.putInt(0);
// Send by local
- byte[] returnData = cloud.sendLocalData(sendData, localCommunicationInformation.getFirst(), localCommunicationInformation.getSecond());
+ byte[] returnData = cloud.sendLocalData(sendData, localSequenceNumber, localCommunicationInformation.getFirst(), localCommunicationInformation.getSecond());
+ localSequenceNumber++;
if (returnData == null) {
// Could not contact server
// Get the size of the send data
//int sendDataSize = Integer.BYTES + Long.BYTES;
- int sendDataSize = (Integer.SIZE + Long.SIZE)/8;
+ int sendDataSize = Integer.SIZE/8 + Long.SIZE/8;
for (TransactionPart part : transaction.getParts().values()) {
sendDataSize += part.getSize();
}
// Send by local
- byte[] returnData = cloud.sendLocalData(sendData, localCommunicationInformation.getFirst(), localCommunicationInformation.getSecond());
+ byte[] returnData = cloud.sendLocalData(sendData, localSequenceNumber, localCommunicationInformation.getFirst(), localCommunicationInformation.getSecond());
+ localSequenceNumber++;
if (returnData == null) {
// Could not contact server
entry.encode(bbEncode);
}
+
+ localSequenceNumber++;
return returnData;
}
* Returns false if a resize was needed
*/
private ThreeTuple<Boolean, Integer, Boolean> fillSlot(Slot slot, boolean resize, NewKey newKeyEntry) {
+
+
int newSize = 0;
if (liveSlotCount > bufferResizeThreshold) {
resize = true; //Resize is forced
+
}
if (resize) {
if (newKeyEntry != null) {
newKeyEntry.setSlot(slot);
if (slot.hasSpace(newKeyEntry)) {
+
slot.addEntry(newKeyEntry);
inserted = true;
}
// Process each slots data
for (Slot slot : newSlots) {
processSlot(indexer, slot, acceptUpdatesToLocal, machineSet);
+
updateExpectedSize();
}
}
private void initExpectedSize(long firstSequenceNumber, long numberOfSlots) {
-
+ // if (didFindTableStatus) {
+ // return;
+ // }
long prevslots = firstSequenceNumber;
+
+
if (didFindTableStatus) {
-// expectedsize = (prevslots < ((long) numberOfSlots)) ? (int) prevslots : expectedsize;
+ // expectedsize = (prevslots < ((long) numberOfSlots)) ? (int) prevslots : expectedsize;
+ // System.out.println("Here2: " + expectedsize + " " + numberOfSlots + " " + prevslots);
+
} else {
expectedsize = (prevslots < ((long) numberOfSlots)) ? (int) prevslots : numberOfSlots;
+ // System.out.println("Here: " + expectedsize);
}
- didFindTableStatus = true;
+ // System.out.println(numberOfSlots);
+
+ didFindTableStatus = true;
currMaxSize = numberOfSlots;
}
private void updateExpectedSize() {
expectedsize++;
+
if (expectedsize > currMaxSize) {
expectedsize = currMaxSize;
}
// Change the number of local slots to the new size
numberOfSlots = (int)currMaxSize;
+
// Recalculate the resize threshold since the size of the local buffer has changed
setResizeThreshold();
}
// Create the abort
Abort newAbort = new Abort(null,
- transaction.getClientLocalSequenceNumber(),
- transaction.getSequenceNumber(),
- transaction.getMachineId(),
- transaction.getArbitrator(),
- localArbitrationSequenceNumber);
+ transaction.getClientLocalSequenceNumber(),
+ transaction.getSequenceNumber(),
+ transaction.getMachineId(),
+ transaction.getArbitrator(),
+ localArbitrationSequenceNumber);
localArbitrationSequenceNumber++;
generatedAborts.add(newAbort);
// Create the abort
Abort newAbort = new Abort(null,
- transaction.getClientLocalSequenceNumber(),
- -1,
- transaction.getMachineId(),
- transaction.getArbitrator(),
- localArbitrationSequenceNumber);
+ transaction.getClientLocalSequenceNumber(),
+ -1,
+ transaction.getMachineId(),
+ transaction.getArbitrator(),
+ localArbitrationSequenceNumber);
localArbitrationSequenceNumber++;
addAbortSet.add(newAbort);
for (Entry entry : slot.getEntries()) {
switch (entry.getType()) {
- case Entry.TypeCommitPart:
- processEntry((CommitPart)entry);
- break;
+ case Entry.TypeCommitPart:
+ processEntry((CommitPart)entry);
+ break;
- case Entry.TypeAbort:
- processEntry((Abort)entry);
- break;
+ case Entry.TypeAbort:
+ processEntry((Abort)entry);
+ break;
- case Entry.TypeTransactionPart:
- processEntry((TransactionPart)entry);
- break;
+ case Entry.TypeTransactionPart:
+ processEntry((TransactionPart)entry);
+ break;
- case Entry.TypeNewKey:
- processEntry((NewKey)entry);
- break;
+ case Entry.TypeNewKey:
+ processEntry((NewKey)entry);
+ break;
- case Entry.TypeLastMessage:
- processEntry((LastMessage)entry, machineSet);
- break;
+ case Entry.TypeLastMessage:
+ processEntry((LastMessage)entry, machineSet);
+ break;
- case Entry.TypeRejectedMessage:
- processEntry((RejectedMessage)entry, indexer);
- break;
+ case Entry.TypeRejectedMessage:
+ processEntry((RejectedMessage)entry, indexer);
+ break;
- case Entry.TypeTableStatus:
- processEntry((TableStatus)entry, slot.getSequenceNumber());
- break;
+ case Entry.TypeTableStatus:
+ processEntry((TableStatus)entry, slot.getSequenceNumber());
+ break;
- default:
- throw new Error("Unrecognized type: " + entry.getType());
+ default:
+ throw new Error("Unrecognized type: " + entry.getType());
}
}
}
Slot currSlot = newSlots[i];
Slot prevSlot = indexer.getSlot(currSlot.getSequenceNumber() - 1);
if (prevSlot != null &&
- !Arrays.equals(prevSlot.getHMAC(), currSlot.getPrevHMAC()))
+ !Arrays.equals(prevSlot.getHMAC(), currSlot.getPrevHMAC()))
throw new Error("Server Error: Invalid HMAC Chain" + currSlot + " " + prevSlot);
}
}
int getSize() {
//return Integer.BYTES+Byte.BYTES;
- return (Integer.SIZE/8)+(Byte.SIZE/8);
+ return Integer.SIZE/8+Byte.SIZE/8;
}
byte getType() {
</value>
</option>
</component>
- <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<file leaf-file-name="MainActivity.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/MainActivity.java">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="248">
+ <state relative-caret-position="1050">
<caret line="81" column="31" selection-start-line="81" selection-start-column="8" selection-end-line="81" selection-end-column="31" />
- <folding>
- <element signature="e#4554#4612#0" expanded="true" />
- </folding>
+ <folding />
</state>
</provider>
</entry>
</provider>
</entry>
</file>
- <file leaf-file-name="RelationActivity.java" pinned="false" current-in-tab="true">
+ <file leaf-file-name="RelationActivity.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/RelationActivity.java">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="228">
+ <state relative-caret-position="443">
<caret line="68" column="21" selection-start-line="68" selection-start-column="21" selection-end-line="68" selection-end-column="21" />
<folding>
<element signature="imports" expanded="true" />
</provider>
</entry>
</file>
+ <file leaf-file-name="build.gradle" pinned="false" current-in-tab="true">
+ <entry file="file://$PROJECT_DIR$/build.gradle">
+ <provider selected="true" editor-type-id="text-editor">
+ <state relative-caret-position="377">
+ <caret line="40" column="53" selection-start-line="40" selection-start-column="53" selection-end-line="40" selection-end-column="53" />
+ <folding />
+ </state>
+ </provider>
+ </entry>
+ </file>
<file leaf-file-name="SSH_MySQL.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/SSH_MySQL.java">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="187">
+ <state relative-caret-position="1755">
<caret line="147" column="58" selection-start-line="147" selection-start-column="35" selection-end-line="147" selection-end-column="58" />
<folding />
</state>
<file leaf-file-name="DeleteDeviceActivity.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/DeleteDeviceActivity.java">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="-29">
+ <state relative-caret-position="450">
<caret line="37" column="0" selection-start-line="37" selection-start-column="0" selection-end-line="38" selection-end-column="51" />
<folding />
</state>
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
- <pane id="PackagesPane" />
+ <pane id="Scope" />
+ <pane id="AndroidView">
+ <subPane />
+ </pane>
+ <pane id="Scratches" />
<pane id="ProjectPane">
<subPane>
<PATH>
</PATH>
</subPane>
</pane>
- <pane id="AndroidView">
- <subPane />
- </pane>
- <pane id="Scratches" />
- <pane id="Scope" />
+ <pane id="PackagesPane" />
</panes>
</component>
<component name="PropertiesComponent">
</component>
<component name="ToolWindowManager">
<frame x="65" y="-4" width="1615" height="1054" extended-state="6" />
- <editor active="false" />
+ <editor active="true" />
<layout>
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32719547" sideWeight="0.49475157" order="6" side_tool="false" content_ui="tabs" />
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.28713968" sideWeight="0.44869342" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Image Layers" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32786885" sideWeight="0.5022307" order="7" side_tool="true" content_ui="tabs" />
- <window_info id="Android Monitor" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2827051" sideWeight="0.5532186" order="7" side_tool="false" content_ui="tabs" />
- <window_info id="Preview" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.2974108" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
- <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25055432" sideWeight="0.5589548" order="2" side_tool="false" content_ui="tabs" />
+ <window_info id="Android Monitor" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2827051" sideWeight="0.54811984" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+ <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25055432" sideWeight="0.5589548" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3292683" sideWeight="0.4901211" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Captures" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
- <window_info id="Gradle Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2827051" sideWeight="0.4467814" order="7" side_tool="true" content_ui="tabs" />
+ <window_info id="Gradle Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2827051" sideWeight="0.4518802" order="7" side_tool="true" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.22370937" sideWeight="0.4915254" order="0" side_tool="false" content_ui="combo" />
- <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.20066519" sideWeight="0.48757172" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Gradle" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32981715" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Android Model" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="true" content_ui="tabs" />
<window_info id="Assistant" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32950923" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+ <window_info id="Preview" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.2974108" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
+ <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.20066519" sideWeight="0.48757172" order="1" side_tool="false" content_ui="tabs" />
</layout>
</component>
<component name="UnknownFeatures">
</state>
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/build.gradle">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="264">
- <caret line="40" column="53" selection-start-line="40" selection-start-column="53" selection-end-line="40" selection-end-column="53" />
- </state>
- </provider>
- </entry>
<entry file="jar://$USER_HOME$/Android/Sdk/platforms/android-26/android.jar!/android/app/Activity.class">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="6245">
</entry>
<entry file="file://$PROJECT_DIR$/src/main/res/values/Constants.xml" />
<entry file="file://$PROJECT_DIR$/src/main/res/values/constants.xml">
+ <provider selected="true" editor-type-id="android-designer2">
+ <state />
+ </provider>
<provider editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
</state>
</provider>
- <provider selected="true" editor-type-id="android-designer2">
- <state />
- </provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/AddDeviceInfoActivity.java" />
<entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_add_device_info.xml" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_config.xml">
+ <provider editor-type-id="android-designer2">
+ <state />
+ </provider>
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="90">
<caret line="6" column="51" selection-start-line="6" selection-start-column="37" selection-end-line="6" selection-end-column="51" />
<folding />
</state>
</provider>
- <provider editor-type-id="android-designer2">
- <state />
- </provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/assets/add_comm.config">
<provider selected="true" editor-type-id="text-editor">
<entry file="file://$PROJECT_DIR$/src/main/res/layout/content_add_relation.xml" />
<entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_add_comm.xml" />
<entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_add_device.xml">
+ <provider editor-type-id="android-designer2">
+ <state />
+ </provider>
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="90">
<caret line="6" column="54" selection-start-line="6" selection-start-column="54" selection-end-line="6" selection-end-column="54" />
<folding />
</state>
</provider>
- <provider editor-type-id="android-designer2">
- <state />
- </provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/AddCommActivity.java" />
<entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/AddDeviceActivity.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="214">
<caret line="51" column="47" selection-start-line="51" selection-start-column="47" selection-end-line="51" selection-end-column="47" />
- <folding>
- <element signature="e#1964#1978#0" expanded="false" />
- </folding>
</state>
</provider>
</entry>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_list.xml">
+ <provider editor-type-id="android-designer2">
+ <state />
+ </provider>
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="126">
<caret line="21" column="36" selection-start-line="21" selection-start-column="36" selection-end-line="21" selection-end-column="36" />
<folding />
</state>
</provider>
- <provider editor-type-id="android-designer2">
- <state />
- </provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_enroll_device.xml">
+ <provider selected="true" editor-type-id="android-designer2">
+ <state />
+ </provider>
<provider editor-type-id="text-editor">
<state relative-caret-position="120">
<caret line="8" column="0" selection-start-line="8" selection-start-column="0" selection-end-line="8" selection-end-column="0" />
<folding />
</state>
</provider>
- <provider selected="true" editor-type-id="android-designer2">
- <state />
- </provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/EnrollDeviceActivity.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="525">
<caret line="51" column="12" selection-start-line="51" selection-start-column="8" selection-end-line="51" selection-end-column="12" />
- <folding />
</state>
</provider>
</entry>
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="495">
<caret line="47" column="8" selection-start-line="47" selection-start-column="8" selection-end-line="47" selection-end-column="8" />
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/main/res/layout/content_relation.xml">
- <provider selected="true" editor-type-id="android-designer2">
- <state />
- </provider>
- <provider editor-type-id="text-editor">
- <state relative-caret-position="0">
- <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_add_relation.xml">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="606">
- <caret line="92" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="92" selection-end-column="0" />
- <folding />
- </state>
- </provider>
- <provider editor-type-id="android-designer2">
- <state />
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/AddRelationActivity.java">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="105">
- <caret line="19" column="26" selection-start-line="19" selection-start-column="26" selection-end-line="19" selection-end-column="26" />
- <folding />
</state>
</provider>
</entry>
+ <entry file="file://$PROJECT_DIR$/src/main/res/layout/content_relation.xml" />
+ <entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_add_relation.xml" />
+ <entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/AddRelationActivity.java" />
<entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/SSH.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="471">
<caret line="124" column="30" selection-start-line="124" selection-start-column="30" selection-end-line="124" selection-end-column="30" />
- <folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_delete_device.xml">
+ <provider selected="true" editor-type-id="android-designer2">
+ <state />
+ </provider>
<provider editor-type-id="text-editor">
<state relative-caret-position="212">
<caret line="68" column="12" selection-start-line="68" selection-start-column="12" selection-end-line="68" selection-end-column="12" />
<folding />
</state>
</provider>
- <provider selected="true" editor-type-id="android-designer2">
- <state />
- </provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/DeleteDeviceActivity.java">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="-29">
+ <state relative-caret-position="450">
<caret line="37" column="0" selection-start-line="37" selection-start-column="0" selection-end-line="38" selection-end-column="51" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_main.xml">
+ <provider selected="true" editor-type-id="android-designer2">
+ <state />
+ </provider>
<provider editor-type-id="text-editor">
<state relative-caret-position="1980">
<caret line="132" column="8" selection-start-line="132" selection-start-column="8" selection-end-line="132" selection-end-column="8" />
<folding />
</state>
</provider>
- <provider selected="true" editor-type-id="android-designer2">
- <state />
- </provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/MainActivity.java">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="248">
+ <state relative-caret-position="1050">
<caret line="81" column="31" selection-start-line="81" selection-start-column="8" selection-end-line="81" selection-end-column="31" />
- <folding>
- <element signature="e#4554#4612#0" expanded="true" />
- </folding>
+ <folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/SSH_MySQL.java">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="187">
+ <state relative-caret-position="1755">
<caret line="147" column="58" selection-start-line="147" selection-start-column="35" selection-end-line="147" selection-end-column="58" />
<folding />
</state>
</entry>
<entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/RelationActivity.java">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="228">
+ <state relative-caret-position="443">
<caret line="68" column="21" selection-start-line="68" selection-start-column="21" selection-end-line="68" selection-end-column="21" />
<folding>
<element signature="imports" expanded="true" />
</state>
</provider>
</entry>
+ <entry file="file://$PROJECT_DIR$/build.gradle">
+ <provider selected="true" editor-type-id="text-editor">
+ <state relative-caret-position="377">
+ <caret line="40" column="53" selection-start-line="40" selection-start-column="53" selection-end-line="40" selection-end-column="53" />
+ <folding />
+ </state>
+ </provider>
+ </entry>
</component>
</project>
\ No newline at end of file
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/android-profile" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/builds" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-classes" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-runtime-classes" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-safeguard" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-verifier" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-resources" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-support" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/reload-dex" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/restart-dex" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/split-apk" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
- <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
</content>
<orderEntry type="jdk" jdkName="Android API 26 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />