소스 검색

add material preference switch to detail view

update gradle
add animations
remove expandable card view
pull/8/head
Felix Prahl-Kamps 1 년 전
부모
커밋
21af9e1307
14개의 변경된 파일547개의 추가작업 그리고 362개의 파일을 삭제
  1. +0
    -1
      app/build.gradle
  2. +1
    -1
      app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java
  3. +1
    -1
      app/src/main/java/lu/circl/mispbump/activities/LauncherActivity.java
  4. +3
    -7
      app/src/main/java/lu/circl/mispbump/activities/LoginActivity.java
  5. +162
    -48
      app/src/main/java/lu/circl/mispbump/activities/SyncInfoDetailActivity.java
  6. +17
    -0
      app/src/main/java/lu/circl/mispbump/adapters/SyncInfoAdapter.java
  7. +23
    -13
      app/src/main/java/lu/circl/mispbump/customViews/MaterialPreferenceSwitch.java
  8. +8
    -0
      app/src/main/java/lu/circl/mispbump/models/SyncInformation.java
  9. +0
    -289
      app/src/main/res/layout/activity_sync_info_detail.xml
  10. +324
    -0
      app/src/main/res/layout/activity_sync_info_detail_v2.xml
  11. +3
    -0
      app/src/main/res/values-de/strings.xml
  12. +3
    -0
      app/src/main/res/values/strings.xml
  13. +1
    -1
      build.gradle
  14. +1
    -1
      settings.gradle

+ 0
- 1
app/build.gradle 파일 보기

@@ -57,5 +57,4 @@ dependencies {
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation project(path: ':expandablecardview')
}

+ 1
- 1
app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java 파일 보기

@@ -111,7 +111,7 @@ public class HomeActivity extends AppCompatActivity {
private void initRecyclerView() {
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(HomeActivity.this));
syncInfoAdapter = new SyncInfoAdapter();
syncInfoAdapter = new SyncInfoAdapter(HomeActivity.this);
syncInfoAdapter.setOnRecyclerPositionClickListener(onRecyclerItemClickListener());
recyclerView.setAdapter(syncInfoAdapter);
}


+ 1
- 1
app/src/main/java/lu/circl/mispbump/activities/LauncherActivity.java 파일 보기

@@ -26,7 +26,7 @@ public class LauncherActivity extends AppCompatActivity {
startActivity(login);
}

// closes the activity to prevent going back to this (empty) activity
// close activity to prevent going back
finish();
}



+ 3
- 7
app/src/main/java/lu/circl/mispbump/activities/LoginActivity.java 파일 보기

@@ -189,10 +189,8 @@ public class LoginActivity extends AppCompatActivity {
};

/**
* TODO: Check if url is valid.
*
* @param url url to check
* @return true or false
* @return true if valid else false
*/
private boolean isValidUrl(String url) {
Uri uri = Uri.parse(url);
@@ -205,12 +203,10 @@ public class LoginActivity extends AppCompatActivity {
}

/**
* TODO: Check if automation key is valid.
*
* @param automationKey the key to check
* @return true or false
* @return true if not empty else false
*/
private boolean isValidAutomationKey(String automationKey) {
return !automationKey.equals("");
return !automationKey.isEmpty();
}
}

+ 162
- 48
app/src/main/java/lu/circl/mispbump/activities/SyncInfoDetailActivity.java 파일 보기

@@ -1,19 +1,16 @@
package lu.circl.mispbump.activities;


import android.animation.Animator;
import android.animation.ValueAnimator;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.AnimatedVectorDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroupOverlay;
import android.widget.CheckBox;
import android.view.animation.DecelerateInterpolator;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
@@ -25,6 +22,7 @@ import java.util.UUID;
import lu.circl.mispbump.R;
import lu.circl.mispbump.auxiliary.PreferenceManager;
import lu.circl.mispbump.customViews.MaterialPasswordView;
import lu.circl.mispbump.customViews.MaterialPreferenceSwitch;
import lu.circl.mispbump.customViews.MaterialPreferenceText;
import lu.circl.mispbump.models.SyncInformation;

@@ -37,12 +35,13 @@ public class SyncInfoDetailActivity extends AppCompatActivity {
private SyncInformation syncInformation;

private boolean fabMenuExpanded;
private boolean dataLocallyChanged;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sync_info_detail);
setContentView(R.layout.activity_sync_info_detail_v2);

