Import & Export & EditMode

This commit is contained in:
JG-Cody 2021-08-15 19:18:23 +02:00
parent 3961a880f1
commit b915b860c8
7 changed files with 192 additions and 107 deletions

View File

@ -19,6 +19,7 @@ import android.media.MediaPlayer;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.os.Vibrator; import android.os.Vibrator;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.text.SpannableString; import android.text.SpannableString;
@ -33,7 +34,6 @@ import android.view.WindowManager;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Switch; import android.widget.Switch;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
@ -51,10 +51,16 @@ import com.google.android.material.navigation.NavigationView;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -64,21 +70,20 @@ import java.util.Objects;
import de.jg_cody.Teraplex.ui.credits.CreditsFragment; import de.jg_cody.Teraplex.ui.credits.CreditsFragment;
import de.jg_cody.Teraplex.ui.settings.SettingsFragment; import de.jg_cody.Teraplex.ui.settings.SettingsFragment;
import de.jg_cody.Teraplex.ui.tabs.ListAdapter;
import de.jg_cody.Teraplex.ui.tabs.ListItem;
import de.jg_cody.Teraplex.ui.tabs.TabsFragment; import de.jg_cody.Teraplex.ui.tabs.TabsFragment;
public class MainActivity extends AppCompatActivity { public class MainActivity extends AppCompatActivity {
public static int RESULT_LOAD_IMAGE = 0; public static int RESULT_LOAD_IMAGE = 0;
private AppBarConfiguration mAppBarConfiguration; private AppBarConfiguration mAppBarConfiguration;
// Request code for selecting a PDF document.
public static final int PICK_PDF_FILE = 2;
public static final int CREATE_FILE = 1;
public static boolean editmode = false; public static boolean editmode = false;
ListAdapter listAdapter;
ListView listView;
EditText editText_name; EditText editText_name;
ArrayList<ListItem> items;
int lastID = 6969; int lastID = 6969;
Map<String, MenuItem> tabitems = new HashMap<>(); Map<String, MenuItem> tabitems = new HashMap<>();
@ -550,8 +555,78 @@ public class MainActivity extends AppCompatActivity {
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} else if (requestCode == CREATE_FILE && resultCode == RESULT_OK && null != data) {
data.getData();
try {
ParcelFileDescriptor pfd = getContentResolver().
openFileDescriptor(data.getData(), "w");
FileOutputStream fileOutputStream =
new FileOutputStream(pfd.getFileDescriptor());
JSONObject jsonObject = new JSONObject();
List<String> listTabs = getTabsFromPrefs();
jsonObject.put("tabs", new JSONArray(listTabs));
JSONObject jsonTabs = new JSONObject();
SharedPreferences p = this.getSharedPreferences("appsettings", Activity.MODE_PRIVATE);
for (String tab : listTabs) {
String listItems = p.getString("listItems." + tab, "[]");
JSONArray listItems2 = new JSONArray(listItems);
jsonTabs.put(tab, listItems2);
}
jsonObject.put("tabitems", jsonTabs);
fileOutputStream.write(jsonObject.toString().getBytes());
// Let the document provider know you're done by closing the stream.
fileOutputStream.close();
pfd.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
} }
} else if (requestCode == PICK_PDF_FILE && resultCode == RESULT_OK && null != data) {
try {
ParcelFileDescriptor pfd = getContentResolver().
openFileDescriptor(data.getData(), "r");
FileInputStream fileInputStream =
new FileInputStream(pfd.getFileDescriptor());
BufferedReader bf = new BufferedReader(new InputStreamReader(fileInputStream));
String s = bf.readLine();
JSONObject jso = new JSONObject(s);
SharedPreferences p = this.getSharedPreferences("appsettings", Activity.MODE_PRIVATE);
JSONArray tabs = jso.getJSONArray("tabs");
SharedPreferences.Editor sharedEditor = p.edit();
sharedEditor.putString("tabs",tabs.toString());
JSONObject tabitems = jso.getJSONObject("tabitems");
for (int i = 0; i < tabs.length(); i++) {
String tab = tabs.getString(i);
JSONArray tArray = tabitems.getJSONArray(tab);
sharedEditor.putString("listItems." + tab,tArray.toString());
}
sharedEditor.apply();
startActivity(getIntent());
finish();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
} }
private void loadBackground() { private void loadBackground() {
@ -598,5 +673,23 @@ public class MainActivity extends AppCompatActivity {
return dest; return dest;
} }
//muss oben noch ausgebessert werden
public List<String> getTabsFromPrefs() {
SharedPreferences p = getSharedPreferences("appsettings", Activity.MODE_PRIVATE);
String tabsString = p.getString("tabs", null);
List<String> tabs = new ArrayList<String>();
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();
}
}
return tabs;
}
} }

