From 327e3e86152b25eac373094f57b957752ae36624 Mon Sep 17 00:00:00 2001 From: JG-Cody Date: Tue, 27 Feb 2024 20:07:04 +0100 Subject: [PATCH] . --- .idea/deploymentTargetDropDown.xml | 30 +-- .idea/gradle.xml | 5 +- .../com/example/onetap_ssh/MainActivity.java | 187 ++++++++++++++++-- .../MovableFloatingActionButton.java | 129 ++++++++++++ .../onetap_ssh/ui/home/HomeFragment.java | 7 +- .../onetap_ssh/ui/tabs/TabsFragment.java | 7 +- app/src/main/res/drawable/onetap_ssh.png | Bin 0 -> 12464 bytes app/src/main/res/drawable/sidemenu.xml | 39 ++++ app/src/main/res/layout/activity_main.xml | 6 +- app/src/main/res/layout/app_bar_main.xml | 9 +- app/src/main/res/layout/doublebutton.xml | 10 +- app/src/main/res/layout/exportdialog.xml | 17 +- app/src/main/res/layout/fragment_home.xml | 1 - app/src/main/res/layout/fragment_tabs.xml | 17 +- app/src/main/res/layout/headline.xml | 4 +- app/src/main/res/layout/nav_header_main.xml | 14 +- app/src/main/res/layout/singlebutton.xml | 8 +- app/src/main/res/layout/space.xml | 16 +- app/src/main/res/menu/menu_main.xml | 1 + build.gradle | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 21 files changed, 415 insertions(+), 98 deletions(-) create mode 100644 app/src/main/java/com/example/onetap_ssh/MovableFloatingActionButton.java create mode 100644 app/src/main/res/drawable/onetap_ssh.png create mode 100644 app/src/main/res/drawable/sidemenu.xml diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 69999da..43e74a8 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -1,17 +1,23 @@ - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index ae388c2..0897082 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -4,16 +4,15 @@ diff --git a/app/src/main/java/com/example/onetap_ssh/MainActivity.java b/app/src/main/java/com/example/onetap_ssh/MainActivity.java index 79ac54b..f0a4168 100644 --- a/app/src/main/java/com/example/onetap_ssh/MainActivity.java +++ b/app/src/main/java/com/example/onetap_ssh/MainActivity.java @@ -17,6 +17,10 @@ import android.view.MenuItem; import android.view.View; import android.view.Menu; import android.view.LayoutInflater; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.Switch; +import android.widget.Toast; import com.example.onetap_ssh.fragment.AboutFragment; import com.example.onetap_ssh.fragment.SettingsFragment; @@ -28,6 +32,7 @@ import com.example.onetap_ssh.util.ThemeUtil; import com.google.android.material.snackbar.Snackbar; import com.google.android.material.navigation.NavigationView; +import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.core.view.GravityCompat; import androidx.fragment.app.Fragment; @@ -67,19 +72,12 @@ public class MainActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - + ThemeUtil.loadBackground(this); binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - setSupportActionBar(binding.appBarMain.toolbar); - binding.appBarMain.fab.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) - .setAction("Action", null).show(); - } - }); - DrawerLayout drawer = findViewById(R.id.drawer_layout); + + DrawerLayout drawer = findViewById(R.id.app_background); NavigationView navigationView = binding.navView; // Passing each menu ID as a set of Ids because each // menu should be considered as top level destinations. @@ -92,7 +90,168 @@ public class MainActivity extends BaseActivity { NavigationUI.setupWithNavController(navigationView, navController); SharedPreferences p = getSharedPreferences("appsettings", Activity.MODE_PRIVATE); button_vibration = p.getBoolean("Vibration", false ); + ((Switch) navigationView.getMenu().getItem(2).getActionView().findViewById(R.id.switch_editmode)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (button_vibration) { + Vibrator vr = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); + assert vr != null; + vr.vibrate(100); + } + + editmode = isChecked; + Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment); + NavHostFragment nhf = (NavHostFragment) currentFragment; + assert nhf != null; + Fragment childfragment = nhf.getChildFragmentManager().getFragments().get(0); + if (childfragment instanceof TabsFragment) { + try { + ((TabsFragment) childfragment).load(); + } catch (JSONException e) { + e.printStackTrace(); + } + + } + navigationView.getMenu().getItem(3).setVisible(editmode); + navigationView.getMenu().getItem(4).setVisible(editmode); + } + }); + navigationView.getMenu().getItem(3).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + if (button_vibration) { + Vibrator vr = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); + assert vr != null; + vr.vibrate(100); + } + AlertDialog.Builder mBuilder = new AlertDialog.Builder(MainActivity.this); + + + LayoutInflater inflater = getLayoutInflater(); + View view = inflater.inflate(R.layout.addtabdialog, null); + EditText editText_name = view.findViewById(R.id.dialogtab_editText_name); + + + mBuilder.setView(view) + .setTitle(R.string.menu_add); + mBuilder.setPositiveButton(R.string.add, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (button_vibration) { + Vibrator vr = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); + assert vr != null; + vr.vibrate(100); + } + String tabname = editText_name.getText().toString().trim(); + + SharedPreferences p = getSharedPreferences("appsettings", MODE_PRIVATE); + String tabsString = p.getString("tabs", null); + List tabs = new ArrayList(); + if (tabsString != null) { + try { + JSONArray tabsArray = new JSONArray(tabsString); + for (int i = 0; i < tabsArray.length(); i++) { + tabs.add(tabsArray.getString(i)); + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + if (tabs.contains(tabname)) { + + AlertDialog mDialog = new AlertDialog.Builder(MainActivity.this) + .setTitle(getString(R.string.tabname)) + .setMessage(getString(R.string.tabname_already_exist)) + + // Specifying a listener allows you to take an action before dismissing the dialog. + // The dialog is automatically dismissed when a dialog button is clicked. + .setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (button_vibration) { + Vibrator vr = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); + assert vr != null; + vr.vibrate(100); + } + } + }).create(); + Objects.requireNonNull(mDialog.getWindow()).setBackgroundDrawableResource(R.drawable.button_round); + mDialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; //style id + mDialog.show(); + return; + } + if (tabname.isEmpty()) { + + AlertDialog mDialog = new AlertDialog.Builder(MainActivity.this) + .setTitle(getString(R.string.tabname)) + .setMessage(getString(R.string.invalid)) + + // Specifying a listener allows you to take an action before dismissing the dialog. + // The dialog is automatically dismissed when a dialog button is clicked. + .setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (button_vibration) { + Vibrator vr = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); + assert vr != null; + vr.vibrate(100); + } + } + }).create(); + Objects.requireNonNull(mDialog.getWindow()).setBackgroundDrawableResource(R.drawable.button_round); + mDialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; //style id + mDialog.show(); + return; + } + MenuItem item = navigationView.getMenu().add(R.id.dynamicgroup, lastID++, 3, tabname); + item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + if (button_vibration) { + Vibrator vr = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); + assert vr != null; + vr.vibrate(100); + } + DrawerLayout mDrawerLayout; + mDrawerLayout = (DrawerLayout) findViewById(R.id.app_background); + mDrawerLayout.closeDrawer(GravityCompat.START); + Objects.requireNonNull(getSupportActionBar()).setTitle(tabname); + Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment); + NavHostFragment nhf = (NavHostFragment) currentFragment; + assert nhf != null; + nhf.getChildFragmentManager().beginTransaction().replace(R.id.nav_host_fragment, new TabsFragment(tabname)).commit(); + return true; + } + }); + tabitems.put(tabname, item); + + + tabs.add(tabname); + SharedPreferences.Editor editor = p.edit(); + editor.putString("tabs", new JSONArray(tabs).toString()); + editor.apply(); + + } + }); + mBuilder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (button_vibration) { + Vibrator vr = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); + assert vr != null; + vr.vibrate(100); + } + + } + }); + AlertDialog mDialog = mBuilder.create(); + Objects.requireNonNull(mDialog.getWindow()).setBackgroundDrawableResource(R.drawable.button_round); + mDialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; //style id + mDialog.show(); + return true; + } + }); //launchApp(); navigationView.getMenu().getItem(4).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @@ -193,7 +352,7 @@ public class MainActivity extends BaseActivity { vr.vibrate(100); } DrawerLayout mDrawerLayout; - mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + mDrawerLayout = (DrawerLayout) findViewById(R.id.app_background); mDrawerLayout.closeDrawer(GravityCompat.START); Objects.requireNonNull(getSupportActionBar()).setTitle(tab); Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment); @@ -221,6 +380,7 @@ public class MainActivity extends BaseActivity { return NavigationUI.navigateUp(navController, mAppBarConfiguration) || super.onSupportNavigateUp(); } + public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long @@ -350,4 +510,9 @@ public class MainActivity extends BaseActivity { super.recreate(); } + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + } + } \ No newline at end of file diff --git a/app/src/main/java/com/example/onetap_ssh/MovableFloatingActionButton.java b/app/src/main/java/com/example/onetap_ssh/MovableFloatingActionButton.java new file mode 100644 index 0000000..465563e --- /dev/null +++ b/app/src/main/java/com/example/onetap_ssh/MovableFloatingActionButton.java @@ -0,0 +1,129 @@ +package com.example.onetap_ssh; + + +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.OvershootInterpolator; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; + +public class MovableFloatingActionButton extends FloatingActionButton implements View.OnTouchListener { + CustomClickListener customClickListener; + + private final static float CLICK_DRAG_TOLERANCE = 10; // Often, there will be a slight, unintentional, drag when the user taps the FAB, so we need to account for this. + + private float downRawX, downRawY; + private float dX, dY; + + int viewWidth; + int viewHeight; + + int parentWidth; + int parentHeight; + + float newX; + float newY; + + public MovableFloatingActionButton(Context context) { + super(context); + init(); + } + + public MovableFloatingActionButton(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public MovableFloatingActionButton(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + private void init() { + setOnTouchListener(this); + } + + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + + ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) view.getLayoutParams(); + + int action = motionEvent.getAction(); + if (action == MotionEvent.ACTION_DOWN) { + + downRawX = motionEvent.getRawX(); + downRawY = motionEvent.getRawY(); + dX = view.getX() - downRawX; + dY = view.getY() - downRawY; + + return false; // not Consumed for ripple effect + + } else if (action == MotionEvent.ACTION_MOVE) { + + viewWidth = view.getWidth(); + viewHeight = view.getHeight(); + + View viewParent = (View) view.getParent(); + parentWidth = viewParent.getWidth(); + parentHeight = viewParent.getHeight(); + + newX = motionEvent.getRawX() + dX; + newX = Math.max(layoutParams.leftMargin, newX); // Don't allow the FAB past the left hand side of the parent + newX = Math.min(parentWidth - viewWidth - layoutParams.rightMargin, newX); // Don't allow the FAB past the right hand side of the parent + + newY = motionEvent.getRawY() + dY; + newY = Math.max(layoutParams.topMargin, newY); // Don't allow the FAB past the top of the parent + newY = Math.min(parentHeight - viewHeight - layoutParams.bottomMargin, newY); // Don't allow the FAB past the bottom of the parent + + view.animate() + .x(newX) + .y(newY) + .setDuration(0) + .start(); + + return true; // Consumed + + } else if (action == MotionEvent.ACTION_UP) { + + float upRawX = motionEvent.getRawX(); + float upRawY = motionEvent.getRawY(); + + float upDX = upRawX - downRawX; + float upDY = upRawY - downRawY; + + if (newX > ((parentWidth - viewWidth - layoutParams.rightMargin) / 2)) { + newX = parentWidth - viewWidth - layoutParams.rightMargin; + } else { + newX = layoutParams.leftMargin; + } + + view.animate() + .x(newX) + .y(newY) + .setInterpolator(new OvershootInterpolator()) + .setDuration(600) + .start(); + + if (Math.abs(upDX) < CLICK_DRAG_TOLERANCE && Math.abs(upDY) < CLICK_DRAG_TOLERANCE) { // A click + if (customClickListener != null) { + customClickListener.onClick(view); + } + return false;// not Consumed for ripple effect + } else { // A drag + return false; // not Consumed for ripple effect + } + + } else { + return super.onTouchEvent(motionEvent); + } + + } + + public interface CustomClickListener { + void onClick(View view); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/onetap_ssh/ui/home/HomeFragment.java b/app/src/main/java/com/example/onetap_ssh/ui/home/HomeFragment.java index b8a324c..c77c9c0 100644 --- a/app/src/main/java/com/example/onetap_ssh/ui/home/HomeFragment.java +++ b/app/src/main/java/com/example/onetap_ssh/ui/home/HomeFragment.java @@ -66,12 +66,7 @@ public class HomeFragment extends Fragment { View root = inflater.inflate(R.layout.fragment_home, container, false); SharedPreferences p = requireContext().getSharedPreferences("appsettings", Activity.MODE_PRIVATE); String Background = p.getString("Background", null); - if (Background != null) { - ImageView I = root.findViewById(R.id.Background); - byte[] BA = Base64.decode(Background, Base64.DEFAULT); - I.setImageDrawable(new BitmapDrawable(getResources(), MainActivity.scaleCenterCrop(BitmapFactory.decodeByteArray(BA, 0, BA.length), MainActivity.getScreenHeight(), MainActivity.getScreenWidth()))); - I.setScaleType(ImageView.ScaleType.CENTER_CROP); - } + final TextView textView = root.findViewById(R.id.text_home); final TextView login_data = root.findViewById(R.id.login_data); if (user == null || ip == null) { diff --git a/app/src/main/java/com/example/onetap_ssh/ui/tabs/TabsFragment.java b/app/src/main/java/com/example/onetap_ssh/ui/tabs/TabsFragment.java index 62661a7..ff30b19 100644 --- a/app/src/main/java/com/example/onetap_ssh/ui/tabs/TabsFragment.java +++ b/app/src/main/java/com/example/onetap_ssh/ui/tabs/TabsFragment.java @@ -66,12 +66,7 @@ public class TabsFragment extends Fragment implements AddButtonDialogSingle.AddB View root = inflater.inflate(R.layout.fragment_tabs, container, false); SharedPreferences p = requireContext().getSharedPreferences("appsettings", Activity.MODE_PRIVATE); String Background = p.getString("Background", null); - if (Background != null) { - ImageView I = root.findViewById(R.id.Background); - byte[] BA = Base64.decode(Background, Base64.DEFAULT); - I.setImageDrawable(new BitmapDrawable(getResources(), MainActivity.scaleCenterCrop(BitmapFactory.decodeByteArray(BA, 0, BA.length), MainActivity.getScreenHeight(), MainActivity.getScreenWidth()))); - I.setScaleType(ImageView.ScaleType.CENTER_CROP); - } + listView = root.findViewById(R.id.listView); diff --git a/app/src/main/res/drawable/onetap_ssh.png b/app/src/main/res/drawable/onetap_ssh.png new file mode 100644 index 0000000000000000000000000000000000000000..720903dd81be31724d455b254593a968da7009a9 GIT binary patch literal 12464 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%0Ajb&1(JX?}h`Yu`#^)`_-Ckd((aTEq zQQY?x0S+9O#D})m$1$NDB1nyF1{WF0yXlwyXR0J)szj9HCsPWf-wppYP4vyGWgJ5M zQ`Ee>b4yK5b*ryQje)0E3);i#XE0wVhH+e9#YBQBOK*e}mM1Rd!2YV1R)~j5i}MI6 z0gh>0W-HcW)kspeyBRo5*ruQAs^{|O30eve?q zAy+KZ;ie+JnMShN%kxiR_ED0e$6k2md^eSdyGaB&EIZ<-MFQgPHm+~RSah3_EBn!- zG7m*vv3Tj`op_~&1U`81wSwN1FEmn-02=YrvH-z_9bEN4QTCHsOk40}42vB^(+tz{o?;VwB!a*UvPKRTL*FJQ1;maM zwPWD_@5J_lOk<5 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 76c7a47..0792bff 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -5,7 +5,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" - android:id="@+id/drawer_layout" + + android:id="@+id/app_background" tools:openDrawer="start"> + app:menu="@menu/activity_main_drawer" + android:background="@drawable/sidemenu"/> \ No newline at end of file diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml index 1900dbe..f405a07 100644 --- a/app/src/main/res/layout/app_bar_main.xml +++ b/app/src/main/res/layout/app_bar_main.xml @@ -20,13 +20,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/doublebutton.xml b/app/src/main/res/layout/doublebutton.xml index ce932f8..87c6829 100644 --- a/app/src/main/res/layout/doublebutton.xml +++ b/app/src/main/res/layout/doublebutton.xml @@ -8,7 +8,7 @@ android:orientation="horizontal"> -