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);