diff --git a/.idea/misc.xml b/.idea/misc.xml
index 5d199810..fbb68289 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -37,7 +37,7 @@
-
+
diff --git a/app/build.gradle b/app/build.gradle
index f07ef38b..25805bc0 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -10,6 +10,9 @@ android {
targetSdkVersion 24
versionCode 1
versionName "1.0"
+ jackOptions {
+ enabled true
+ }
}
buildTypes {
release {
@@ -17,6 +20,10 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
+ compileOptions {
+ targetCompatibility 1.8
+ sourceCompatibility 1.8
+ }
}
diff --git a/app/src/main/java/me/impy/aegis/KeyProfile.java b/app/src/main/java/me/impy/aegis/KeyProfile.java
index bf3d9172..e928a7a8 100644
--- a/app/src/main/java/me/impy/aegis/KeyProfile.java
+++ b/app/src/main/java/me/impy/aegis/KeyProfile.java
@@ -1,6 +1,7 @@
package me.impy.aegis;
import java.io.Serializable;
+import java.security.Key;
import me.impy.aegis.crypto.KeyInfo;
@@ -9,5 +10,15 @@ public class KeyProfile implements Serializable {
public String Icon;
public String Code;
public KeyInfo Info;
+ public int Order;
public int ID;
+
+
+ public int compareTo(KeyProfile another) {
+ if (this.Order>another.Order){
+ return -1;
+ }else{
+ return 1;
+ }
+ }
}
diff --git a/app/src/main/java/me/impy/aegis/KeyProfileAdapter.java b/app/src/main/java/me/impy/aegis/KeyProfileAdapter.java
index 31cb1766..9739f6bc 100644
--- a/app/src/main/java/me/impy/aegis/KeyProfileAdapter.java
+++ b/app/src/main/java/me/impy/aegis/KeyProfileAdapter.java
@@ -2,6 +2,7 @@ package me.impy.aegis;
import android.animation.ObjectAnimator;
import android.os.Handler;
+import android.provider.ContactsContract;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
@@ -16,11 +17,13 @@ import com.amulyakhare.textdrawable.util.ColorGenerator;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import me.impy.aegis.crypto.OTP;
+import me.impy.aegis.db.Database;
import me.impy.aegis.helpers.ItemTouchHelperAdapter;
public class KeyProfileAdapter extends RecyclerView.Adapter implements ItemTouchHelperAdapter {
@@ -52,28 +55,46 @@ public class KeyProfileAdapter extends RecyclerView.Adapter comparator = new Comparator() {
+ @Override
+ public int compare(KeyProfile keyProfile, KeyProfile t1) {
+ return keyProfile.Order - t1.Order;
+ }
+ };
+
+ for(int i = startPosition; i < mKeyProfiles.size(); i++)
+ {
+ mKeyProfiles.get(i).Order = i + 1;
+ }
}
// Create new views (invoked by the layout manager)
- @Override
- public KeyProfileHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- // create a new view
- View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_keyprofile, parent, false);
- // set the view's size, margins, paddings and layout parameters
-
- KeyProfileHolder vh = new KeyProfileHolder(v);
- return vh;
- }
-
- // Replace the contents of a view (invoked by the layout manager)
- @Override
- public void onBindViewHolder(final KeyProfileHolder holder, int position) {
- holder.setData(mKeyProfiles.get(position));
- holder.updateCode();
- lstHolders.add(holder);
-
- timer.schedule(new TimerTask() {
@Override
+ public KeyProfileHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ // create a new view
+ View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_keyprofile, parent, false);
+ // set the view's size, margins, paddings and layout parameters
+
+ KeyProfileHolder vh = new KeyProfileHolder(v);
+ return vh;
+ }
+
+ // Replace the contents of a view (invoked by the layout manager)
+ @Override
+ public void onBindViewHolder(final KeyProfileHolder holder, int position) {
+ holder.setData(mKeyProfiles.get(position));
+ holder.updateCode();
+ lstHolders.add(holder);
+
+ timer.schedule(new TimerTask() {
+ @Override
public void run() {
uiHandler.post(new Runnable() {
@Override
diff --git a/app/src/main/java/me/impy/aegis/MainActivity.java b/app/src/main/java/me/impy/aegis/MainActivity.java
index b4c14cf5..70a33e46 100644
--- a/app/src/main/java/me/impy/aegis/MainActivity.java
+++ b/app/src/main/java/me/impy/aegis/MainActivity.java
@@ -23,6 +23,8 @@ import android.widget.Toast;
import com.yarolegovich.lovelydialog.LovelyTextInputDialog;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
import me.impy.aegis.crypto.CryptoUtils;
import me.impy.aegis.crypto.OTP;
@@ -111,7 +113,14 @@ public class MainActivity extends AppCompatActivity {
touchHelper.attachToRecyclerView(rvKeyProfiles);
rvKeyProfiles.setAdapter(mKeyProfileAdapter);
-
+ Comparator comparator = new Comparator() {
+ @Override
+ public int compare(KeyProfile keyProfile, KeyProfile t1) {
+ return keyProfile.Order - t1.Order;
+ }
+ };
+ Collections.sort(mKeyProfiles, comparator);
+
try {
for (KeyProfile profile : database.getKeys()) {
mKeyProfiles.add(profile);
@@ -149,6 +158,7 @@ public class MainActivity extends AppCompatActivity {
return;
}
+ keyProfile.Order = mKeyProfiles.size() + 1;
keyProfile.Code = otp;
mKeyProfiles.add(keyProfile);
mKeyProfileAdapter.notifyDataSetChanged();
@@ -162,12 +172,41 @@ public class MainActivity extends AppCompatActivity {
}
}
+ private void adjustOrder(int startPosition)
+ {
+ Comparator comparator = new Comparator() {
+ @Override
+ public int compare(KeyProfile keyProfile, KeyProfile t1) {
+ return keyProfile.Order - t1.Order;
+ }
+ };
+
+ for(int i = startPosition; i < mKeyProfiles.size(); i++)
+ {
+ mKeyProfiles.get(i).Order = i + 1;
+ }
+ }
+
@Override
protected void onResume() {
super.onResume();
setPreferredTheme();
}
+ @Override
+ protected void onPause() {
+ for(int i = 0; i < mKeyProfiles.size(); i++)
+ {
+ try {
+ database.updateKey(mKeyProfiles.get(i));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ super.onPause();
+ }
+
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
diff --git a/app/src/main/java/me/impy/aegis/db/Database.java b/app/src/main/java/me/impy/aegis/db/Database.java
index fdca08ee..f7f78a00 100644
--- a/app/src/main/java/me/impy/aegis/db/Database.java
+++ b/app/src/main/java/me/impy/aegis/db/Database.java
@@ -6,6 +6,7 @@ import net.sqlcipher.Cursor;
import net.sqlcipher.database.SQLiteDatabase;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import me.impy.aegis.KeyProfile;
@@ -43,8 +44,8 @@ public class Database {
}
public void updateKey(KeyProfile profile) throws Exception {
- db.execSQL("update otp set name=? url=? where id=?",
- new Object[]{ profile.Name, profile.Info.getURL(), profile.ID });
+ db.execSQL("update otp set name=?, url=?, 'order'=? where id=?",
+ new Object[]{ profile.Name, profile.Info.getURL(), profile.Order, profile.ID });
}
public void removeKey(KeyProfile profile) {
@@ -53,19 +54,20 @@ public class Database {
public List getKeys() throws Exception {
List list = new ArrayList<>();
- Cursor cursor = db.rawQuery("select * from otp", null);
+ Cursor cursor = db.rawQuery("select * from otp order by 'order' desc", null);
try {
while (cursor.moveToNext()) {
KeyProfile profile = new KeyProfile();
profile.ID = cursor.getInt(cursor.getColumnIndexOrThrow("id"));
profile.Name = cursor.getString(cursor.getColumnIndexOrThrow("name"));
-
+ profile.Order = cursor.getInt(cursor.getColumnIndexOrThrow("order"));
String url = cursor.getString(cursor.getColumnIndexOrThrow("url"));
profile.Info = KeyInfo.FromURL(url);
list.add(profile);
}
+ Collections.sort(list, (a, b) -> b.compareTo(a));
return list;
} finally {
cursor.close();
diff --git a/app/src/main/java/me/impy/aegis/db/DatabaseHelper.java b/app/src/main/java/me/impy/aegis/db/DatabaseHelper.java
index 22f07fcb..4b999ec2 100644
--- a/app/src/main/java/me/impy/aegis/db/DatabaseHelper.java
+++ b/app/src/main/java/me/impy/aegis/db/DatabaseHelper.java
@@ -18,7 +18,8 @@ public class DatabaseHelper extends SQLiteOpenHelper {
"create table otp (" +
"id integer primary key autoincrement, " +
"name varchar not null, " +
- "url varchar not null)";
+ "url varchar not null, " +
+ "'order' integer)";
public DatabaseHelper(Context context, String filename) {
super(context, filename, null, Version);