diff --git a/app/build.gradle b/app/build.gradle index 1355a52..396043c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -53,9 +53,10 @@ dependencies { compile 'com.jakewharton:butterknife:8.8.1' compile 'com.github.bilthon:graphenej:0.4.6-alpha1' compile 'com.google.zxing:core:3.3.1' - compile 'me.dm7.barcodescanner:zxing:1.9.8'; + compile 'me.dm7.barcodescanner:zxing:1.9.8' compile 'com.squareup.okhttp3:logging-interceptor:3.5.0' + compile 'de.hdodenhof:circleimageview:2.2.0' testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.10.19' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 453f8ae..ad92f17 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,13 @@ + + + diff --git a/app/src/main/java/cy/agorise/crystalwallet/activities/AccountsActivity.java b/app/src/main/java/cy/agorise/crystalwallet/activities/AccountsActivity.java new file mode 100644 index 0000000..10e001e --- /dev/null +++ b/app/src/main/java/cy/agorise/crystalwallet/activities/AccountsActivity.java @@ -0,0 +1,46 @@ +package cy.agorise.crystalwallet.activities; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v7.app.AppCompatActivity; +import android.widget.TextView; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; +import cy.agorise.crystalwallet.R; + +/** + * Created by xd on 1/9/18. + * + */ + +public class AccountsActivity extends AppCompatActivity { + + @BindView(R.id.tvSettings) + TextView tvSettings; + + @BindView(R.id.tvClose) + TextView tvClose; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_accounts); + ButterKnife.bind(this); + } + + @OnClick(R.id.tvSettings) + public void onTvSettingsClick(){ + onBackPressed(); + Intent intent = new Intent(this, SettingsActivity.class); + startActivity(intent); + } + + @OnClick(R.id.tvClose) + public void cancel(){ + onBackPressed(); + } +} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/crystalwallet/activities/BoardActivity.java b/app/src/main/java/cy/agorise/crystalwallet/activities/BoardActivity.java index c857972..9ef1161 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/activities/BoardActivity.java +++ b/app/src/main/java/cy/agorise/crystalwallet/activities/BoardActivity.java @@ -1,29 +1,26 @@ package cy.agorise.crystalwallet.activities; +import android.app.ActivityOptions; import android.arch.lifecycle.LiveData; import android.arch.lifecycle.ViewModelProviders; import android.content.Intent; import android.content.res.Resources; -import android.graphics.drawable.AnimationDrawable; import android.media.MediaPlayer; import android.os.Bundle; -import android.support.design.widget.AppBarLayout; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.app.FragmentTransaction; -import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; -import android.util.Log; +import android.util.Pair; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.animation.LinearInterpolator; -import android.widget.ImageButton; import android.widget.ImageView; import java.util.List; @@ -33,17 +30,18 @@ import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import cy.agorise.crystalwallet.R; -import cy.agorise.crystalwallet.fragments.AccountsFragment; import cy.agorise.crystalwallet.fragments.BalanceFragment; import cy.agorise.crystalwallet.fragments.ContactsFragment; import cy.agorise.crystalwallet.fragments.ReceiveTransactionFragment; import cy.agorise.crystalwallet.fragments.SendTransactionFragment; import cy.agorise.crystalwallet.fragments.TransactionsFragment; +import de.hdodenhof.circleimageview.CircleImageView; import cy.agorise.crystalwallet.models.CryptoNetBalance; import cy.agorise.crystalwallet.viewmodels.CryptoNetBalanceListViewModel; /** * Created by Henry Varona on 7/10/2017. + * */ public class BoardActivity extends AppCompatActivity { @@ -75,7 +73,13 @@ public class BoardActivity extends AppCompatActivity { public SurfaceView mSurfaceView; @BindView(R.id.toolbar_user_img) - public ImageView userImage; + public CircleImageView userImage; + + @BindView(R.id.lightning) + public ImageView lightning; + + @BindView(R.id.triangle) + public ImageView triangle; @Override protected void onCreate(Bundle savedInstanceState) { @@ -134,7 +138,7 @@ public class BoardActivity extends AppCompatActivity { // Hide Add Contact fab, it won't hide until first page changed... // Convert 72dp to pixels (fab is 56dp in diameter + 16dp margin) - final int fabDistanceToHide = (int) (72 * Resources.getSystem().getDisplayMetrics().density);; + final int fabDistanceToHide = (int) (72 * Resources.getSystem().getDisplayMetrics().density); fabAddContact.animate().translationY(fabDistanceToHide) .setInterpolator(new LinearInterpolator()).start(); @@ -183,22 +187,27 @@ public class BoardActivity extends AppCompatActivity { */ @OnClick(R.id.toolbar_user_img) public void accounts() { - FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); - Fragment prev = getSupportFragmentManager().findFragmentByTag("AccountsDialog"); - if (prev != null) { - ft.remove(prev); - } - ft.addToBackStack(null); + Intent intent = new Intent(this, AccountsActivity.class); - // Create and show the dialog. - AccountsFragment newFragment = AccountsFragment.newInstance(this.cryptoNetAccountId); - newFragment.show(ft, "AccountsDialog"); + // SharedElementTransition is only available from API level 21 + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + Pair p1 = Pair.create(userImage, "gravatarTransition"); + Pair p2 = Pair.create(lightning, "lightningTransition"); + Pair p3 = Pair.create(triangle, "triangleTransition"); + + ActivityOptions options = ActivityOptions + .makeSceneTransitionAnimation(this, p1, p2, p3); + + startActivity(intent, options.toBundle()); + } else { + startActivity(intent); + } } /* * dispatch the user to the receive fragment using this account */ - public void receiveToThisAccount(){ + public void receiveToThisAccount() { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); Fragment prev = getSupportFragmentManager().findFragmentByTag("ReceiveDialog"); if (prev != null) { @@ -214,7 +223,7 @@ public class BoardActivity extends AppCompatActivity { /* * dispatch the user to the send fragment using this account */ - public void sendFromThisAccount(){ + public void sendFromThisAccount() { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); Fragment prev = getSupportFragmentManager().findFragmentByTag("SendDialog"); if (prev != null) { @@ -237,7 +246,7 @@ public class BoardActivity extends AppCompatActivity { } private class BoardPagerAdapter extends FragmentStatePagerAdapter { - public BoardPagerAdapter(FragmentManager fm) { + BoardPagerAdapter(FragmentManager fm) { super(fm); } diff --git a/app/src/main/java/cy/agorise/crystalwallet/activities/SettingsActivity.java b/app/src/main/java/cy/agorise/crystalwallet/activities/SettingsActivity.java index 54c7368..70f68aa 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/activities/SettingsActivity.java +++ b/app/src/main/java/cy/agorise/crystalwallet/activities/SettingsActivity.java @@ -12,13 +12,18 @@ import android.support.v7.widget.Toolbar; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.widget.ImageView; +import android.widget.TextView; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; +import cy.agorise.crystalwallet.BuildConfig; import cy.agorise.crystalwallet.R; +import cy.agorise.crystalwallet.fragments.AccountsSettingsFragment; +import cy.agorise.crystalwallet.fragments.BackupsSettingsFragment; import cy.agorise.crystalwallet.fragments.BalanceFragment; import cy.agorise.crystalwallet.fragments.GeneralSettingsFragment; +import cy.agorise.crystalwallet.fragments.SecuritySettingsFragment; /** * Created by seven on 12/28/17. @@ -38,6 +43,9 @@ public class SettingsActivity extends AppCompatActivity{ @BindView(R.id.surface_view) public SurfaceView mSurfaceView; + @BindView(R.id.tvBuildVersion) + public TextView tvBuildVersion; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -76,6 +84,11 @@ public class SettingsActivity extends AppCompatActivity{ mPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mPager)); + + // Automatically get build version from app information + String buildVersion = "v"; + buildVersion += BuildConfig.VERSION_NAME; + tvBuildVersion.setText(buildVersion); } private class SettingsPagerAdapter extends FragmentStatePagerAdapter { @@ -88,14 +101,12 @@ public class SettingsActivity extends AppCompatActivity{ switch (position){ case 0: return new GeneralSettingsFragment(); - /*case 1: - return null; - case 2: - return null;*/ case 1: + return new SecuritySettingsFragment(); case 2: + return new BackupsSettingsFragment(); case 3: - return new BalanceFragment(); + return new AccountsSettingsFragment(); } diff --git a/app/src/main/java/cy/agorise/crystalwallet/fragments/AccountsFragment.java b/app/src/main/java/cy/agorise/crystalwallet/fragments/AccountsFragment.java index f0e3ae4..130cb2f 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/fragments/AccountsFragment.java +++ b/app/src/main/java/cy/agorise/crystalwallet/fragments/AccountsFragment.java @@ -53,7 +53,7 @@ public class AccountsFragment extends DialogFragment { @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AccountsTheme); + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.fragment_accounts, null); diff --git a/app/src/main/java/cy/agorise/crystalwallet/fragments/AccountsSettingsFragment.java b/app/src/main/java/cy/agorise/crystalwallet/fragments/AccountsSettingsFragment.java new file mode 100644 index 0000000..5a84c0d --- /dev/null +++ b/app/src/main/java/cy/agorise/crystalwallet/fragments/AccountsSettingsFragment.java @@ -0,0 +1,66 @@ +package cy.agorise.crystalwallet.fragments; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import butterknife.BindView; +import butterknife.ButterKnife; +import cy.agorise.crystalwallet.R; + +/** + * Created by xd on 1/16/18. + */ + +public class AccountsSettingsFragment extends Fragment { + public AccountsSettingsFragment() { + // Required empty public constructor + } + + public static AccountsSettingsFragment newInstance() { + AccountsSettingsFragment fragment = new AccountsSettingsFragment(); + Bundle args = new Bundle(); + fragment.setArguments(args); + return fragment; + } + + @BindView(R.id.tvUpgrade) + public TextView tvUpgrade; + + @BindView(R.id.tvImport) + public TextView tvImport; + + @BindView(R.id.tvRefresh) + public TextView tvRefresh; + + @BindView(R.id.tvRemove) + public TextView tvRemove; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + View v = inflater.inflate(R.layout.fragment_accounts_settings, container, false); + ButterKnife.bind(this, v); + + tvUpgrade.setText(makeFirstWordsBold(getResources().getString(R.string.upgrade_description))); + tvImport.setText(makeFirstWordsBold(getResources().getString(R.string.import_description))); + tvRefresh.setText(makeFirstWordsBold(getResources().getString(R.string.refresh_description))); + tvRemove.setText(makeFirstWordsBold(getResources().getString(R.string.remove_description))); + + return v; + } + + private SpannableStringBuilder makeFirstWordsBold(String str) { + SpannableStringBuilder ssb = new SpannableStringBuilder(str); + ssb.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), + 0, str.indexOf('.')+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + + return ssb; + } +} diff --git a/app/src/main/java/cy/agorise/crystalwallet/fragments/BackupsSettingsFragment.java b/app/src/main/java/cy/agorise/crystalwallet/fragments/BackupsSettingsFragment.java new file mode 100644 index 0000000..7d8349e --- /dev/null +++ b/app/src/main/java/cy/agorise/crystalwallet/fragments/BackupsSettingsFragment.java @@ -0,0 +1,62 @@ +package cy.agorise.crystalwallet.fragments; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import butterknife.BindView; +import butterknife.ButterKnife; +import cy.agorise.crystalwallet.R; + +/** + * Created by xd on 1/11/18. + */ + +public class BackupsSettingsFragment extends Fragment{ + public BackupsSettingsFragment() { + // Required empty public constructor + } + + public static BackupsSettingsFragment newInstance() { + BackupsSettingsFragment fragment = new BackupsSettingsFragment(); + Bundle args = new Bundle(); + fragment.setArguments(args); + return fragment; + } + + @BindView(R.id.tvBinFile) + public TextView tvBinFile; + + @BindView(R.id.tvBrainkey) + public TextView tvBrainkey; + + @BindView(R.id.tvWIFKey) + public TextView tvWIFKey; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + View v = inflater.inflate(R.layout.fragment_backups_settings, container, false); + ButterKnife.bind(this, v); + + tvBinFile.setText(makeFirstWordsBold(getResources().getString(R.string.bin_file_description))); + tvBrainkey.setText(makeFirstWordsBold(getResources().getString(R.string.brainkey_description))); + tvWIFKey.setText(makeFirstWordsBold(getResources().getString(R.string.wif_key_description))); + + return v; + } + + private SpannableStringBuilder makeFirstWordsBold(String str) { + SpannableStringBuilder ssb = new SpannableStringBuilder(str); + ssb.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), + 0, str.indexOf('.')+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + + return ssb; + } +} diff --git a/app/src/main/java/cy/agorise/crystalwallet/fragments/NoneSecurityFragment.java b/app/src/main/java/cy/agorise/crystalwallet/fragments/NoneSecurityFragment.java new file mode 100644 index 0000000..a8cb92b --- /dev/null +++ b/app/src/main/java/cy/agorise/crystalwallet/fragments/NoneSecurityFragment.java @@ -0,0 +1,38 @@ +package cy.agorise.crystalwallet.fragments; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import butterknife.ButterKnife; +import cy.agorise.crystalwallet.R; + +/** + * Created by xd on 1/18/18. + */ + +public class NoneSecurityFragment extends Fragment { + + public NoneSecurityFragment() { + // Required empty public constructor + } + + public static NoneSecurityFragment newInstance() { + NoneSecurityFragment fragment = new NoneSecurityFragment(); + Bundle args = new Bundle(); + fragment.setArguments(args); + return fragment; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + View v = inflater.inflate(R.layout.fragment_none_security, container, false); + ButterKnife.bind(this, v); + + return v; + } +} diff --git a/app/src/main/java/cy/agorise/crystalwallet/fragments/PinSecurityFragment.java b/app/src/main/java/cy/agorise/crystalwallet/fragments/PinSecurityFragment.java new file mode 100644 index 0000000..52e2c55 --- /dev/null +++ b/app/src/main/java/cy/agorise/crystalwallet/fragments/PinSecurityFragment.java @@ -0,0 +1,38 @@ +package cy.agorise.crystalwallet.fragments; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import butterknife.ButterKnife; +import cy.agorise.crystalwallet.R; + +/** + * Created by xd on 1/18/18. + */ + +public class PinSecurityFragment extends Fragment { + + public PinSecurityFragment() { + // Required empty public constructor + } + + public static PinSecurityFragment newInstance() { + PinSecurityFragment fragment = new PinSecurityFragment(); + Bundle args = new Bundle(); + fragment.setArguments(args); + return fragment; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + View v = inflater.inflate(R.layout.fragment_pin_security, container, false); + ButterKnife.bind(this, v); + + return v; + } +} diff --git a/app/src/main/java/cy/agorise/crystalwallet/fragments/SecuritySettingsFragment.java b/app/src/main/java/cy/agorise/crystalwallet/fragments/SecuritySettingsFragment.java new file mode 100644 index 0000000..0407bcf --- /dev/null +++ b/app/src/main/java/cy/agorise/crystalwallet/fragments/SecuritySettingsFragment.java @@ -0,0 +1,83 @@ +package cy.agorise.crystalwallet.fragments; + +import android.os.Bundle; +import android.support.design.widget.TabLayout; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import butterknife.BindView; +import butterknife.ButterKnife; +import cy.agorise.crystalwallet.R; +import cy.agorise.crystalwallet.util.ChildViewPager; + +/** + * Created by xd on 1/17/18. + * In this fragment the user should be able to select its preferred security option. + */ + +public class SecuritySettingsFragment extends Fragment { + + public SecuritySettingsFragment() { + // Required empty public constructor + } + + public static SecuritySettingsFragment newInstance() { + SecuritySettingsFragment fragment = new SecuritySettingsFragment(); + Bundle args = new Bundle(); + fragment.setArguments(args); + return fragment; + } + + @BindView(R.id.pager) + public ChildViewPager mPager; + + public SecurityPagerAdapter securityPagerAdapter; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + View v = inflater.inflate(R.layout.fragment_security_settings, container, false); + ButterKnife.bind(this, v); + + securityPagerAdapter = new SecurityPagerAdapter(getChildFragmentManager()); + mPager.setAdapter(securityPagerAdapter); + mPager.setSwipeLocked(true); + + TabLayout tabLayout = v.findViewById(R.id.tabs); + + mPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mPager)); + + return v; + } + + private class SecurityPagerAdapter extends FragmentPagerAdapter { + SecurityPagerAdapter(FragmentManager fm) { + super(fm); + } + + @Override + public Fragment getItem(int position) { + switch (position){ + case 0: + return new NoneSecurityFragment(); + case 1: + return new PinSecurityFragment(); + case 2: + return new BackupsSettingsFragment(); + } + + return null; //new OnConstructionFragment(); + } + + @Override + public int getCount() { + return 3; + } + } +} diff --git a/app/src/main/java/cy/agorise/crystalwallet/util/ChildViewPager.java b/app/src/main/java/cy/agorise/crystalwallet/util/ChildViewPager.java new file mode 100644 index 0000000..fbac369 --- /dev/null +++ b/app/src/main/java/cy/agorise/crystalwallet/util/ChildViewPager.java @@ -0,0 +1,49 @@ +package cy.agorise.crystalwallet.util; + +import android.content.Context; +import android.support.v4.view.ViewPager; +import android.util.AttributeSet; +import android.view.MotionEvent; + +/** + * Created by xd on 1/18/18. + * This ViewPager is intended to be used inside another ViewPager therefore it has the + * setSwipeLocked which disables or enables the swipe gesture. + */ + + +public class ChildViewPager extends ViewPager { + + private boolean swipeLocked; + + public ChildViewPager(Context context) { + super(context); + } + + public ChildViewPager(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public boolean getSwipeLocked() { + return swipeLocked; + } + + public void setSwipeLocked(boolean swipeLocked) { + this.swipeLocked = swipeLocked; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + return !swipeLocked && super.onTouchEvent(event); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent event) { + return !swipeLocked && super.onInterceptTouchEvent(event); + } + + @Override + public boolean canScrollHorizontally(int direction) { + return !swipeLocked && super.canScrollHorizontally(direction); + } +} \ No newline at end of file diff --git a/app/src/main/res/anim/accounts_in.xml b/app/src/main/res/anim/accounts_in.xml index e229b12..95d3c0d 100644 --- a/app/src/main/res/anim/accounts_in.xml +++ b/app/src/main/res/anim/accounts_in.xml @@ -2,7 +2,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index f030f1a..484c17d 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -12,23 +12,17 @@ android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="120dp" - android:fitsSystemWindows="true" android:background="@color/colorPrimary" app:theme="@style/AppTheme.AppBarOverlay"> - + android:layout_height="match_parent"> + android:layout_height="match_parent"/> - - + - - + app:layout_behavior="@string/appbar_scrolling_view_behavior"> + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/board.xml b/app/src/main/res/layout/board.xml index 31aa573..49f9d44 100644 --- a/app/src/main/res/layout/board.xml +++ b/app/src/main/res/layout/board.xml @@ -41,6 +41,7 @@ android:layout_height="?attr/actionBarSize" android:background="@color/transparent" android:layout_marginTop="8dp" + android:layout_marginBottom="-20dp" app:layout_collapseMode="none" app:popupTheme="@style/AppTheme.PopupOverlay"> @@ -59,28 +60,33 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - diff --git a/app/src/main/res/layout/fragment_accounts_settings.xml b/app/src/main/res/layout/fragment_accounts_settings.xml new file mode 100644 index 0000000..e06f240 --- /dev/null +++ b/app/src/main/res/layout/fragment_accounts_settings.xml @@ -0,0 +1,114 @@ + + + + + + + +