View File

@ -66,7 +66,7 @@ public class SettingsFragment extends Fragment {
Vibrator vr = (Vibrator) requireContext().getSystemService(Context.VIBRATOR_SERVICE); Vibrator vr = (Vibrator) requireContext().getSystemService(Context.VIBRATOR_SERVICE);
assert vr != null; assert vr != null;
vr.vibrate(100); vr.vibrate(100);
showExportDialog(); createFile();
} }
}); });
Button Import = root.findViewById(R.id.button_import); Button Import = root.findViewById(R.id.button_import);
@ -76,7 +76,8 @@ public class SettingsFragment extends Fragment {
Vibrator vr = (Vibrator) requireContext().getSystemService(Context.VIBRATOR_SERVICE); Vibrator vr = (Vibrator) requireContext().getSystemService(Context.VIBRATOR_SERVICE);
assert vr != null; assert vr != null;
vr.vibrate(100); vr.vibrate(100);
showImportDialog(); //showImportDialog();
openFile();
} }
}); });
Button Reset = root.findViewById(R.id.button_reset); Button Reset = root.findViewById(R.id.button_reset);
@ -288,87 +289,37 @@ public class SettingsFragment extends Fragment {
editor.putString("Language", lang); editor.putString("Language", lang);
editor.apply(); editor.apply();
} }
private void showExportDialog() {
final String[] listItems = {"EXPORT BACKGROUND", "EXPORT LANGUAGESETTINGS", "EXPORT THEMESETTINGS", "EXPORT TABS"};
AlertDialog.Builder mBuilder = new AlertDialog.Builder(getContext());
mBuilder.setTitle(getString(R.string.export_settings));
mBuilder.setMultiChoiceItems(listItems, null, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i, boolean b) {
Vibrator vr = (Vibrator) requireContext().getSystemService(Context.VIBRATOR_SERVICE);
assert vr != null;
vr.vibrate(100);
if (i == 0) {
} else if (i == 1) {
} else if (i == 2) {
} else if (i == 3) {
}
}
});
mBuilder.setPositiveButton(getString(R.string.button_export), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = requireActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.exportdialog, null);
editExportFile_name = view.findViewById(R.id.dialogexport_editText_name);
builder.setView(view)
.setTitle("SINGLE BUTTON")
.setNegativeButton(getString(R.string.cancel), (dialogExport, r) -> {
})
.setPositiveButton(R.string.button_export, (dialogExport, r) -> {
String headline = editExportFile_name.getText().toString();
if(headline.isEmpty()){
MediaPlayer mp = MediaPlayer.create(getContext(), R.raw.state_change_confirm_up);
mp.start();
AlertDialog mDialog = new AlertDialog.Builder(getContext())
.setTitle(getString(R.string.invalid))
.setMessage(getString(R.string.inputfields_cant_be_empty))
// 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(android.R.string.yes, null )
.create();
Objects.requireNonNull(mDialog.getWindow()).setBackgroundDrawableResource(R.drawable.button_round);
mDialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; //style id
mDialog.show();
return;
}
});
AlertDialog mDialog = builder.create();
Objects.requireNonNull(mDialog.getWindow()).setBackgroundDrawableResource(R.drawable.button_round);
mDialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; //style id
mDialog.show();
}
}
);
mBuilder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
AlertDialog mDialog = mBuilder.create();
Objects.requireNonNull(mDialog.getWindow()).setBackgroundDrawableResource(R.drawable.button_round);
mDialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; //style id
mDialog.show();
}
private void showImportDialog() { private void showImportDialog() {
Intent a = new Intent( Intent a = new Intent(
Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
requireActivity().startActivityForResult(a, MainActivity.RESULT_LOAD_IMAGE); requireActivity().startActivityForResult(a, MainActivity.RESULT_LOAD_IMAGE);
} }
private void createFile() {
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("application/json");
intent.putExtra(Intent.EXTRA_TITLE, "export.json");
// Optionally, specify a URI for the directory that should be opened in
// the system file picker when your app creates the document.
//intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri);
getActivity().startActivityForResult(intent, 1);
}
private void openFile() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("application/json");
// Optionally, specify a URI for the file that should appear in the
// system file picker when it loads.
getActivity().startActivityForResult(intent, MainActivity.PICK_PDF_FILE);
}
} }

