Skip to content

Commit de77fef

Browse files
committed
[Feature] New API NavConfiguration.setSaveStateCipher
1 parent ec3997c commit de77fef

File tree

2 files changed

+50
-20
lines changed

2 files changed

+50
-20
lines changed

navigator/src/main/java/m/co/rh/id/anavigator/NavConfiguration.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,21 @@ public Cipher getSaveStateDecryptCipher() {
8787
return saveStateDecryptCipher;
8888
}
8989

90+
/**
91+
* Set cipher used in save state
92+
*
93+
* @param encrypt initialized cipher use to encrypt
94+
* @param decrypt initialized cipher use to decrypt
95+
* @throws NullPointerException if either encrypt or decrypt cipher is null
96+
*/
97+
public void setSaveStateCipher(Cipher encrypt, Cipher decrypt) {
98+
if (encrypt == null || decrypt == null) {
99+
throw new NullPointerException("Encrypt and Decrypt ciphers MUST NOT NULL");
100+
}
101+
saveStateEncryptCipher = encrypt;
102+
saveStateDecryptCipher = decrypt;
103+
}
104+
90105
public static class Builder<ACT extends Activity, SV extends StatefulView> {
91106
private String initialRouteName;
92107
private Map<String, StatefulViewFactory<ACT, SV>> navMap;

navigator/src/main/java/m/co/rh/id/anavigator/Navigator.java

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -711,31 +711,41 @@ class SnapshotHandler {
711711

712712
private ExecutorService mExecutorService;
713713
private Future<Serializable> mStateSnapshot;
714-
private File mFile;
715-
private Cipher mEncryptCipher;
716-
private Cipher mDecryptCipher;
714+
private NavConfiguration mNavConfiguration;
717715

718716
SnapshotHandler(NavConfiguration navConfiguration) {
719-
mFile = navConfiguration.getSaveStateFile();
720-
mEncryptCipher = navConfiguration.getSaveStateEncryptCipher();
721-
mDecryptCipher = navConfiguration.getSaveStateDecryptCipher();
722-
if (mFile != null) {
717+
mNavConfiguration = navConfiguration;
718+
if (getFile() != null) {
723719
loadSnapshot(); // start load as early as possible
724720
}
725721
}
726722

723+
private File getFile() {
724+
return mNavConfiguration.getSaveStateFile();
725+
}
726+
727+
private Cipher getEncryptCipher() {
728+
return mNavConfiguration.getSaveStateEncryptCipher();
729+
}
730+
731+
private Cipher getDecryptCipher() {
732+
return mNavConfiguration.getSaveStateDecryptCipher();
733+
}
734+
727735
void saveState(Serializable serializable) {
728-
if (mFile != null) {
736+
final File file = getFile();
737+
final Cipher encryptCipher = getEncryptCipher();
738+
if (file != null) {
729739
mStateSnapshot = getExecutorService().submit(() -> {
730-
if (!mFile.exists()) {
731-
mFile.getParentFile().mkdirs();
732-
mFile.createNewFile();
740+
if (!file.exists()) {
741+
file.getParentFile().mkdirs();
742+
file.createNewFile();
733743
}
734744
try {
735-
FileOutputStream fileOutputStream = new FileOutputStream(mFile);
745+
FileOutputStream fileOutputStream = new FileOutputStream(file);
736746
BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);
737747
ObjectOutputStream oos = new ObjectOutputStream(bos);
738-
oos.writeObject(new SealedObject(serializable, mEncryptCipher));
748+
oos.writeObject(new SealedObject(serializable, encryptCipher));
739749
oos.close();
740750
bos.close();
741751
fileOutputStream.close();
@@ -748,7 +758,7 @@ void saveState(Serializable serializable) {
748758
}
749759

750760
Serializable loadState() {
751-
if (mFile != null) {
761+
if (getFile() != null) {
752762
if (mStateSnapshot != null) {
753763
return getState();
754764
}
@@ -759,17 +769,19 @@ Serializable loadState() {
759769
}
760770

761771
private void loadSnapshot() {
772+
final File file = getFile();
773+
final Cipher decryptCipher = getDecryptCipher();
762774
mStateSnapshot = getExecutorService().submit(() -> {
763-
if (!mFile.exists()) {
775+
if (!file.exists()) {
764776
return null;
765777
}
766778
Serializable result = null;
767779
try {
768-
FileInputStream fis = new FileInputStream(mFile);
780+
FileInputStream fis = new FileInputStream(file);
769781
BufferedInputStream bis = new BufferedInputStream(fis);
770782
ObjectInputStream ois = new ObjectInputStream(bis);
771783
result = (Serializable)
772-
((SealedObject) ois.readObject()).getObject(mDecryptCipher);
784+
((SealedObject) ois.readObject()).getObject(decryptCipher);
773785
ois.close();
774786
bis.close();
775787
fis.close();
@@ -785,9 +797,12 @@ void clearState() {
785797
mStateSnapshot.cancel(false);
786798
mStateSnapshot = null;
787799
}
788-
getExecutorService().submit(() -> {
789-
mFile.delete();
790-
});
800+
final File file = getFile();
801+
if (file != null) {
802+
getExecutorService().submit(() -> {
803+
file.delete();
804+
});
805+
}
791806
}
792807

793808
private ExecutorService getExecutorService() {

0 commit comments

Comments
 (0)