Aegis/app/src/main/java/me/impy/aegis/MainActivity.java

320 lines
12 KiB
Java
Raw Normal View History

2016-08-15 21:29:41 +02:00
package me.impy.aegis;
2016-09-30 01:08:03 +02:00
import android.app.FragmentManager;
2016-08-21 22:32:07 +02:00
import android.content.ClipData;
import android.content.ClipboardManager;
2016-08-21 22:24:04 +02:00
import android.content.Context;
2016-11-01 22:57:21 +01:00
import android.content.DialogInterface;
2016-08-15 22:31:28 +02:00
import android.content.Intent;
import android.content.SharedPreferences;
2016-11-03 22:03:34 +01:00
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.graphics.drawable.Icon;
import android.net.Uri;
import android.os.Build;
2016-09-30 01:08:03 +02:00
import android.preference.PreferenceManager;
2016-11-01 22:16:54 +01:00
import android.support.design.widget.BottomSheetDialog;
import android.support.design.widget.FloatingActionButton;
2016-11-01 22:57:21 +01:00
import android.support.v7.app.AlertDialog;
2016-08-15 21:29:41 +02:00
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
2016-08-21 22:54:27 +02:00
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.Menu;
import android.view.MenuItem;
2016-11-01 22:16:54 +01:00
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
2016-08-17 01:14:25 +02:00
import android.widget.Toast;
import java.util.ArrayList;
2016-11-03 22:03:34 +01:00
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import me.impy.aegis.crypto.CryptoUtils;
import me.impy.aegis.crypto.OTP;
import me.impy.aegis.db.Database;
2016-10-04 22:23:34 +02:00
import me.impy.aegis.helpers.SimpleItemTouchHelperCallback;
2016-08-15 21:29:41 +02:00
2016-08-21 22:24:04 +02:00
public class MainActivity extends AppCompatActivity {
2016-08-15 21:29:41 +02:00
static final int GET_KEYINFO = 1;
2016-08-24 23:48:25 +02:00
static final int ADD_KEYINFO = 2;
RecyclerView rvKeyProfiles;
KeyProfileAdapter mKeyProfileAdapter;
ArrayList<KeyProfile> mKeyProfiles;
Database database;
2016-09-30 01:08:03 +02:00
boolean nightMode = false;
2016-11-01 22:16:54 +01:00
int clickedItemPosition = -1;
2016-08-15 21:29:41 +02:00
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedPreferences prefs = this.getSharedPreferences("me.impy.aegis", Context.MODE_PRIVATE);
if(!prefs.getBoolean("passedIntro", false))
{
Intent intro = new Intent(this, IntroActivity.class);
startActivity(intro);
}
2016-09-30 01:08:03 +02:00
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
if(sharedPreferences.getBoolean("pref_night_mode", false))
{
nightMode = true;
setTheme(R.style.AppTheme_Dark_NoActionBar);
} else
{
setPreferredTheme();
}
2016-08-15 21:29:41 +02:00
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
2016-11-03 22:03:34 +01:00
initializeAppShortcuts();
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
2016-10-26 00:07:39 +02:00
fab.setOnClickListener(view -> {
Intent scannerActivity = new Intent(getApplicationContext(), ScannerActivity.class);
startActivityForResult(scannerActivity, GET_KEYINFO);
2016-08-15 22:31:28 +02:00
});
char[] password = "test".toCharArray();
database = Database.createInstance(getApplicationContext(), "keys.db", password);
CryptoUtils.zero(password);
mKeyProfiles = new ArrayList<>();
rvKeyProfiles = (RecyclerView) findViewById(R.id.rvKeyProfiles);
LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);
rvKeyProfiles.setLayoutManager(mLayoutManager);
2016-08-21 22:24:04 +02:00
final Context context = this.getApplicationContext();
2016-11-01 22:16:54 +01:00
//EditProfileBottomSheetdialog bottomSheetDialog = EditProfileBottomSheetdialog.getInstance();
mKeyProfileAdapter = new KeyProfileAdapter(mKeyProfiles);
2016-10-26 00:29:21 +02:00
mKeyProfileAdapter.setOnItemClickListener((position, v) -> {
2016-11-01 22:16:54 +01:00
clickedItemPosition = position;
InitializeBottomSheet().show();
});
//View dialogView = bottomSheetDialog.getView();
//LinearLayout copyLayout = (LinearLayout)dialogView.findViewById(R.id.copy_button);
/*copyLayout.setOnClickListener(view -> {
2016-10-26 00:29:21 +02:00
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
2016-11-01 22:16:54 +01:00
ClipData clip = ClipData.newPlainText("text/plain", mKeyProfiles.get(clickedItemPosition).Code);
2016-10-26 00:29:21 +02:00
clipboard.setPrimaryClip(clip);
Toast.makeText(context, "Code successfully copied to the clipboard", Toast.LENGTH_SHORT).show();
2016-11-01 22:16:54 +01:00
});*/
2016-10-04 22:23:34 +02:00
mKeyProfileAdapter.setOnLongItemClickListener((position, v) -> {
2016-11-01 22:16:54 +01:00
});
2016-10-04 22:23:34 +02:00
ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(mKeyProfileAdapter);
ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
touchHelper.attachToRecyclerView(rvKeyProfiles);
2016-08-21 22:54:27 +02:00
rvKeyProfiles.setAdapter(mKeyProfileAdapter);
Comparator<KeyProfile> comparator = new Comparator<KeyProfile>() {
@Override
public int compare(KeyProfile keyProfile, KeyProfile t1) {
return keyProfile.Order - t1.Order;
}
};
Collections.sort(mKeyProfiles, comparator);
try {
2016-10-26 00:29:21 +02:00
mKeyProfiles.addAll(database.getKeys());
mKeyProfileAdapter.notifyDataSetChanged();
} catch (Exception e) {
e.printStackTrace();
}
2016-08-15 21:29:41 +02:00
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == GET_KEYINFO) {
if (resultCode == RESULT_OK) {
2016-08-17 01:14:25 +02:00
final KeyProfile keyProfile = (KeyProfile)data.getSerializableExtra("KeyProfile");
Intent intent = new Intent(this, AddProfileActivity.class);
2016-08-24 23:48:25 +02:00
intent.putExtra("KeyProfile", keyProfile);
startActivityForResult(intent, ADD_KEYINFO);
}
}
2016-08-24 23:48:25 +02:00
else if (requestCode == ADD_KEYINFO) {
if (resultCode == RESULT_OK) {
final KeyProfile keyProfile = (KeyProfile)data.getSerializableExtra("KeyProfile");
String otp;
try {
otp = OTP.generateOTP(keyProfile.Info);
} catch (Exception e) {
e.printStackTrace();
return;
}
keyProfile.Order = mKeyProfiles.size() + 1;
2016-08-24 23:48:25 +02:00
keyProfile.Code = otp;
mKeyProfiles.add(keyProfile);
mKeyProfileAdapter.notifyDataSetChanged();
try {
database.addKey(keyProfile);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
2016-09-30 01:08:03 +02:00
@Override
protected void onResume() {
super.onResume();
mKeyProfileAdapter.notifyDataSetChanged();
2016-09-30 01:08:03 +02:00
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();
}
2016-11-01 22:16:54 +01:00
private BottomSheetDialog InitializeBottomSheet()
{
View bottomSheetView = getLayoutInflater ().inflate (R.layout.bottom_sheet_edit_profile, null);
LinearLayout copyLayout = (LinearLayout)bottomSheetView.findViewById(R.id.copy_button);
LinearLayout deleteLayout = (LinearLayout)bottomSheetView.findViewById(R.id.delete_button);
LinearLayout editLayout = (LinearLayout)bottomSheetView.findViewById(R.id.edit_button);
bottomSheetView.findViewById(R.id.edit_button);
BottomSheetDialog bottomDialog = new BottomSheetDialog(this);
bottomDialog.setContentView(bottomSheetView);
bottomDialog.setCancelable (true);
bottomDialog.getWindow ().setLayout (LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
bottomDialog.show();
copyLayout.setOnClickListener(view -> {
bottomDialog.dismiss();
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("text/plain", mKeyProfiles.get(clickedItemPosition).Code);
clipboard.setPrimaryClip(clip);
Toast.makeText(this.getApplicationContext(), "Code successfully copied to the clipboard", Toast.LENGTH_SHORT).show();
});
2016-11-01 22:57:21 +01:00
deleteLayout.setOnClickListener(view -> {
bottomDialog.dismiss();
KeyProfile keyProfile = mKeyProfiles.get(clickedItemPosition);
deleteProfile(keyProfile);
});
editLayout.setOnClickListener(view -> {
bottomDialog.dismiss();
Toast.makeText(this.getApplicationContext(), "Coming soon", Toast.LENGTH_SHORT).show();
});
2016-11-01 22:16:54 +01:00
return bottomDialog;
2016-11-01 22:57:21 +01:00
}
2016-11-01 22:16:54 +01:00
2016-11-01 22:57:21 +01:00
private void deleteProfile(KeyProfile profile)
{
new AlertDialog.Builder(MainActivity.this)
.setTitle("Delete entry")
.setMessage("Are you sure you want to delete this profile?")
.setPositiveButton(android.R.string.yes, (dialog, which) -> {
database.removeKey(profile);
mKeyProfiles.remove(clickedItemPosition);
mKeyProfileAdapter.notifyItemRemoved(clickedItemPosition);
})
.setNegativeButton(android.R.string.no, (dialog, which) -> {
})
.show();
2016-11-01 22:16:54 +01:00
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
2016-09-30 01:07:56 +02:00
Intent preferencesActivity = new Intent(this, PreferencesActivity.class);
startActivity(preferencesActivity);
return true;
}
return super.onOptionsItemSelected(item);
}
2016-09-30 01:08:03 +02:00
2016-11-03 22:03:34 +01:00
private void initializeAppShortcuts()
{
ShortcutManager shortcutManager = null;
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
shortcutManager = getSystemService(ShortcutManager.class);
if(shortcutManager != null) {
if (shortcutManager.getDynamicShortcuts().size() == 0) {
// Application restored. Need to re-publish dynamic shortcuts.
ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "id1")
.setShortLabel("Web site")
.setLongLabel("Add new profile")
.setIcon(Icon.createWithResource(this.getApplicationContext(), R.drawable.intro_scanner))
.setIntent(new Intent(Intent.ACTION_VIEW, Uri.EMPTY, this, ScannerActivity.class))
.build();
shortcutManager.setDynamicShortcuts(Arrays.asList(shortcut));
}
}
}
}
2016-09-30 01:08:03 +02:00
private void setPreferredTheme()
{
2016-10-26 00:07:39 +02:00
boolean restart = false;
2016-09-30 01:08:03 +02:00
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
2016-10-26 00:07:39 +02:00
if(sharedPreferences.getBoolean("pref_night_mode", false)) {
if(!nightMode) {
2016-09-30 01:08:03 +02:00
setTheme(R.style.AppTheme_Dark_NoActionBar);
2016-10-26 00:07:39 +02:00
restart = true;
2016-09-30 01:08:03 +02:00
}
2016-10-26 00:07:39 +02:00
} else {
if(nightMode) {
2016-09-30 01:08:03 +02:00
setTheme(R.style.AppTheme_Default_NoActionBar);
2016-10-26 00:07:39 +02:00
restart = true;
2016-09-30 01:08:03 +02:00
}
}
2016-10-26 00:07:39 +02:00
if(restart){
finish();
startActivity(new Intent(this, this.getClass()));
}
2016-09-30 01:08:03 +02:00
}
2016-08-15 21:29:41 +02:00
}