View File

@ -29,8 +29,7 @@ public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ListItemViewHo
private AddButtonsDialogDouble.AddButtonsDialogListenerDouble listener; private AddButtonsDialogDouble.AddButtonsDialogListenerDouble listener;
private EditText editText_name, editText_command, editText_command1, editText_button1, editText_command2, editText_button2, editText_button_name; private EditText editText_name, editText_command, editText_command1, editText_button1, editText_command2, editText_button2, editText_button_name;
private TabsFragment frag;
ListAdapter listAdapter;
public static final int public static final int
SINGLEBUTTON = 0, SINGLEBUTTON = 0,
@ -198,6 +197,19 @@ public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ListItemViewHo
return; return;
} }
ListItemSingle item_tmp = (ListItemSingle) item;
item_tmp.setButtonName(button);
item_tmp.setCommand(command);
item_tmp.setName(name);
notifyDataSetChanged();
try {
TabsFragment.save(tabname, context, ListAdapter.this);
} catch (JSONException e) {
e.printStackTrace();
}
} }
}); });
@ -241,9 +253,22 @@ public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ListItemViewHo
Objects.requireNonNull(mDialog.getWindow()).setBackgroundDrawableResource(R.drawable.button_round); Objects.requireNonNull(mDialog.getWindow()).setBackgroundDrawableResource(R.drawable.button_round);
mDialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; //style id mDialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; //style id
mDialog.show(); mDialog.show();
return; return;
} }
listener.applyTextsDouble(name, command1, command2, button1, button2); ListItemDouble item_tmp = (ListItemDouble) item;
item_tmp.setButton1(button1);
item_tmp.setButton2(button2);
item_tmp.setCommand1(command1);
item_tmp.setCommand2(command2);
item_tmp.setName(name);
notifyDataSetChanged();
try {
TabsFragment.save(tabname, context, ListAdapter.this);
} catch (JSONException e) {
e.printStackTrace();
}
} }
}); });
@ -296,7 +321,14 @@ public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ListItemViewHo
mDialog.show(); mDialog.show();
return; return;
} }
ListItemHeadline item_tmp = (ListItemHeadline) item;
item_tmp.setName(headline);
notifyDataSetChanged();
try {
TabsFragment.save(tabname, context, ListAdapter.this);
} catch (JSONException e) {
e.printStackTrace();
}
}); });
@ -365,6 +397,4 @@ public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ListItemViewHo
} }
} }
} }

View File

