Java tutorial
/* MPlayer Remote Copyright (C) 2015 Rafa Kacki This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.mplayer_remote; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.util.Log; import android.view.View; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.TextView; import android.widget.Toast; import android.widget.CompoundButton.OnCheckedChangeListener; import android.support.v4.app.DialogFragment; /** * Aktywno umoliwiajca zmian ustawie aplikacji. * Pozwala zdecydowa czy aplikacja ma szyfrowa przechowywane w pamici urzdzenia dane serwerw SSH, a tym samym pyta za kadym uruchomieniem o haso aplikacji. * @author sokar * @see android.app.Activity */ public class SettingsForAPP extends FragmentActivity { //w celach diagnostycznych nazwa logu dla tego Activity private static final String TAG = "SettingsForAPP"; //Zapisany stan elementw interfejsu i ustawi dla activity lub aplikacji /** * Interfejs sucy do przechowywania preferencji, w tym przypadku ustawie aplikacji, w pamici wewntrznej urzdzenia. * @see android.content.SharedPreferences */ private SharedPreferences settingsForAPPSharedPreferences; /** * Zmienna logiczna majca warto <code>true</code> w przypadku pierwszego uruchomienia aplikacji i <code>false</code> w przeciwnym. * Warto odczytywana za pomoc interfejsu {@link com.mplayer_remote.ServerList#settingsForAPPSharedPreferences}. */ private boolean isThisFirstRunboolean; /** * Zmienna logiczna majca warto <code>true</code> kiedy uytkownik aplikacji zdecydowa, e ta ma uywa szyfrowania do przechowywania danych serwerw SSH. * Warto odczytywana za pomoc interfejsu {@link com.mplayer_remote.ServerList#settingsForAPPSharedPreferences}. */ private boolean isCryptoEnabledboolean; //a app_password taken from intent /** * Haso aplikacji, na jego podstawie jest generowany klucz szyfru AES potrzebny do zaszyfrowania w pamici urzdzenia danych serwerw SSH. */ private char[] appPasswordcharArray = null; /** * Obiekt klasy {@link com.mplayer_remote.XMLReaderWriter}, sucy do przeksztacania listy {@link SettingsForAPP#serverListArrayList} w zaszyfrowany algorytmem AES plik XML, * udostpnia on rwnie moliwo odszyfrowania tego pliku XML i przeksztacenie go z powrotem w list {@link SettingsForAPP#serverListArrayList}. */ XMLReaderWriter aXMLReaderWriter; /** * Pole wyboru opcji, element GUI aktywnoci pozwalajcy decydowa uytkownikowi, czy aplikacja ma przechowywa w pamici urzdzenia zaszyfrowane hasa serwerw SSH. */ private CheckBox useEencryptionCheckBox = null; /** * Pole wyboru opcji pozwala decydowa czy aktywno FileChooser ma pokazywa jedynie znane pliki multimedialne. */ private CheckBox showOnlyMediaTypeFilesCheckBox = null; /** * Key showOnlyMediaTypeFilesBoolean for SharedPreferences. */ private static final String SHOW_ONLY_MEDIA_TYPE_FILES = "showOnlyMediaTypeFilesBoolean"; /** * Zmienna logiczna majca wrto <code>true</code> kiedy aktywno FileChooser ma pokazywa jedynie zznane pliki multimedialne. * Warto odczytywana za pomoc interfejsu {@link com.mplayer_remote.ServerList#settingsForAPPSharedPreferences}. */ private Boolean showOnlyMediaTypeFilesBoolean = true; /** * TextView with open FileExtensionChooserDialog */ private TextView knowFileExtensionsTextView; //Lista serverw /** * Lista obiektw klasy {@link com.mplayer_remote.Server}. Tu jest zapisywana odszyfrowana z pamici urzdzenia lista serwerw SSH. */ private List<Server> serverListArrayList = new ArrayList<Server>(); //private Boolean mConfigurationChange = false; //a idea for zero out appPassowrdcharArray in onfrom http://stackoverflow.com/questions/8314935/how-do-i-tell-when-a-configuration-change-is-happening-in-froyo not implemented yet /** * Metoda wywoywana przez system Android przy starcie aktywnoci. * Tu nastpuje wyczytanie ustawie aplikacji i zainicjowanie GUI aktywnoci. * @see android.app.Activity#onCreate(android.os.Bundle) */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getActionBar().setDisplayHomeAsUpEnabled(false); //ustawianie GUI setContentView(R.layout.layout_for_settingsforserverlist); settingsForAPPSharedPreferences = getSharedPreferences("settings_for_APP", 0); isThisFirstRunboolean = settingsForAPPSharedPreferences.getBoolean("is_this_first_run", true); isCryptoEnabledboolean = settingsForAPPSharedPreferences.getBoolean("is_crypto_enabled", true); //byo false showOnlyMediaTypeFilesBoolean = settingsForAPPSharedPreferences.getBoolean(SHOW_ONLY_MEDIA_TYPE_FILES, true); if (savedInstanceState == null) { Intent intent_from_ServerList = getIntent(); //getIntent() zwraca obiekt Intent ktry wystartowa Activity appPasswordcharArray = intent_from_ServerList.getCharArrayExtra("app_password"); } else { appPasswordcharArray = savedInstanceState.getCharArray("appPasswordcharArray"); } Log.v(TAG, "aktualny isThisFirstRunboolean: " + isThisFirstRunboolean); Log.v(TAG, "aktualny isCryptoEnabledboolean: " + isCryptoEnabledboolean); if (appPasswordcharArray != null) { String appPasswordcharArrayConvertedToString = new String(appPasswordcharArray); Log.v(TAG, "Aktuane appPasswordcharArray: " + appPasswordcharArrayConvertedToString); } //creating a XML Context mContext = getApplicationContext(); aXMLReaderWriter = new XMLReaderWriter(mContext); if (isCryptoEnabledboolean == true && appPasswordcharArray != null) { //appPasswordcharArray == null try { serverListArrayList = aXMLReaderWriter .decryptFileWithXMLAndParseItToServerList(appPasswordcharArray); } catch (WrongPasswordException e) { // TODO Auto-generated catch block e.printStackTrace(); Toast.makeText(getApplicationContext(), R.string.wrong_app_password_exeption, Toast.LENGTH_SHORT) .show(); finish(); //something is wrong } } else { try { serverListArrayList = aXMLReaderWriter .decryptFileWithXMLAndParseItToServerList("default_password".toCharArray()); } catch (WrongPasswordException e) { // TODO Auto-generated catch block e.printStackTrace(); Toast.makeText(getApplicationContext(), R.string.wrong_app_password_exeption, Toast.LENGTH_SHORT) .show(); finish(); //something is wrong } } useEencryptionCheckBox = (CheckBox) findViewById(R.id.use_encryption_in_SettingForServer_checkBox); useEencryptionCheckBox.setChecked(isCryptoEnabledboolean); useEencryptionCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (useEencryptionCheckBox.isChecked() == true) { isCryptoEnabledboolean = true; isThisFirstRunboolean = true; } else { isCryptoEnabledboolean = false; } SharedPreferences settings_for_activity_ServerList = getSharedPreferences("settings_for_APP", 0); SharedPreferences.Editor editor = settings_for_activity_ServerList.edit(); editor.putBoolean("is_crypto_enabled", isCryptoEnabledboolean); editor.putBoolean("is_this_first_run", isThisFirstRunboolean); // Commit the edits! editor.commit(); if (useEencryptionCheckBox.isChecked() == true) { Toast.makeText(getApplicationContext(), R.string.text_for_toast_Edit_server_data_fill_server_password_field, Toast.LENGTH_LONG) .show(); aXMLReaderWriter.createEncryptedXMLFileWithServerList(serverListArrayList, appPasswordcharArray); } else { //appPasswordcharArray = "default_password".toCharArray(); for (int i = 0; i < serverListArrayList.size(); i++) { serverListArrayList.get(i).setPassword("".toCharArray()); } aXMLReaderWriter.createEncryptedXMLFileWithServerList(serverListArrayList, "default_password".toCharArray()); } } }); showOnlyMediaTypeFilesCheckBox = (CheckBox) findViewById((R.id.show_only_media_type_files_checkBox)); showOnlyMediaTypeFilesCheckBox.setChecked(showOnlyMediaTypeFilesBoolean); showOnlyMediaTypeFilesCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if (showOnlyMediaTypeFilesCheckBox.isChecked() == true) { showOnlyMediaTypeFilesBoolean = true; } else { showOnlyMediaTypeFilesBoolean = false; } SharedPreferences settings_for_activity_ServerList = getSharedPreferences("settings_for_APP", 0); SharedPreferences.Editor editor = settings_for_activity_ServerList.edit(); editor.putBoolean(SHOW_ONLY_MEDIA_TYPE_FILES, showOnlyMediaTypeFilesBoolean); //Commit the edits! editor.commit(); } }); knowFileExtensionsTextView = (TextView) findViewById(R.id.know_file_extensions); knowFileExtensionsTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.v(TAG, "klikem knowFileExtensionsTextView"); DialogFragment newFragment = new KnowFileExtensionsDialogFragment(); newFragment.show(getSupportFragmentManager(), "KnowFileExtensionsDialogFragment"); } }); } /** * Metoda wywoywana przez system Android przed zniszczeniem aktywnoci, suy do zapamitywania stanu aktywnoci. Tu do zapamitania hasa aplikacji pomidzy restartami aktywnoci. * @see android.app.Activity#onSaveInstanceState(android.os.Bundle) */ @Override protected void onSaveInstanceState(Bundle outState) { outState.putCharArray("appPasswordcharArray", appPasswordcharArray); } /* @Override protected void onPause() { super.onPause(); //finish(); } */ /* @Override public Object onRetainNonConfigurationInstance() { mConfigurationChange = true; return null; } */ /** * Metoda wywoywana przez system Android, kiedy uytkownik nacinie przycisk wstecz swojego urzdzenia. * Tu odpowiada za zakoczenie wywietlania aktywnoci SettingsForAPP, uruchomienie aktywnoci ServerList i wymazanie z pamici hasa do aplikacji. * @see android.app.Activity#onBackPressed() */ @Override public void onBackPressed() { //when user press a back key final Intent intent_start_ServerList = new Intent(getApplicationContext(), ServerList.class); //intent_start_ServerList.putExtra("app_password", appPasswordcharArray); startActivity(intent_start_ServerList); Arrays.fill(appPasswordcharArray, '0'); appPasswordcharArray = null; finish(); } }