From 1454b6d19cf62dd9055e364d37f945f4656f621c Mon Sep 17 00:00:00 2001 From: Felix Prahl-Kamps Date: Thu, 10 Oct 2019 13:51:24 +0200 Subject: [PATCH 1/6] improve preference screen remove unused resources --- .../mispbump/activities/HomeActivity.java | 15 ++-- .../activities/PreferenceActivity.java | 83 +++++++++++++------ .../mispbump/auxiliary/PreferenceManager.java | 48 +++++------ app/src/main/res/anim/fade_in.xml | 10 --- app/src/main/res/anim/fade_out.xml | 10 --- app/src/main/res/anim/push_up_in.xml | 14 ---- app/src/main/res/anim/push_up_out.xml | 14 ---- app/src/main/res/anim/scale_vertical.xml | 15 ---- app/src/main/res/anim/slide_in_right.xml | 14 ---- app/src/main/res/anim/slide_out_left.xml | 14 ---- app/src/main/res/animator/slide_in_left.xml | 14 ---- app/src/main/res/animator/slide_in_right.xml | 14 ---- app/src/main/res/animator/slide_out_left.xml | 13 --- app/src/main/res/animator/slide_out_right.xml | 13 --- .../res/layout/material_preference_switch.xml | 4 +- .../main/res/xml/preference_screen_main.xml | 28 ------- 16 files changed, 92 insertions(+), 231 deletions(-) delete mode 100644 app/src/main/res/anim/fade_in.xml delete mode 100644 app/src/main/res/anim/fade_out.xml delete mode 100644 app/src/main/res/anim/push_up_in.xml delete mode 100644 app/src/main/res/anim/push_up_out.xml delete mode 100644 app/src/main/res/anim/scale_vertical.xml delete mode 100644 app/src/main/res/anim/slide_in_right.xml delete mode 100644 app/src/main/res/anim/slide_out_left.xml delete mode 100644 app/src/main/res/animator/slide_in_left.xml delete mode 100644 app/src/main/res/animator/slide_in_right.xml delete mode 100644 app/src/main/res/animator/slide_out_left.xml delete mode 100644 app/src/main/res/animator/slide_out_right.xml delete mode 100644 app/src/main/res/xml/preference_screen_main.xml diff --git a/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java b/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java index e7d63d0..cee3802 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java @@ -38,16 +38,16 @@ import lu.circl.mispbump.models.restModels.User; public class HomeActivity extends AppCompatActivity { - private List syncInformationList; private PreferenceManager preferenceManager; private MispRestClient restClient; + private SwipeRefreshLayout swipeRefreshLayout; + + private List syncInformationList; private RecyclerView recyclerView; private SyncInfoAdapter syncInfoAdapter; private TextView emptyRecyclerView; - private SwipeRefreshLayout swipeRefreshLayout; - @Override protected void onCreate(Bundle savedInstanceState) { @@ -102,7 +102,7 @@ public class HomeActivity extends AppCompatActivity { swipeRefreshLayout = findViewById(R.id.swipeRefresh); swipeRefreshLayout.setOnRefreshListener(() -> { - checkUnimportedSyncs(); + onSwipeRefresh(); syncInfoAdapter.setItems(syncInformationList); }); @@ -174,7 +174,12 @@ public class HomeActivity extends AppCompatActivity { } } - private void checkUnimportedSyncs() { + private void onSwipeRefresh() { + if (preferenceManager.getShowLocalSyncsOnly()) { + swipeRefreshLayout.setRefreshing(false); + return; + } + restClient.getAllServers(new MispRestClient.AllRawServersCallback() { @Override public void success(List mispServers) { diff --git a/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java b/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java index c55439b..86aa0ae 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java @@ -1,15 +1,19 @@ package lu.circl.mispbump.activities; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentTransaction; import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceFragmentCompat; +import androidx.preference.PreferenceScreen; +import androidx.preference.SwitchPreference; import lu.circl.mispbump.R; import lu.circl.mispbump.auxiliary.PreferenceManager; @@ -17,19 +21,11 @@ import lu.circl.mispbump.auxiliary.PreferenceManager; public class PreferenceActivity extends AppCompatActivity { - private PreferenceManager preferenceManager; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_preference); - preferenceManager = PreferenceManager.getInstance(PreferenceActivity.this); - - initializeViews(); - } - - private void initializeViews() { Toolbar myToolbar = findViewById(R.id.toolbar); setSupportActionBar(myToolbar); @@ -37,29 +33,66 @@ public class PreferenceActivity extends AppCompatActivity { assert ab != null; ab.setDisplayHomeAsUpEnabled(true); - FragmentManager fragmentManager = getSupportFragmentManager(); - FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); - PreferencesFragment preferencesFragment = new PreferencesFragment(); -// preferencesFragment.onDeleteAllSyncsListener = preference -> { -// preferenceManager.clearUploadInformation(); -// return true; -// }; - - fragmentTransaction.add(R.id.fragmentContainer, preferencesFragment, PreferencesFragment.class.getSimpleName()); - fragmentTransaction.commit(); + getSupportFragmentManager() + .beginTransaction() + .add(R.id.fragmentContainer, new PreferencesFragment(PreferenceActivity.this)) + .commit(); } public static class PreferencesFragment extends PreferenceFragmentCompat { - private Preference.OnPreferenceClickListener onDeleteAllSyncsListener; + private Context context; + private PreferenceManager preferenceManager; + + PreferencesFragment(Context context) { + this.context = context; + preferenceManager = PreferenceManager.getInstance(context); + } @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - setPreferencesFromResource(R.xml.preference_screen_main, rootKey); + PreferenceScreen preferenceScreen = getPreferenceManager().createPreferenceScreen(context); + setPreferenceScreen(preferenceScreen); -// Preference deleteAllSyncInfo = findPreference("PREF_DELETE_ALL_SYNCS"); -// assert deleteAllSyncInfo != null; -// deleteAllSyncInfo.setOnPreferenceClickListener(onDeleteAllSyncsListener); + // General + + PreferenceCategory generalCategory = new PreferenceCategory(context); + generalCategory.setTitle("General"); + getPreferenceScreen().addPreference(generalCategory); + + SwitchPreference fetchOnlyLocalSyncs = new SwitchPreference(context); + fetchOnlyLocalSyncs.setTitle("Display local syncs only"); + fetchOnlyLocalSyncs.setSummaryOn("Only those syncs that were made with MISPbump are displayed."); + fetchOnlyLocalSyncs.setSummaryOff("Existing syncs from your MISP instance are fetched, too."); + fetchOnlyLocalSyncs.setChecked(preferenceManager.getShowLocalSyncsOnly()); + fetchOnlyLocalSyncs.setOnPreferenceChangeListener((preference, newValue) -> { + preferenceManager.setShowLocalSyncsOnly((boolean) newValue); + return true; + }); + + generalCategory.addPreference(fetchOnlyLocalSyncs); + + // App Information + + PreferenceCategory appInfoCategory = new PreferenceCategory(context); + appInfoCategory.setTitle("App Information"); + getPreferenceScreen().addPreference(appInfoCategory); + + Preference githubPreference = new Preference(context); + githubPreference.setIcon(context.getDrawable(R.drawable.ic_github)); + githubPreference.setTitle("Github"); + githubPreference.setSummary("Visit the Github project"); + Intent viewOnGithub = new Intent(Intent.ACTION_VIEW); + viewOnGithub.setData(Uri.parse("https://github.com/MISP/misp-bump")); + githubPreference.setIntent(viewOnGithub); + + Preference versionPreference = new Preference(context); + versionPreference.setIcon(context.getDrawable(R.drawable.ic_info_outline_dark)); + versionPreference.setTitle("Version"); + versionPreference.setSummary("1.0"); + + appInfoCategory.addPreference(githubPreference); + appInfoCategory.addPreference(versionPreference); } } } diff --git a/app/src/main/java/lu/circl/mispbump/auxiliary/PreferenceManager.java b/app/src/main/java/lu/circl/mispbump/auxiliary/PreferenceManager.java index e4622a2..314d45c 100644 --- a/app/src/main/java/lu/circl/mispbump/auxiliary/PreferenceManager.java +++ b/app/src/main/java/lu/circl/mispbump/auxiliary/PreferenceManager.java @@ -37,12 +37,16 @@ public class PreferenceManager { private static final String USER_ORG_INFOS = "user_org_infos"; private static final String SYNC_INFO = "sync_info"; - private static final String MISP_ROLES = "misp_roles"; + private static final String SHOW_MISPBUMP_SYNCS_ONLY = "show_mispbump_syncs_only"; + private SharedPreferences preferences; private static PreferenceManager instance; + private List cachedSyncInformationList; + + private PreferenceManager(Context context) { preferences = context.getSharedPreferences(PREFERENCES_FILE, Context.MODE_PRIVATE); } @@ -146,15 +150,7 @@ public class PreferenceManager { SharedPreferences.Editor editor = preferences.edit(); editor.putString(USER_ORG_INFOS, encrypted); editor.apply(); - } catch (NoSuchPaddingException e) { - e.printStackTrace(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (InvalidKeyException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - } catch (IllegalBlockSizeException e) { + } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | BadPaddingException | IllegalBlockSizeException e) { e.printStackTrace(); } @@ -175,17 +171,7 @@ public class PreferenceManager { KeyStoreWrapper keyStoreWrapper = new KeyStoreWrapper(KeyStoreWrapper.USER_ORGANISATION_INFO_ALIAS); String decrypted = keyStoreWrapper.decrypt(preferences.getString(USER_ORG_INFOS, "")); return new Gson().fromJson(decrypted, Organisation.class); - } catch (NoSuchPaddingException e) { - e.printStackTrace(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (InvalidAlgorithmParameterException e) { - e.printStackTrace(); - } catch (InvalidKeyException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - } catch (IllegalBlockSizeException e) { + } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidAlgorithmParameterException | InvalidKeyException | BadPaddingException | IllegalBlockSizeException e) { e.printStackTrace(); } @@ -223,8 +209,6 @@ public class PreferenceManager { } - private List cachedSyncInformationList; - private void loadSyncInformationList() { KeyStoreWrapper ksw = new KeyStoreWrapper(KeyStoreWrapper.SYNC_INFORMATION_ALIAS); String storedSyncInfoString = preferences.getString(SYNC_INFO, null); @@ -282,6 +266,11 @@ public class PreferenceManager { return null; } + /** + * Add or update a {@link SyncInformation} to local storage + * + * @param syncInformation to be added + */ public void addSyncInformation(SyncInformation syncInformation) { if (cachedSyncInformationList == null) { loadSyncInformationList(); @@ -330,11 +319,20 @@ public class PreferenceManager { } + public boolean getShowLocalSyncsOnly() { + return preferences.getBoolean(SHOW_MISPBUMP_SYNCS_ONLY, true); + } + + public void setShowLocalSyncsOnly(boolean showLocalSyncsOnly) { + SharedPreferences.Editor editor = preferences.edit(); + editor.putBoolean(SHOW_MISPBUMP_SYNCS_ONLY, showLocalSyncsOnly); + editor.apply(); + } + + public void clearAllData() { SharedPreferences.Editor editor = preferences.edit(); -// clearServerUrl(); -// clearAutomationKey(); clearUploadInformation(); editor.clear(); diff --git a/app/src/main/res/anim/fade_in.xml b/app/src/main/res/anim/fade_in.xml deleted file mode 100644 index c5be8dd..0000000 --- a/app/src/main/res/anim/fade_in.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - diff --git a/app/src/main/res/anim/fade_out.xml b/app/src/main/res/anim/fade_out.xml deleted file mode 100644 index 5b4342c..0000000 --- a/app/src/main/res/anim/fade_out.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - diff --git a/app/src/main/res/anim/push_up_in.xml b/app/src/main/res/anim/push_up_in.xml deleted file mode 100644 index d368e9e..0000000 --- a/app/src/main/res/anim/push_up_in.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - diff --git a/app/src/main/res/anim/push_up_out.xml b/app/src/main/res/anim/push_up_out.xml deleted file mode 100644 index a2e5466..0000000 --- a/app/src/main/res/anim/push_up_out.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - diff --git a/app/src/main/res/anim/scale_vertical.xml b/app/src/main/res/anim/scale_vertical.xml deleted file mode 100644 index 4b4dd5e..0000000 --- a/app/src/main/res/anim/scale_vertical.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - diff --git a/app/src/main/res/anim/slide_in_right.xml b/app/src/main/res/anim/slide_in_right.xml deleted file mode 100644 index 9d616b1..0000000 --- a/app/src/main/res/anim/slide_in_right.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - diff --git a/app/src/main/res/anim/slide_out_left.xml b/app/src/main/res/anim/slide_out_left.xml deleted file mode 100644 index 3199077..0000000 --- a/app/src/main/res/anim/slide_out_left.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - diff --git a/app/src/main/res/animator/slide_in_left.xml b/app/src/main/res/animator/slide_in_left.xml deleted file mode 100644 index 6faf6b9..0000000 --- a/app/src/main/res/animator/slide_in_left.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - diff --git a/app/src/main/res/animator/slide_in_right.xml b/app/src/main/res/animator/slide_in_right.xml deleted file mode 100644 index 1c7568b..0000000 --- a/app/src/main/res/animator/slide_in_right.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - diff --git a/app/src/main/res/animator/slide_out_left.xml b/app/src/main/res/animator/slide_out_left.xml deleted file mode 100644 index 3f8ac73..0000000 --- a/app/src/main/res/animator/slide_out_left.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - diff --git a/app/src/main/res/animator/slide_out_right.xml b/app/src/main/res/animator/slide_out_right.xml deleted file mode 100644 index 7eacf62..0000000 --- a/app/src/main/res/animator/slide_out_right.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - diff --git a/app/src/main/res/layout/material_preference_switch.xml b/app/src/main/res/layout/material_preference_switch.xml index f72b5d7..e23b542 100644 --- a/app/src/main/res/layout/material_preference_switch.xml +++ b/app/src/main/res/layout/material_preference_switch.xml @@ -42,9 +42,7 @@ app:layout_constraintEnd_toStartOf="@id/material_preference_switch" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/material_preference_title" - tools:text="Subtitle" - android:inAnimation="@anim/push_up_in" - android:outAnimation="@anim/push_up_out"/> + tools:text="Subtitle" /> - - - - - - - - - - - - - - - - - - From 6216543b7b812287845bfd05bcd1277eeebe6c92 Mon Sep 17 00:00:00 2001 From: Felix Prahl-Kamps Date: Thu, 10 Oct 2019 14:05:06 +0200 Subject: [PATCH 2/6] remove swipeRefreshLayout --- .../mispbump/activities/HomeActivity.java | 28 ++++--------------- .../activities/PreferenceActivity.java | 2 +- app/src/main/res/layout/activity_home.xml | 13 ++------- 3 files changed, 10 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java b/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java index cee3802..d0d7692 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java @@ -14,7 +14,6 @@ import androidx.core.app.ActivityOptionsCompat; import androidx.core.util.Pair; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.snackbar.Snackbar; @@ -41,8 +40,6 @@ public class HomeActivity extends AppCompatActivity { private PreferenceManager preferenceManager; private MispRestClient restClient; - private SwipeRefreshLayout swipeRefreshLayout; - private List syncInformationList; private RecyclerView recyclerView; private SyncInfoAdapter syncInfoAdapter; @@ -88,6 +85,10 @@ public class HomeActivity extends AppCompatActivity { protected void onResume() { super.onResume(); refreshRecyclerView(); + + if (!preferenceManager.getShowLocalSyncsOnly()) { + fetchRemoteSyncs(); + } } @@ -99,13 +100,6 @@ public class HomeActivity extends AppCompatActivity { FloatingActionButton syncFab = findViewById(R.id.home_fab); syncFab.setOnClickListener(v -> startActivity(new Intent(HomeActivity.this, ExchangeActivity.class))); - - swipeRefreshLayout = findViewById(R.id.swipeRefresh); - swipeRefreshLayout.setOnRefreshListener(() -> { - onSwipeRefresh(); - - syncInfoAdapter.setItems(syncInformationList); - }); } private void initRecyclerView() { @@ -174,12 +168,7 @@ public class HomeActivity extends AppCompatActivity { } } - private void onSwipeRefresh() { - if (preferenceManager.getShowLocalSyncsOnly()) { - swipeRefreshLayout.setRefreshing(false); - return; - } - + private void fetchRemoteSyncs() { restClient.getAllServers(new MispRestClient.AllRawServersCallback() { @Override public void success(List mispServers) { @@ -252,7 +241,6 @@ public class HomeActivity extends AppCompatActivity { } @Override public void failure(String error) { - swipeRefreshLayout.setRefreshing(false); Snackbar.make(recyclerView, error, Snackbar.LENGTH_LONG).show(); } }); @@ -260,20 +248,16 @@ public class HomeActivity extends AppCompatActivity { @Override public void failure(String error) { - swipeRefreshLayout.setRefreshing(false); Snackbar.make(recyclerView, error, Snackbar.LENGTH_LONG).show(); } }); } } - - swipeRefreshLayout.setRefreshing(false); } @Override public void failure(String error) { - Snackbar.make(swipeRefreshLayout, error, Snackbar.LENGTH_SHORT).show(); - swipeRefreshLayout.setRefreshing(false); + Snackbar.make(recyclerView, error, Snackbar.LENGTH_SHORT).show(); } }); } diff --git a/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java b/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java index 86aa0ae..a426aed 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java @@ -63,7 +63,7 @@ public class PreferenceActivity extends AppCompatActivity { SwitchPreference fetchOnlyLocalSyncs = new SwitchPreference(context); fetchOnlyLocalSyncs.setTitle("Display local syncs only"); fetchOnlyLocalSyncs.setSummaryOn("Only those syncs that were made with MISPbump are displayed."); - fetchOnlyLocalSyncs.setSummaryOff("Existing syncs from your MISP instance are fetched, too."); + fetchOnlyLocalSyncs.setSummaryOff("Existing syncs from your MISP instance are fetched (experimental)"); fetchOnlyLocalSyncs.setChecked(preferenceManager.getShowLocalSyncsOnly()); fetchOnlyLocalSyncs.setOnPreferenceChangeListener((preference, newValue) -> { preferenceManager.setShowLocalSyncsOnly((boolean) newValue); diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 6fa8ea7..712727b 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -18,18 +18,11 @@ app:popupTheme="@style/PopupTheme"/> - - - - - + android:layout_height="match_parent" /> Date: Fri, 11 Oct 2019 17:41:49 +0200 Subject: [PATCH 3/6] fix self signed flag not being pushed correctly to misp instance --- .../mispbump/activities/ProfileActivity.java | 6 +++ .../activities/SyncInfoDetailActivity.java | 40 +++++++++---------- .../mispbump/activities/UploadActivity.java | 3 +- .../mispbump/adapters/SyncInfoAdapter.java | 2 +- .../mispbump/models/SyncInformation.java | 10 ++--- .../mispbump/models/restModels/Role.java | 38 ++++++++++++++++++ 6 files changed, 70 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/lu/circl/mispbump/activities/ProfileActivity.java b/app/src/main/java/lu/circl/mispbump/activities/ProfileActivity.java index d87366b..acef7bd 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/ProfileActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/ProfileActivity.java @@ -6,6 +6,7 @@ import android.graphics.Shader; import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -122,6 +123,11 @@ public class ProfileActivity extends AppCompatActivity { MaterialPreferenceText description = findViewById(R.id.description); description.setSubtitle(organisation.getDescription()); + + Role[] roles = preferenceManager.getRoles(); + for (Role role : roles) { + Log.d("ROLES", role.toString()); + } } diff --git a/app/src/main/java/lu/circl/mispbump/activities/SyncInfoDetailActivity.java b/app/src/main/java/lu/circl/mispbump/activities/SyncInfoDetailActivity.java index e63699a..e985365 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/SyncInfoDetailActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/SyncInfoDetailActivity.java @@ -16,7 +16,6 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import com.google.android.material.floatingactionbutton.FloatingActionButton; -import com.google.android.material.snackbar.Snackbar; import java.util.UUID; @@ -36,8 +35,17 @@ public class SyncInfoDetailActivity extends AppCompatActivity { private SyncInformation syncInformation; private boolean fabMenuExpanded; - private boolean dataLocallyChanged; + private View.OnClickListener onUploadClicked = v -> { + preferenceManager.addSyncInformation(syncInformation); + Intent upload = new Intent(SyncInfoDetailActivity.this, UploadActivity.class); + upload.putExtra(UploadActivity.EXTRA_SYNC_INFO_UUID, syncInformation.getUuid().toString()); + startActivity(upload); + }; + + private View.OnClickListener onDownloadClicked = v -> { + + }; @Override protected void onCreate(Bundle savedInstanceState) { @@ -59,11 +67,6 @@ public class SyncInfoDetailActivity extends AppCompatActivity { @Override protected void onPause() { super.onPause(); - - if (dataLocallyChanged) { - syncInformation.setSyncedWithRemote(false); - } - preferenceManager.addSyncInformation(syncInformation); } @@ -185,6 +188,7 @@ public class SyncInfoDetailActivity extends AppCompatActivity { menuBackground.setClickable(false); fab.setImageDrawable(close); + assert close != null; close.start(); closeAnimation.start(); @@ -193,6 +197,7 @@ public class SyncInfoDetailActivity extends AppCompatActivity { menuBackground.setClickable(true); fab.setImageDrawable(open); + assert open != null; open.start(); openAnimation.start(); @@ -204,17 +209,8 @@ public class SyncInfoDetailActivity extends AppCompatActivity { menuBackground.setClickable(false); fab.setOnClickListener(expandCollapseClick); - fabUpload.setOnClickListener(view -> { - preferenceManager.addSyncInformation(syncInformation); - Intent upload = new Intent(SyncInfoDetailActivity.this, UploadActivity.class); - upload.putExtra(UploadActivity.EXTRA_SYNC_INFO_UUID, syncInformation.getUuid().toString()); - startActivity(upload); - }); - - fabDownload.setOnClickListener(view -> { - // TODO download content from MISP instance - Snackbar.make(view, "Not implemented yet", Snackbar.LENGTH_LONG).show(); - }); + fabUpload.setOnClickListener(onUploadClicked); + fabDownload.setOnClickListener(onDownloadClicked); } private void populateContent() { @@ -239,28 +235,28 @@ public class SyncInfoDetailActivity extends AppCompatActivity { allowSelfSigned.setChecked(syncInformation.getRemote().getServer().getSelfSigned()); allowSelfSigned.setOnCheckedChangeListener((cb, b) -> { syncInformation.getRemote().getServer().setSelfSigned(b); - dataLocallyChanged = true; + syncInformation.setHasUnpublishedChanges(true); }); MaterialPreferenceSwitch allowPush = findViewById(R.id.switch_allow_push); allowPush.setChecked(syncInformation.getRemote().getServer().getPush()); allowPush.setOnCheckedChangeListener((cb, b) -> { syncInformation.getRemote().getServer().setPush(b); - dataLocallyChanged = true; + syncInformation.setHasUnpublishedChanges(true); }); MaterialPreferenceSwitch allowPull = findViewById(R.id.switch_allow_pull); allowPull.setChecked(syncInformation.getRemote().getServer().getPull()); allowPull.setOnCheckedChangeListener((cb, b) -> { syncInformation.getRemote().getServer().setPull(b); - dataLocallyChanged = true; + syncInformation.setHasUnpublishedChanges(true); }); MaterialPreferenceSwitch allowCache = findViewById(R.id.switch_allow_cache); allowCache.setChecked(syncInformation.getRemote().getServer().getCachingEnabled()); allowCache.setOnCheckedChangeListener((cb, b) -> { syncInformation.getRemote().getServer().setCachingEnabled(b); - dataLocallyChanged = true; + syncInformation.setHasUnpublishedChanges(true); }); // credentials diff --git a/app/src/main/java/lu/circl/mispbump/activities/UploadActivity.java b/app/src/main/java/lu/circl/mispbump/activities/UploadActivity.java index 4f1fe1c..da31a7b 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/UploadActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/UploadActivity.java @@ -172,7 +172,7 @@ public class UploadActivity extends AppCompatActivity { server.setPull(syncInformation.getRemote().getServer().getPull()); server.setPush(syncInformation.getRemote().getServer().getPush()); server.setCachingEnabled(syncInformation.getRemote().getServer().getCachingEnabled()); - server.setSelfSigned(syncInformation.getRemote().getServer().getCachingEnabled()); + server.setSelfSigned(syncInformation.getRemote().getServer().getSelfSigned()); return server; } @@ -259,6 +259,7 @@ public class UploadActivity extends AppCompatActivity { private void serverAdded(Server server) { if (server != null) { serverAction.done(); + syncInformation.setHasUnpublishedChanges(false); preferenceManager.addSyncInformation(syncInformation); } else { serverAction.error("Could not create Sync Server"); diff --git a/app/src/main/java/lu/circl/mispbump/adapters/SyncInfoAdapter.java b/app/src/main/java/lu/circl/mispbump/adapters/SyncInfoAdapter.java index a5a097a..e346686 100644 --- a/app/src/main/java/lu/circl/mispbump/adapters/SyncInfoAdapter.java +++ b/app/src/main/java/lu/circl/mispbump/adapters/SyncInfoAdapter.java @@ -53,7 +53,7 @@ public class SyncInfoAdapter extends RecyclerView.Adapter Date: Sat, 12 Oct 2019 19:02:56 +0200 Subject: [PATCH 4/6] remove some animations remove unused preference remove not fully implemented fab menu remove incomplete german translation remove badge from readme --- README.md | 2 - .../mispbump/activities/HomeActivity.java | 18 +- .../activities/PreferenceActivity.java | 34 ++-- .../activities/SyncInfoDetailActivity.java | 144 +--------------- ...l_v2.xml => activity_sync_info_detail.xml} | 159 +----------------- app/src/main/res/values-de/strings.xml | 56 ------ app/src/main/res/values/strings.xml | 2 - 7 files changed, 34 insertions(+), 381 deletions(-) rename app/src/main/res/layout/{activity_sync_info_detail_v2.xml => activity_sync_info_detail.xml} (50%) delete mode 100644 app/src/main/res/values-de/strings.xml diff --git a/README.md b/README.md index 145fdff..0a5ba26 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ # MISPbump -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/72e7c12910284125b6971bb9d9c08229)](https://www.codacy.com/app/felixpk/misp-bump?utm_source=github.com&utm_medium=referral&utm_content=MISP/misp-bump&utm_campaign=Badge_Grade) - Simple and secure synchronisation of MISP instances # What is MISPbump? diff --git a/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java b/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java index d0d7692..64671eb 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java @@ -10,7 +10,6 @@ import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; -import androidx.core.app.ActivityOptionsCompat; import androidx.core.util.Pair; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -45,6 +44,11 @@ public class HomeActivity extends AppCompatActivity { private SyncInfoAdapter syncInfoAdapter; private TextView emptyRecyclerView; + private OnRecyclerItemClickListener onItemClick = (v, index) -> { + Intent detailActivity = new Intent(HomeActivity.this, SyncInfoDetailActivity.class); + detailActivity.putExtra(SyncInfoDetailActivity.EXTRA_SYNC_INFO_UUID, syncInformationList.get(index).getUuid()); + startActivity(detailActivity); + }; @Override protected void onCreate(Bundle savedInstanceState) { @@ -106,7 +110,7 @@ public class HomeActivity extends AppCompatActivity { recyclerView = findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(HomeActivity.this)); syncInfoAdapter = new SyncInfoAdapter(HomeActivity.this); - syncInfoAdapter.setOnRecyclerPositionClickListener(onRecyclerItemClickListener()); + syncInfoAdapter.setOnRecyclerPositionClickListener(onItemClick); recyclerView.setAdapter(syncInfoAdapter); } @@ -261,14 +265,4 @@ public class HomeActivity extends AppCompatActivity { } }); } - - private OnRecyclerItemClickListener onRecyclerItemClickListener() { - return (v, index) -> { - Intent i = new Intent(HomeActivity.this, SyncInfoDetailActivity.class); - i.putExtra(SyncInfoDetailActivity.EXTRA_SYNC_INFO_UUID, syncInformationList.get(index).getUuid()); - - ActivityOptionsCompat options = ActivityOptionsCompat.makeClipRevealAnimation(v.findViewById(R.id.rootLayout), (int) v.getX(), (int) v.getY(), v.getWidth(), v.getHeight()); - startActivity(i, options.toBundle()); - }; - } } diff --git a/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java b/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java index a426aed..cb57e39 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java @@ -13,10 +13,8 @@ import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceScreen; -import androidx.preference.SwitchPreference; import lu.circl.mispbump.R; -import lu.circl.mispbump.auxiliary.PreferenceManager; public class PreferenceActivity extends AppCompatActivity { @@ -42,11 +40,9 @@ public class PreferenceActivity extends AppCompatActivity { public static class PreferencesFragment extends PreferenceFragmentCompat { private Context context; - private PreferenceManager preferenceManager; PreferencesFragment(Context context) { this.context = context; - preferenceManager = PreferenceManager.getInstance(context); } @Override @@ -56,21 +52,21 @@ public class PreferenceActivity extends AppCompatActivity { // General - PreferenceCategory generalCategory = new PreferenceCategory(context); - generalCategory.setTitle("General"); - getPreferenceScreen().addPreference(generalCategory); - - SwitchPreference fetchOnlyLocalSyncs = new SwitchPreference(context); - fetchOnlyLocalSyncs.setTitle("Display local syncs only"); - fetchOnlyLocalSyncs.setSummaryOn("Only those syncs that were made with MISPbump are displayed."); - fetchOnlyLocalSyncs.setSummaryOff("Existing syncs from your MISP instance are fetched (experimental)"); - fetchOnlyLocalSyncs.setChecked(preferenceManager.getShowLocalSyncsOnly()); - fetchOnlyLocalSyncs.setOnPreferenceChangeListener((preference, newValue) -> { - preferenceManager.setShowLocalSyncsOnly((boolean) newValue); - return true; - }); - - generalCategory.addPreference(fetchOnlyLocalSyncs); +// PreferenceCategory generalCategory = new PreferenceCategory(context); +// generalCategory.setTitle("General"); +// getPreferenceScreen().addPreference(generalCategory); +// +// SwitchPreference fetchOnlyLocalSyncs = new SwitchPreference(context); +// fetchOnlyLocalSyncs.setTitle("Display local syncs only"); +// fetchOnlyLocalSyncs.setSummaryOn("Only those syncs that were made with MISPbump are displayed."); +// fetchOnlyLocalSyncs.setSummaryOff("Existing syncs from your MISP instance are fetched (experimental)"); +// fetchOnlyLocalSyncs.setChecked(preferenceManager.getShowLocalSyncsOnly()); +// fetchOnlyLocalSyncs.setOnPreferenceChangeListener((preference, newValue) -> { +// preferenceManager.setShowLocalSyncsOnly((boolean) newValue); +// return true; +// }); +// +// generalCategory.addPreference(fetchOnlyLocalSyncs); // App Information diff --git a/app/src/main/java/lu/circl/mispbump/activities/SyncInfoDetailActivity.java b/app/src/main/java/lu/circl/mispbump/activities/SyncInfoDetailActivity.java index e985365..66280af 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/SyncInfoDetailActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/SyncInfoDetailActivity.java @@ -1,15 +1,9 @@ package lu.circl.mispbump.activities; -import android.animation.Animator; -import android.animation.ValueAnimator; import android.content.Intent; -import android.graphics.drawable.AnimatedVectorDrawable; import android.os.Bundle; import android.view.View; -import android.view.animation.DecelerateInterpolator; -import android.widget.LinearLayout; -import android.widget.TextView; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; @@ -34,8 +28,6 @@ public class SyncInfoDetailActivity extends AppCompatActivity { private PreferenceManager preferenceManager; private SyncInformation syncInformation; - private boolean fabMenuExpanded; - private View.OnClickListener onUploadClicked = v -> { preferenceManager.addSyncInformation(syncInformation); Intent upload = new Intent(SyncInfoDetailActivity.this, UploadActivity.class); @@ -43,14 +35,11 @@ public class SyncInfoDetailActivity extends AppCompatActivity { startActivity(upload); }; - private View.OnClickListener onDownloadClicked = v -> { - - }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_sync_info_detail_v2); + setContentView(R.layout.activity_sync_info_detail); preferenceManager = PreferenceManager.getInstance(SyncInfoDetailActivity.this); syncInformation = preferenceManager.getSyncInformation(getExtraUuid()); @@ -60,7 +49,7 @@ public class SyncInfoDetailActivity extends AppCompatActivity { } initToolbar(); - initFabMenu(); + initViews(); populateContent(); } @@ -85,132 +74,9 @@ public class SyncInfoDetailActivity extends AppCompatActivity { ab.setDisplayHomeAsUpEnabled(true); } - private void initFabMenu() { - FloatingActionButton fab = findViewById(R.id.fab_main); - FloatingActionButton fabUpload = findViewById(R.id.fab_upload); - FloatingActionButton fabDownload = findViewById(R.id.fab_download); - - LinearLayout uploadLayout = findViewById(R.id.layout_upload); - LinearLayout downloadLayout = findViewById(R.id.layout_download); - - TextView uploadText = findViewById(R.id.fab_upload_text); - TextView downloadText = findViewById(R.id.fab_download_text); - - View menuBackground = findViewById(R.id.menu_background); - - uploadLayout.setVisibility(View.GONE); - downloadLayout.setVisibility(View.GONE); - - int animationSpeed = 200; - - ValueAnimator openAnimation = ValueAnimator.ofFloat(0f, 1f); - openAnimation.setDuration(animationSpeed); - openAnimation.setInterpolator(new DecelerateInterpolator()); - openAnimation.addUpdateListener(updateAnimation -> { - float x = (float) updateAnimation.getAnimatedValue(); - - fabUpload.setAlpha(x); - fabUpload.setTranslationY((1 - x) * 50); - uploadText.setAlpha(x); - uploadText.setTranslationX((1 - x) * -200); - - fabDownload.setAlpha(x); - fabDownload.setTranslationY((1 - x) * 50); - downloadText.setAlpha(x); - downloadText.setTranslationX((1 - x) * -200); - - menuBackground.setAlpha(x * 0.9f); - }); - openAnimation.addListener(new Animator.AnimatorListener() { - @Override - public void onAnimationStart(Animator animator) { - uploadLayout.setVisibility(View.VISIBLE); - downloadLayout.setVisibility(View.VISIBLE); - } - @Override - public void onAnimationEnd(Animator animator) { - } - @Override - public void onAnimationCancel(Animator animator) { - - } - @Override - public void onAnimationRepeat(Animator animator) { - - } - }); - - ValueAnimator closeAnimation = ValueAnimator.ofFloat(1f, 0f); - closeAnimation.setDuration(animationSpeed); - closeAnimation.setInterpolator(new DecelerateInterpolator()); - closeAnimation.addUpdateListener(updateAnimation -> { - float x = (float) updateAnimation.getAnimatedValue(); - - fabUpload.setAlpha(x); - fabUpload.setTranslationY((1 - x) * 50); - uploadText.setAlpha(x); - uploadText.setTranslationX((1 - x) * -200); - - fabDownload.setAlpha(x); - fabDownload.setTranslationY((1 - x) * 50); - downloadText.setAlpha(x); - downloadText.setTranslationX((1 - x) * -200); - - menuBackground.setAlpha(x * 0.9f); - }); - closeAnimation.addListener(new Animator.AnimatorListener() { - @Override - public void onAnimationStart(Animator animator) { - uploadLayout.setVisibility(View.VISIBLE); - downloadLayout.setVisibility(View.VISIBLE); - - } - @Override - public void onAnimationEnd(Animator animator) { - uploadLayout.setVisibility(View.GONE); - downloadLayout.setVisibility(View.GONE); - } - @Override - public void onAnimationCancel(Animator animator) { - - } - @Override - public void onAnimationRepeat(Animator animator) { - - } - }); - - AnimatedVectorDrawable open = (AnimatedVectorDrawable) getDrawable(R.drawable.animated_arrow_cloud_down); - AnimatedVectorDrawable close = (AnimatedVectorDrawable) getDrawable(R.drawable.animated_arrow_down_cloud); - - View.OnClickListener expandCollapseClick = view -> { - if (fabMenuExpanded) { - menuBackground.setClickable(false); - - fab.setImageDrawable(close); - assert close != null; - close.start(); - - closeAnimation.start(); - fabMenuExpanded = false; - } else { - menuBackground.setClickable(true); - - fab.setImageDrawable(open); - assert open != null; - open.start(); - - openAnimation.start(); - fabMenuExpanded = true; - } - }; - - menuBackground.setOnClickListener(expandCollapseClick); - menuBackground.setClickable(false); - fab.setOnClickListener(expandCollapseClick); - - fabUpload.setOnClickListener(onUploadClicked); - fabDownload.setOnClickListener(onDownloadClicked); + private void initViews() { + FloatingActionButton uploadFab = findViewById(R.id.fab_main); + uploadFab.setOnClickListener(onUploadClicked); } private void populateContent() { diff --git a/app/src/main/res/layout/activity_sync_info_detail_v2.xml b/app/src/main/res/layout/activity_sync_info_detail.xml similarity index 50% rename from app/src/main/res/layout/activity_sync_info_detail_v2.xml rename to app/src/main/res/layout/activity_sync_info_detail.xml index 5ab8915..d893df2 100644 --- a/app/src/main/res/layout/activity_sync_info_detail_v2.xml +++ b/app/src/main/res/layout/activity_sync_info_detail.xml @@ -129,54 +129,6 @@ app:offText="@string/settings_cache_off" app:onText="@string/settings_cache_on" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml deleted file mode 100644 index 4a3d7b9..0000000 --- a/app/src/main/res/values-de/strings.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - Anmelden - Abmelden - Hilfe - MISP Automatisierungs-Schlüssel - Keine Informationen - Automatisierungs-Schlüssel speichern - MISP Server URL\nDie URL unter der Ihre MISP Instanz erreichbar ist.\n\nMISP Automatisierungs Schlüssel - QR code - Synchronisation - Sie haben noch keine MISP Instanzen verknüpft - Scannen den QR code ihres Partners - Fahren sie fort, sobald dieser QR Code gescannt wurde - Weiter - Zurück - Nationalität - Sektor - Beschreibung - Einstellungen - Zugangsdaten - Authentifizierungsschlüssel - Passwort - Diese Organisation soll die folgenden Rechte erhalten - Selbstsignierte Zertifikate erlauben - Zertifikate von unbekannten CA\'s werden akzeptiert (nicht empfohlen) - Nur Zertifikate von bekannten CA\'s werden akzeptiert - Ereignisse und deren Attribute können nicht hochgeladen werden - Ereignisse und deren Attribute können hochgeladen werden - Ereignisse und deren Attribute können nicht heruntergeladen werden - Ereignisse und deren Attribute können heruntergeladen werden - Ereignisse und deren Attribute werden nicht zwischengespeichert - Ereignisse und deren Attribute werden zwischengespeichert - Zwischenspeichern - Herunterladen - Hochladen - Hochladen - MISP Instanz erreichbar - Organisation hinzufügen - Server hinzufügen - Benutzer hinzufügen - Öffentlicher Schlüssel - Scannen Sie den QR code ihres Partners - Öffentlicher Schlüssel empfangen - Synchronisations-Informationen empfangen - Synchronisations-Informationen - Alle Synchronisierungen löschen - Die Synchronisierungen werden nur lokal gelöscht - Allgemein - Besuchen Sie das Github Projekt - App Informationen - Synchronisations Details - Informationen - Änderungen hochladen - Änderungen herunterladen - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 494ae58..536e85b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,8 +12,6 @@ QR code Synchronization You have not synced any MISP instances yet - - Scan your partners QR code Continue if your partner also scanned this QR code next From a1c3a37a320baa1e02b1a16859f02254b1e7ccbe Mon Sep 17 00:00:00 2001 From: Felix Prahl-Kamps Date: Sun, 13 Oct 2019 18:24:46 +0200 Subject: [PATCH 5/6] upgraded dependencies add option to remove single sync (WIP) --- app/build.gradle | 8 +- app/src/main/AndroidManifest.xml | 6 +- .../mispbump/activities/HomeActivity.java | 105 ------------------ .../activities/PreferenceActivity.java | 13 +++ .../mispbump/activities/ProfileActivity.java | 8 +- .../activities/SyncInfoDetailActivity.java | 25 ++++- .../mispbump/adapters/SyncInfoAdapter.java | 17 +-- .../mispbump/auxiliary/MispRestClient.java | 2 +- .../res/layout/activity_sync_info_detail.xml | 1 + app/src/main/res/menu/menu_profile.xml | 3 +- app/src/main/res/menu/menu_sync_detail.xml | 9 ++ 11 files changed, 62 insertions(+), 135 deletions(-) create mode 100644 app/src/main/res/menu/menu_sync_detail.xml diff --git a/app/build.gradle b/app/build.gradle index 46df4c4..484681f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -32,17 +32,17 @@ repositories { dependencies { // android - implementation 'com.google.android.material:material:1.0.0' + implementation 'com.google.android.material:material:1.1.0-beta01' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'androidx.appcompat:appcompat:1.1.0-rc01' + implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.recyclerview:recyclerview:1.0.0' - implementation 'androidx.preference:preference:1.1.0-rc01' + implementation 'androidx.preference:preference:1.1.0' // retrofit implementation 'com.squareup.retrofit2:retrofit:2.6.1' - implementation 'com.squareup.retrofit2:converter-gson:2.6.1' + implementation 'com.squareup.retrofit2:converter-gson:2.6.2' implementation 'com.squareup.okhttp3:logging-interceptor:4.1.0' // barcode reading diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dd0814a..81375dd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,9 @@ xmlns:tools="http://schemas.android.com/tools" package="lu.circl.mispbump"> + + + - - - diff --git a/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java b/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java index 64671eb..57e34a9 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java @@ -24,20 +24,15 @@ import lu.circl.mispbump.adapters.SyncInfoAdapter; import lu.circl.mispbump.auxiliary.MispRestClient; import lu.circl.mispbump.auxiliary.PreferenceManager; import lu.circl.mispbump.interfaces.OnRecyclerItemClickListener; -import lu.circl.mispbump.models.ExchangeInformation; import lu.circl.mispbump.models.SyncInformation; -import lu.circl.mispbump.models.restModels.MispServer; -import lu.circl.mispbump.models.restModels.MispUser; import lu.circl.mispbump.models.restModels.Organisation; import lu.circl.mispbump.models.restModels.Role; -import lu.circl.mispbump.models.restModels.Server; import lu.circl.mispbump.models.restModels.User; public class HomeActivity extends AppCompatActivity { private PreferenceManager preferenceManager; - private MispRestClient restClient; private List syncInformationList; private RecyclerView recyclerView; @@ -56,8 +51,6 @@ public class HomeActivity extends AppCompatActivity { setContentView(R.layout.activity_home); preferenceManager = PreferenceManager.getInstance(this); - Pair credentials = preferenceManager.getUserCredentials(); - restClient = MispRestClient.getInstance(credentials.first, credentials.second); initViews(); initRecyclerView(); @@ -89,10 +82,6 @@ public class HomeActivity extends AppCompatActivity { protected void onResume() { super.onResume(); refreshRecyclerView(); - - if (!preferenceManager.getShowLocalSyncsOnly()) { - fetchRemoteSyncs(); - } } @@ -171,98 +160,4 @@ public class HomeActivity extends AppCompatActivity { }); } } - - private void fetchRemoteSyncs() { - restClient.getAllServers(new MispRestClient.AllRawServersCallback() { - @Override - public void success(List mispServers) { - if (mispServers.size() < 1) { - return; - } - - List syncInformationList = preferenceManager.getSyncInformationList(); - - for (MispServer mispServer : mispServers) { - - boolean existsOffline = false; - - for (SyncInformation syncInformation : syncInformationList) { - int localServerId = syncInformation.getRemote().getServer().getId(); - int remoteServerId = mispServer.getServer().getId(); - - if (remoteServerId == localServerId) { - existsOffline = true; - break; - } - } - - if (!existsOffline) { - // mispServer is not locally available - SyncInformation syncInformation = new SyncInformation(); - - ExchangeInformation local = new ExchangeInformation(); - local.setOrganisation(preferenceManager.getUserOrganisation().toSyncOrganisation()); - User syncUser = preferenceManager.getUserInfo().toSyncUser(); - syncUser.setAuthkey("Could not be recovered"); - syncUser.setPassword("Could not be recovered"); - local.setSyncUser(syncUser); - local.setServer(new Server(preferenceManager.getUserCredentials().first)); - - ExchangeInformation remote = new ExchangeInformation(); - remote.setServer(mispServer.getServer()); - - restClient.getOrganisation(mispServer.getRemoteOrganisation().getId(), new MispRestClient.OrganisationCallback() { - @Override - public void success(Organisation organisation) { - remote.setOrganisation(organisation); - - restClient.getAllUsers(new MispRestClient.AllMispUsersCallback() { - @Override - public void success(List users) { - for (MispUser mispUser : users) { - - boolean isSyncUserRole = false; - - Role[] roles = preferenceManager.getRoles(); - - for (Role role : roles) { - if (role.getId().equals(mispUser.getRole().getId())) { - isSyncUserRole = role.isSyncUserRole(); - break; - } - } - - if (mispUser.getOrganisation().getId().equals(organisation.getId()) && isSyncUserRole) { - remote.setSyncUser(mispUser.getUser()); - - syncInformation.setLocal(local); - syncInformation.setRemote(remote); - - preferenceManager.addSyncInformation(syncInformation); - refreshRecyclerView(); - } - } - } - @Override - public void failure(String error) { - Snackbar.make(recyclerView, error, Snackbar.LENGTH_LONG).show(); - } - }); - } - - @Override - public void failure(String error) { - Snackbar.make(recyclerView, error, Snackbar.LENGTH_LONG).show(); - } - }); - } - } - } - - @Override - public void failure(String error) { - Snackbar.make(recyclerView, error, Snackbar.LENGTH_SHORT).show(); - } - }); - } } diff --git a/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java b/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java index cb57e39..e61dd6b 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java @@ -5,7 +5,9 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.view.MenuItem; +import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; @@ -37,6 +39,17 @@ public class PreferenceActivity extends AppCompatActivity { .commit(); } + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + if (item.getItemId() == android.R.id.home) { + onBackPressed(); + return true; + } + + return false; + } + + public static class PreferencesFragment extends PreferenceFragmentCompat { private Context context; diff --git a/app/src/main/java/lu/circl/mispbump/activities/ProfileActivity.java b/app/src/main/java/lu/circl/mispbump/activities/ProfileActivity.java index acef7bd..d847670 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/ProfileActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/ProfileActivity.java @@ -75,11 +75,15 @@ public class ProfileActivity extends AppCompatActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == R.id.menu_delete_profile) { + if (item.getItemId() == android.R.id.home) { + onBackPressed(); + return true; + } else if (item.getItemId() == R.id.menu_delete_profile) { clearDeviceAndLogOut(); + return true; } - return super.onOptionsItemSelected(item); + return false; } diff --git a/app/src/main/java/lu/circl/mispbump/activities/SyncInfoDetailActivity.java b/app/src/main/java/lu/circl/mispbump/activities/SyncInfoDetailActivity.java index 66280af..d95d69f 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/SyncInfoDetailActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/SyncInfoDetailActivity.java @@ -3,8 +3,11 @@ package lu.circl.mispbump.activities; import android.content.Intent; import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; import android.view.View; +import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; @@ -25,6 +28,7 @@ public class SyncInfoDetailActivity extends AppCompatActivity { public static String EXTRA_SYNC_INFO_UUID = "EXTRA_SYNC_INFO_UUID"; + private UUID syncUUID; private PreferenceManager preferenceManager; private SyncInformation syncInformation; @@ -42,10 +46,11 @@ public class SyncInfoDetailActivity extends AppCompatActivity { setContentView(R.layout.activity_sync_info_detail); preferenceManager = PreferenceManager.getInstance(SyncInfoDetailActivity.this); - syncInformation = preferenceManager.getSyncInformation(getExtraUuid()); + syncUUID = getExtraUuid(); + syncInformation = preferenceManager.getSyncInformation(syncUUID); if (syncInformation == null) { - throw new RuntimeException("Could not find UploadInformation with UUID {" + getExtraUuid().toString() + "}"); + throw new RuntimeException("Could not find UploadInformation with UUID {" + syncUUID + "}"); } initToolbar(); @@ -53,6 +58,22 @@ public class SyncInfoDetailActivity extends AppCompatActivity { populateContent(); } + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_sync_detail, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + // preferenceManager.removeUploadInformation(syncUUID); + if (item.getItemId() == android.R.id.home) { + onBackPressed(); + return true; + } else return item.getItemId() == R.id.menu_delete_sync; + + } + @Override protected void onPause() { super.onPause(); diff --git a/app/src/main/java/lu/circl/mispbump/adapters/SyncInfoAdapter.java b/app/src/main/java/lu/circl/mispbump/adapters/SyncInfoAdapter.java index e346686..e5a0d41 100644 --- a/app/src/main/java/lu/circl/mispbump/adapters/SyncInfoAdapter.java +++ b/app/src/main/java/lu/circl/mispbump/adapters/SyncInfoAdapter.java @@ -53,7 +53,7 @@ public class SyncInfoAdapter extends RecyclerView.Adapter onRecyclerPositionClickListener.onClick(view, position)); } diff --git a/app/src/main/java/lu/circl/mispbump/auxiliary/MispRestClient.java b/app/src/main/java/lu/circl/mispbump/auxiliary/MispRestClient.java index 68350ed..352873f 100644 --- a/app/src/main/java/lu/circl/mispbump/auxiliary/MispRestClient.java +++ b/app/src/main/java/lu/circl/mispbump/auxiliary/MispRestClient.java @@ -60,7 +60,7 @@ public class MispRestClient { Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) - .client(getCustomClient(true, true, authkey)) + .client(getCustomClient(false, false, authkey)) .build(); mispService = retrofit.create(MispService.class); diff --git a/app/src/main/res/layout/activity_sync_info_detail.xml b/app/src/main/res/layout/activity_sync_info_detail.xml index d893df2..4a347f4 100644 --- a/app/src/main/res/layout/activity_sync_info_detail.xml +++ b/app/src/main/res/layout/activity_sync_info_detail.xml @@ -3,6 +3,7 @@ + android:title="Delete Profile" /> diff --git a/app/src/main/res/menu/menu_sync_detail.xml b/app/src/main/res/menu/menu_sync_detail.xml new file mode 100644 index 0000000..29333ef --- /dev/null +++ b/app/src/main/res/menu/menu_sync_detail.xml @@ -0,0 +1,9 @@ + + + + + + From 5494cf3d45edcf425952bdd46afb422f93d3d9f7 Mon Sep 17 00:00:00 2001 From: Felix Prahl-Kamps Date: Mon, 14 Oct 2019 11:30:13 +0200 Subject: [PATCH 6/6] add dialog to delete sync option add colors for new fabs --- .../mispbump/activities/HomeActivity.java | 23 +++++++++++ .../activities/SyncInfoDetailActivity.java | 15 ++++++- app/src/main/res/layout/activity_home.xml | 2 - app/src/main/res/layout/activity_profile.xml | 4 +- .../res/layout/activity_sync_info_detail.xml | 1 - .../main/res/layout/dialog_credentials.xml | 40 +++++++++++++++++++ app/src/main/res/menu/menu_sync_detail.xml | 2 +- app/src/main/res/values/colors.xml | 4 ++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/styles.xml | 4 ++ 10 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 app/src/main/res/layout/dialog_credentials.xml diff --git a/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java b/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java index 57e34a9..96b5827 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java @@ -43,6 +43,29 @@ public class HomeActivity extends AppCompatActivity { Intent detailActivity = new Intent(HomeActivity.this, SyncInfoDetailActivity.class); detailActivity.putExtra(SyncInfoDetailActivity.EXTRA_SYNC_INFO_UUID, syncInformationList.get(index).getUuid()); startActivity(detailActivity); + +// SyncInformation syncInfo = preferenceManager.getSyncInformation(syncInformationList.get(index).getUuid()); +// +// View dialogContent = getLayoutInflater().inflate(R.layout.dialog_credentials, null); +// +// MaterialPreferenceText url = dialogContent.findViewById(R.id.url); +// url.setSubtitle(syncInfo.getRemote().getServer().getUrl()); +// +// MaterialPreferenceText email = dialogContent.findViewById(R.id.email); +// email.setSubtitle(syncInfo.getLocal().getSyncUser().getEmail()); +// +// MaterialPasswordView authkey = dialogContent.findViewById(R.id.authkey); +// authkey.setPassword(syncInfo.getLocal().getSyncUser().getAuthkey()); +// +// MaterialPasswordView password = dialogContent.findViewById(R.id.password); +// password.setPassword(syncInfo.getLocal().getSyncUser().getPassword()); +// +// new MaterialAlertDialogBuilder(HomeActivity.this) +// .setTitle("Credentials") +// .setMessage("These credentials are valid for the sync user on your partners MISP instance") +// .setView(dialogContent) +// .setPositiveButton(android.R.string.ok, null) +// .show(); }; @Override diff --git a/app/src/main/java/lu/circl/mispbump/activities/SyncInfoDetailActivity.java b/app/src/main/java/lu/circl/mispbump/activities/SyncInfoDetailActivity.java index d95d69f..bf42147 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/SyncInfoDetailActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/SyncInfoDetailActivity.java @@ -12,6 +12,7 @@ import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.floatingactionbutton.FloatingActionButton; import java.util.UUID; @@ -66,12 +67,22 @@ public class SyncInfoDetailActivity extends AppCompatActivity { @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { - // preferenceManager.removeUploadInformation(syncUUID); if (item.getItemId() == android.R.id.home) { onBackPressed(); return true; - } else return item.getItemId() == R.id.menu_delete_sync; + } else if (item.getItemId() == R.id.menu_delete_sync) { + new MaterialAlertDialogBuilder(SyncInfoDetailActivity.this) + .setTitle("Delete Sync Locally") + .setMessage("This will not remove the information from your MISP instance.") + .setPositiveButton("Remove", (dialog, which) -> { + preferenceManager.removeUploadInformation(syncUUID); + }) + .setNegativeButton("Discard", null) + .show(); + return true; + } + return false; } @Override diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 712727b..438a083 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -39,8 +39,6 @@ android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="16dp" - app:backgroundTint="@color/colorAccent" - android:tint="@color/white" android:src="@drawable/ic_qrcode_scan"/> diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml index 054fa6a..236cc0d 100644 --- a/app/src/main/res/layout/activity_profile.xml +++ b/app/src/main/res/layout/activity_profile.xml @@ -134,8 +134,6 @@ android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="16dp" - android:backgroundTint="@color/colorAccent" - android:src="@drawable/ic_sync_black_24dp" - android:tint="@color/white"/> + android:src="@drawable/ic_sync_black_24dp" /> diff --git a/app/src/main/res/layout/activity_sync_info_detail.xml b/app/src/main/res/layout/activity_sync_info_detail.xml index 4a347f4..b9550ef 100644 --- a/app/src/main/res/layout/activity_sync_info_detail.xml +++ b/app/src/main/res/layout/activity_sync_info_detail.xml @@ -175,7 +175,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_cloud_upload" - android:tint="@color/white" android:layout_margin="16dp" android:layout_gravity="bottom|end" /> diff --git a/app/src/main/res/layout/dialog_credentials.xml b/app/src/main/res/layout/dialog_credentials.xml new file mode 100644 index 0000000..7debcfc --- /dev/null +++ b/app/src/main/res/layout/dialog_credentials.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + diff --git a/app/src/main/res/menu/menu_sync_detail.xml b/app/src/main/res/menu/menu_sync_detail.xml index 29333ef..68a3a06 100644 --- a/app/src/main/res/menu/menu_sync_detail.xml +++ b/app/src/main/res/menu/menu_sync_detail.xml @@ -4,6 +4,6 @@ + android:title="@string/label_delete_sync" /> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index fa4e0ad..9622e72 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,6 +2,10 @@ #047EB4 #066796 + + #047EB4 + #FFF + #12B3FA #FFFFFF diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 536e85b..a57ff77 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -57,4 +57,5 @@ Information Upload Changes Download Changes + Delete Synchronisation diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index e15b812..a301ef7 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -3,6 +3,10 @@