@ -8,6 +8,13 @@ public class ListItemHeadline extends ListItem{
this.name = name; this.name = name;
} }
public void setName(String name) {
this.name = name;
}
public String getName()
{
return this.name;
}
@Override @Override
public String[] getStrings() { public String[] getStrings() {

View File

@ -13,6 +13,18 @@ public class ListItemSingle extends ListItem{
} }
public void setName(String name)
{
this.name = name;
}
public void setButtonName(String buttonName)
{
this.buttonName = buttonName;
}
public void setCommand(String command)
{
this.command = command;
}
@Override @Override
public String[] getStrings() { public String[] getStrings() {
String[] s = {name, command, buttonName}; String[] s = {name, command, buttonName};

View File

@ -19,10 +19,6 @@
<string name="action_logout">AUSLOGGEN</string> <string name="action_logout">AUSLOGGEN</string>
<string name="Welcome_to_your_HOMEAUTOMATION_APP">WILLKOMMEN BEI TERAPLEX</string> <string name="Welcome_to_your_HOMEAUTOMATION_APP">WILLKOMMEN BEI TERAPLEX</string>
<string name="login">EINLOGGEN</string> <string name="login">EINLOGGEN</string>
<string name="wlan">WLAN</string>
<string name="kodi">KODI</string>
<string name="off">AUS</string>
<string name="on">AN</string>
<string name="console">KONSOLE</string> <string name="console">KONSOLE</string>
<string name="button_send_command">BEFEHL SENDEN</string> <string name="button_send_command">BEFEHL SENDEN</string>
<string name="servercommands">SERVERBEFEHLE</string> <string name="servercommands">SERVERBEFEHLE</string>
@ -59,7 +55,7 @@
<string name="cooperation">IN KOOPERATION MIT</string> <string name="cooperation">IN KOOPERATION MIT</string>
<string name="menu_add">REGISTERKARTE HINZUFÜGEN</string> <string name="menu_add">REGISTERKARTE HINZUFÜGEN</string>
<string name="menu_remove">REGISTERKARTE ENTFERNEN</string> <string name="menu_remove">REGISTERKARTE ENTFERNEN</string>
<string name="edit">BEARBEITEN</string> <string name="edit">BEARBEITUNGSMODUS</string>
<string name="cancel">ABBRECHEN</string> <string name="cancel">ABBRECHEN</string>
<string name="invalid">UNGÜLTIGE EINGABE</string> <string name="invalid">UNGÜLTIGE EINGABE</string>
<string name="tabname">TABNAME</string> <string name="tabname">TABNAME</string>
@ -90,7 +86,7 @@
<string name="add">HINZUFÜGEN</string> <string name="add">HINZUFÜGEN</string>
<string name="command1">BEFEHL 1</string> <string name="command1">BEFEHL 1</string>
<string name="name">NAME</string> <string name="name">NAME</string>
<string name="command2">BEFEHL 1</string> <string name="command2">BEFEHL 2</string>
<string name="button">SCHALTFLÄCHE</string> <string name="button">SCHALTFLÄCHE</string>
<string name="button1">SCHALTFLÄCHE 1</string> <string name="button1">SCHALTFLÄCHE 1</string>
<string name="button2">SCHALTFLÄCHE 2</string> <string name="button2">SCHALTFLÄCHE 2</string>

View File

@ -6,7 +6,7 @@
<string name="nav_header_subtitle">ANDROID.STUDIO@ANDROID.COM</string> <string name="nav_header_subtitle">ANDROID.STUDIO@ANDROID.COM</string>
<string name="action_logout">LOGOUT</string> <string name="action_logout">LOGOUT</string>
<string name="ssh_remote">SSH-REMOTE</string> <string name="ssh_remote">SSH-REMOTE</string>
<string name="edit">EDIT</string> <string name="edit">EDITMODE</string>
//home //home
<string name="Welcome_to_your_HOMEAUTOMATION_APP">WELCOME TO TERAPLEX</string> <string name="Welcome_to_your_HOMEAUTOMATION_APP">WELCOME TO TERAPLEX</string>
@ -15,10 +15,6 @@
<string name="login_password">PASSWORD</string> <string name="login_password">PASSWORD</string>
<string name="login">LOGIN</string> <string name="login">LOGIN</string>
<string name="logout">LOGOUT</string> <string name="logout">LOGOUT</string>
<string name="wlan">WLAN</string>
<string name="kodi">KODI</string>
<string name="off">OFF</string>
<string name="on">ON</string>
<string name="please_login">PLEASE CONNECT TO YOUR SERVER</string> <string name="please_login">PLEASE CONNECT TO YOUR SERVER</string>
<string name="sie_sind_als_angemeldet">YOU ARE LOGGED IN ON {IP} AS {USERNAME}</string> <string name="sie_sind_als_angemeldet">YOU ARE LOGGED IN ON {IP} AS {USERNAME}</string>
<string name="felder_dürfen_nicht_leer_sein">INPUTFIELDS CANT BE EMPTY!</string> <string name="felder_dürfen_nicht_leer_sein">INPUTFIELDS CANT BE EMPTY!</string>