preferenceManager = PreferenceManager.getInstance(SyncInfoDetailActivity.this);
syncInformation = preferenceManager.getSyncInformation(getExtraUuid());
@@ -59,6 +58,11 @@ public class SyncInfoDetailActivity extends AppCompatActivity {
@Override
protected void onPause() {
super.onPause();

if (dataLocallyChanged) {
syncInformation.setSyncedWithRemote(false);
}

preferenceManager.addSyncInformation(syncInformation);
}

@@ -85,25 +89,121 @@ public class SyncInfoDetailActivity extends AppCompatActivity {
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);

fab.setOnClickListener(view -> {
if (fabMenuExpanded) {
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);
close.start();

closeAnimation.start();
fabMenuExpanded = false;
} else {
uploadLayout.setVisibility(View.VISIBLE);
downloadLayout.setVisibility(View.VISIBLE);
menuBackground.setClickable(true);

fab.setImageDrawable(open);
open.start();

openAnimation.start();
fabMenuExpanded = true;
}
});
};

fabUpload.setOnClickListener(view -> {
menuBackground.setOnClickListener(expandCollapseClick);
menuBackground.setClickable(false);
fab.setOnClickListener(expandCollapseClick);

fabUpload.setOnClickListener(view -> {
preferenceManager.addSyncInformation(syncInformation);

Intent upload = new Intent(SyncInfoDetailActivity.this, UploadActivity.class);
@@ -134,24 +234,61 @@ public class SyncInfoDetailActivity extends AppCompatActivity {

// settings

CheckBox allowSelfSigned = findViewById(R.id.checkbox_self_signed);
MaterialPreferenceSwitch allowSelfSigned = findViewById(R.id.switch_allow_self_signed);
allowSelfSigned.setChecked(syncInformation.getRemote().getServer().getSelfSigned());
allowSelfSigned.setOnCheckedChangeListener((compoundButton, b) -> {
allowSelfSigned.setOnCheckedChangeListener((cb, b) -> {
syncInformation.getRemote().getServer().setSelfSigned(b);
dataLocallyChanged = 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;
});

CheckBox push = findViewById(R.id.checkbox_push);
push.setChecked(syncInformation.getRemote().getServer().getPush());
push.setOnCheckedChangeListener((compoundButton, b) -> syncInformation.getRemote().getServer().setPush(b));
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;
});

CheckBox pull = findViewById(R.id.checkbox_pull);
pull.setChecked(syncInformation.getRemote().getServer().getPull());
pull.setOnCheckedChangeListener((compundButton, b) -> syncInformation.getRemote().getServer().setPull(b));
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;
});

CheckBox cache = findViewById(R.id.checkbox_cache);
cache.setChecked(syncInformation.getRemote().getServer().getCachingEnabled());
cache.setOnCheckedChangeListener((compoundButton, b) -> syncInformation.getRemote().getServer().setCachingEnabled(b));
// CheckBox allowSelfSigned = findViewById(R.id.checkbox_self_signed);
// allowSelfSigned.setChecked(syncInformation.getRemote().getServer().getSelfSigned());
// allowSelfSigned.setOnCheckedChangeListener((compoundButton, b) -> {
// syncInformation.getRemote().getServer().setSelfSigned(b);
// dataLocallyChanged = true;
// });

// CheckBox push = findViewById(R.id.checkbox_push);
// push.setChecked(syncInformation.getRemote().getServer().getPush());
// push.setOnCheckedChangeListener((compoundButton, b) -> {
// syncInformation.getRemote().getServer().setPush(b);
// dataLocallyChanged = true;
// });
//
// CheckBox pull = findViewById(R.id.checkbox_pull);
// pull.setChecked(syncInformation.getRemote().getServer().getPull());
// pull.setOnCheckedChangeListener((compundButton, b) -> {
// syncInformation.getRemote().getServer().setPull(b);
// dataLocallyChanged = true;
// });
//
// CheckBox cache = findViewById(R.id.checkbox_cache);
// cache.setChecked(syncInformation.getRemote().getServer().getCachingEnabled());
// cache.setOnCheckedChangeListener((compoundButton, b) -> {
// syncInformation.getRemote().getServer().setCachingEnabled(b);
// dataLocallyChanged = true;
// });

// credentials

@@ -164,27 +301,4 @@ public class SyncInfoDetailActivity extends AppCompatActivity {
MaterialPasswordView authkey = findViewById(R.id.authkey);
authkey.setPassword(syncInformation.getLocal().getSyncUser().getAuthkey());
}


public static void applyDim(@NonNull ViewGroup parent, float dimAmount) {
// ViewGroup root = (ViewGroup) getWindow().getDecorView().getRootView();
Drawable dim = new ColorDrawable(Color.BLACK);
dim.setBounds(0, 0, parent.getWidth(), parent.getHeight());

ValueAnimator valueAnimator = ValueAnimator.ofFloat(dimAmount);

valueAnimator.addUpdateListener(valueAnim -> {
float value = (float) valueAnim.getAnimatedValue();
dim.setAlpha((int) (255 * value));
ViewGroupOverlay overlay = parent.getOverlay();
overlay.add(dim);
});

valueAnimator.start();
}

public static void clearDim(@NonNull ViewGroup parent) {
ViewGroupOverlay overlay = parent.getOverlay();
overlay.clear();
}
}

+ 17
- 0
app/src/main/java/lu/circl/mispbump/adapters/SyncInfoAdapter.java 파일 보기

@@ -1,6 +1,8 @@
package lu.circl.mispbump.adapters;


import android.content.Context;
import android.content.res.ColorStateList;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -8,6 +10,7 @@ import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.core.widget.ImageViewCompat;
import androidx.recyclerview.widget.RecyclerView;

import java.text.SimpleDateFormat;
@@ -21,10 +24,16 @@ import lu.circl.mispbump.models.SyncInformation;

public class SyncInfoAdapter extends RecyclerView.Adapter<SyncInfoAdapter.ViewHolder> {

private Context context;
private List<SyncInformation> items;
private OnRecyclerItemClickListener<Integer> onRecyclerPositionClickListener;


public SyncInfoAdapter(Context context) {
this.context = context;
}


@NonNull
@Override
public SyncInfoAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
@@ -44,6 +53,14 @@ public class SyncInfoAdapter extends RecyclerView.Adapter<SyncInfoAdapter.ViewHo

holder.orgName.setText(item.getRemote().getOrganisation().getName());

if (item.isSyncedWithRemote()) {
ImageViewCompat.setImageTintList(holder.syncStatus, ColorStateList.valueOf(context.getColor(R.color.status_green)));
holder.syncStatus.setImageResource(R.drawable.ic_check_outline);
} else {
ImageViewCompat.setImageTintList(holder.syncStatus, ColorStateList.valueOf(context.getColor(R.color.status_amber)));
holder.syncStatus.setImageResource(R.drawable.ic_error_outline);
}

// switch (item.getCurrentSyncStatus()) {
// case COMPLETE:
// ImageViewCompat.setImageTintList(holder.syncStatus, ColorStateList.valueOf(context.getColor(R.color.status_green)));


+ 23
- 13
app/src/main/java/lu/circl/mispbump/customViews/MaterialPreferenceSwitch.java 파일 보기

@@ -17,16 +17,15 @@ import lu.circl.mispbump.R;

public class MaterialPreferenceSwitch extends ConstraintLayout {

private View rootView;

private TextView titleView, subTitleView;
private Switch switchView;
private CompoundButton.OnCheckedChangeListener onCheckedChangeListener;

public MaterialPreferenceSwitch(Context context, AttributeSet attrs) {
super(context, attrs);

View view = LayoutInflater.from(context).inflate(R.layout.material_preference_switch, this);
rootView = view.findViewById(R.id.rootLayout);
View rootView = view.findViewById(R.id.rootLayout);

TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.MaterialPreferenceSwitch);
String title = a.getString(R.styleable.MaterialPreferenceSwitch_title);
@@ -42,22 +41,29 @@ public class MaterialPreferenceSwitch extends ConstraintLayout {

switchView = view.findViewById(R.id.material_preference_switch);

rootView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (switchView.isEnabled()) {
switchView.setChecked(!switchView.isChecked());
}
rootView.setOnClickListener(v -> {
if (switchView.isEnabled()) {
switchView.setChecked(!switchView.isChecked());
}
});

switchView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
switchView.setOnCheckedChangeListener((buttonView, isChecked) -> {

if (onCheckedChangeListener != null) {
onCheckedChangeListener.onCheckedChanged(buttonView, isChecked);
}

if (isChecked) {
if (!onText.isEmpty()) {
subTitleView.setText(onText);
} else {
subTitleView.setVisibility(GONE);
}
} else {
if (!offText.isEmpty()) {
subTitleView.setText(offText);
} else {
subTitleView.setVisibility(GONE);
}
}
});
@@ -75,4 +81,8 @@ public class MaterialPreferenceSwitch extends ConstraintLayout {
return switchView.isChecked();
}

public void setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener onCheckedChangeListener) {
this.onCheckedChangeListener = onCheckedChangeListener;
}

}

+ 8
- 0
app/src/main/java/lu/circl/mispbump/models/SyncInformation.java 파일 보기

@@ -21,6 +21,8 @@ public class SyncInformation {
private ExchangeInformation remote;
private ExchangeInformation local;

private boolean syncedWithRemote;


public SyncInformation() {
uuid = UUID.randomUUID();
@@ -60,6 +62,12 @@ public class SyncInformation {
return df.format(date);
}

public void setSyncedWithRemote(boolean syncedWithRemote) {
this.syncedWithRemote = syncedWithRemote;
}
public boolean isSyncedWithRemote() {
return syncedWithRemote;
}

public ExchangeInformation getRemote() {
return remote;


+ 0
- 289
app/src/main/res/layout/activity_sync_info_detail.xml 파일 보기

@@ -1,289 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>

<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.SyncInfoDetailActivity"
android:orientation="vertical">

<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:theme="@style/ToolbarTheme"
app:popupTheme="@style/PopupTheme" />
</com.google.android.material.appbar.AppBarLayout>

<ScrollView
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<lu.circl.expandablecardview.ExpandableCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:card_header_background_color="@color/colorPrimary"
app:card_header_foreground_color="@color/white"
app:card_icon="@drawable/ic_info_outline"
app:card_title="Information">

<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<lu.circl.mispbump.customViews.MaterialPreferenceText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:title="Name"
app:subtitle="No name" />

<lu.circl.mispbump.customViews.MaterialPreferenceText
android:id="@+id/uuid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/name"
app:layout_constraintEnd_toEndOf="parent"
app:title="UUID"
app:subtitle="No UUID" />

<lu.circl.mispbump.customViews.MaterialPreferenceText
android:id="@+id/sector"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/uuid"
app:layout_constraintEnd_toEndOf="parent"
app:title="Sector"
app:subtitle="No sector" />

<lu.circl.mispbump.customViews.MaterialPreferenceText
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/uuid"
app:layout_constraintEnd_toEndOf="parent"
app:title="@string/description"
app:subtitle="No description" />
</LinearLayout>

</lu.circl.expandablecardview.ExpandableCardView>


<lu.circl.expandablecardview.ExpandableCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:card_header_background_color="@color/colorPrimary"
app:card_header_foreground_color="@color/white"
app:card_icon="@drawable/ic_settings"
app:card_title="@string/settings">

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">

<CheckBox
android:id="@+id/checkbox_self_signed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:text="@string/settings_self_signed_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<CheckBox
android:id="@+id/checkbox_push"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:text="@string/settings_push_title"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/checkbox_self_signed" />

<CheckBox
android:id="@+id/checkbox_pull"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginTop="8dp"
android:text="@string/settings_pull_title"
app:layout_constraintStart_toEndOf="@+id/checkbox_push"
app:layout_constraintTop_toBottomOf="@id/checkbox_self_signed" />

<CheckBox
android:id="@+id/checkbox_cache"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="16dp"
android:text="@string/settings_cache_title"
app:layout_constraintTop_toBottomOf="@id/checkbox_push"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

</lu.circl.expandablecardview.ExpandableCardView>


<lu.circl.expandablecardview.ExpandableCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:card_header_background_color="@color/colorPrimary"
app:card_header_foreground_color="@color/white"
app:card_icon="@drawable/ic_verified_user"
app:card_title="@string/credentials">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<lu.circl.mispbump.customViews.MaterialPreferenceText
android:id="@+id/email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:title="Email"
app:subtitle="Keine Ahnung" />

<lu.circl.mispbump.customViews.MaterialPasswordView
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="Password"
app:password="Weiß ich leider auch nicht" />

<lu.circl.mispbump.customViews.MaterialPasswordView
android:id="@+id/authkey"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="Authkey"
app:password="Den erst recht nicht ..." />

</LinearLayout>

</lu.circl.expandablecardview.ExpandableCardView>

<View
android:layout_width="match_parent"
android:layout_height="86dp"/>

</LinearLayout>

</ScrollView>

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_gravity="bottom|end"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false">

<!-- <FrameLayout-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent"-->
<!-- android:background="@color/black_50"/>-->

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_keyboard_arrow_down"
android:tint="@color/white"
android:layout_margin="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>

<LinearLayout
android:id="@+id/layout_upload"
android:visibility="visible"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:padding="8dp"
android:clipToPadding="false"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/fab_main">

<TextView
android:text="Upload to MISP instance"
android:textColor="@color/white"
android:padding="8dp"
android:background="@drawable/tooltip_background"
android:backgroundTint="@color/black_70"
android:layout_gravity="center_vertical"
android:layout_marginEnd="16dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_upload"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_cloud_upload"
app:fabSize="mini"/>
</LinearLayout>

<LinearLayout
android:visibility="visible"
android:id="@+id/layout_download"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:padding="8dp"
android:clipToPadding="false"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/layout_upload">

<TextView
android:text="Download changes from MISP instance"
android:textColor="@color/white"
android:padding="8dp"
android:background="@drawable/tooltip_background"
android:backgroundTint="@color/black_70"
android:layout_gravity="center_vertical"
android:layout_marginEnd="16dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_download"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_cloud_download"
app:fabSize="mini"/>
</LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

+ 324
- 0
app/src/main/res/layout/activity_sync_info_detail_v2.xml 파일 보기

@@ -0,0 +1,324 @@
<?xml version="1.0" encoding="utf-8"?>

<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.SyncInfoDetailActivity"
android:orientation="vertical">

<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:theme="@style/ToolbarTheme"
app:popupTheme="@style/PopupTheme" />
</com.google.android.material.appbar.AppBarLayout>

<ScrollView
android:id="@+id/scrollview"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:id="@+id/scrollview_content"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="80dp"
android:alpha="1">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:textColor="@color/colorPrimary"
android:text="@string/information"
android:textAppearance="@style/TextAppearance.MaterialComponents.Overline" />

<lu.circl.mispbump.customViews.MaterialPreferenceText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:title="Name"
app:subtitle="No name" />

<lu.circl.mispbump.customViews.MaterialPreferenceText
android:id="@+id/uuid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/name"
app:layout_constraintEnd_toEndOf="parent"
app:title="UUID"
app:subtitle="No UUID" />

<lu.circl.mispbump.customViews.MaterialPreferenceText
android:id="@+id/sector"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/uuid"
app:layout_constraintEnd_toEndOf="parent"
app:title="Sector"
app:subtitle="No sector" />

<lu.circl.mispbump.customViews.MaterialPreferenceText
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/uuid"
app:layout_constraintEnd_toEndOf="parent"
app:title="@string/description"
app:subtitle="No description" />

<View
android:background="@color/dividerColor"
android:layout_width="match_parent"
android:layout_height="1dp" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:textColor="@color/colorPrimary"
android:text="@string/settings"
android:textAppearance="@style/TextAppearance.MaterialComponents.Overline" />

<lu.circl.mispbump.customViews.MaterialPreferenceSwitch
android:id="@+id/switch_allow_self_signed"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:title="@string/settings_self_signed_title"
app:offText="@string/settings_self_signed_off"
app:onText="@string/settings_self_signed_on" />

<lu.circl.mispbump.customViews.MaterialPreferenceSwitch
android:id="@+id/switch_allow_push"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:title="@string/settings_push_title"
app:offText="@string/settings_push_off"
app:onText="@string/settings_push_on" />

<lu.circl.mispbump.customViews.MaterialPreferenceSwitch
android:id="@+id/switch_allow_pull"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:title="@string/settings_pull_title"
app:offText="@string/settings_pull_off"
app:onText="@string/settings_pull_on" />

<lu.circl.mispbump.customViews.MaterialPreferenceSwitch
android:id="@+id/switch_allow_cache"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:title="@string/settings_cache_title"
app:offText="@string/settings_cache_off"
app:onText="@string/settings_cache_on" />

<!-- <androidx.constraintlayout.widget.ConstraintLayout-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent">-->

<!-- <CheckBox-->
<!-- android:id="@+id/checkbox_self_signed"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_marginStart="16dp"-->
<!-- android:layout_marginTop="16dp"-->
<!-- android:text="@string/settings_self_signed_title"-->
<!-- app:layout_constraintStart_toStartOf="parent"-->
<!-- app:layout_constraintTop_toTopOf="parent" />-->

<!-- <CheckBox-->
<!-- android:id="@+id/checkbox_push"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_marginStart="16dp"-->
<!-- android:layout_marginTop="8dp"-->
<!-- android:text="@string/settings_push_title"-->
<!-- app:layout_constraintHorizontal_chainStyle="packed"-->
<!-- app:layout_constraintStart_toStartOf="parent"-->
<!-- app:layout_constraintTop_toBottomOf="@id/checkbox_self_signed" />-->

<!-- <CheckBox-->
<!-- android:id="@+id/checkbox_pull"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_marginStart="32dp"-->
<!-- android:layout_marginTop="8dp"-->
<!-- android:text="@string/settings_pull_title"-->
<!-- app:layout_constraintStart_toEndOf="@+id/checkbox_push"-->
<!-- app:layout_constraintTop_toBottomOf="@id/checkbox_self_signed" />-->

<!-- <CheckBox-->
<!-- android:id="@+id/checkbox_cache"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_marginStart="16dp"-->
<!-- android:layout_marginTop="8dp"-->
<!-- android:layout_marginBottom="16dp"-->
<!-- android:text="@string/settings_cache_title"-->
<!-- app:layout_constraintTop_toBottomOf="@id/checkbox_push"-->
<!-- app:layout_constraintStart_toStartOf="parent"-->
<!-- app:layout_constraintBottom_toBottomOf="parent" />-->
<!-- </androidx.constraintlayout.widget.ConstraintLayout>-->

<View
android:background="@color/dividerColor"
android:layout_width="match_parent"
android:layout_height="1dp" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:textColor="@color/colorPrimary"
android:text="@string/credentials"
android:textAppearance="@style/TextAppearance.MaterialComponents.Overline" />

<lu.circl.mispbump.customViews.MaterialPreferenceText
android:id="@+id/email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:title="Email"
app:subtitle="Keine Ahnung" />

<lu.circl.mispbump.customViews.MaterialPasswordView
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/password"
app:password="Weiß ich leider auch nicht" />

<lu.circl.mispbump.customViews.MaterialPasswordView
android:id="@+id/authkey"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/authkey"
app:password="Den erst recht nicht ..." />
</LinearLayout>

</ScrollView>

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_gravity="bottom|end"
android:layout_width="match_parent"
android:layout_height="match_parent">

<FrameLayout
android:id="@+id/menu_background"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:alpha="0"
android:background="@color/white"
android:clickable="false"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/animated_arrow_cloud_down"
android:tint="@color/white"
android:layout_margin="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />

<LinearLayout
android:id="@+id/layout_upload"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="12dp"
android:clipToPadding="false"
android:orientation="horizontal"
android:padding="24dp"
android:visibility="visible"
app:layout_constraintBottom_toTopOf="@id/fab_main"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">

<View
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />

<TextView
android:id="@+id/fab_upload_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="16dp"
android:background="@drawable/tooltip_background"
android:backgroundTint="@color/black_70"
android:padding="8dp"
android:text="@string/upload_changes"
android:textColor="@color/white" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_upload"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_cloud_upload"
app:fabSize="mini" />
</LinearLayout>

<LinearLayout
android:id="@+id/layout_download"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:orientation="horizontal"
android:padding="24dp"
android:visibility="visible"
app:layout_constraintBottom_toTopOf="@id/layout_upload"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">

<View
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />

<TextView
android:id="@+id/fab_download_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="16dp"
android:background="@drawable/tooltip_background"
android:backgroundTint="@color/black_70"
android:padding="8dp"
android:text="@string/download_changes"
android:textColor="@color/white" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_download"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_cloud_download"
app:fabSize="mini" />
</LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

+ 3
- 0
app/src/main/res/values-de/strings.xml 파일 보기

@@ -50,4 +50,7 @@
<string name="preference_github_summary">Besuchen Sie das Github Projekt</string>
<string name="preference_category_information">App Informationen</string>
<string name="sync_details_activity_label">Synchronisations Details</string>
<string name="information">Informationen</string>
<string name="upload_changes">Änderungen hochladen</string>
<string name="download_changes">Änderungen herunterladen</string>
</resources>

+ 3
- 0
app/src/main/res/values/strings.xml 파일 보기

@@ -56,4 +56,7 @@
<string name="preference_category_information">App information</string>
<string name="preference_github_summary">Visit the Github project</string>
<string name="sync_details_activity_label">Synchronisation details</string>
<string name="information">Information</string>
<string name="upload_changes">Upload Changes</string>
<string name="download_changes">Download Changes</string>
</resources>

+ 1
- 1
build.gradle 파일 보기

@@ -8,7 +8,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.0'
classpath 'com.android.tools.build:gradle:3.5.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

// NOTE: Do not place your application dependencies here; they belong


+ 1
- 1
settings.gradle 파일 보기

@@ -1 +1 @@
include ':app', ':expandablecardview'
include ':app'

불러오는 중...
취소
저장