Тестирование и исправление ошибок
⇐ ПредыдущаяСтр 3 из 3 В плагин AndroidStudio есть эмулятор оболочки Android - AVD, но его производительность оставляет желать лучшего, так как ОС Android заточена под работу на мобильных устройствах. Как альтернатива ему предложена отладка на реальном устройстве через USB, которой я и воспользовался. Это быстрее и проще, к тому же это не занимает ресурсы компьютера. В процессе отладки возникали следующие ошибки: 1) Отсутствие логов Когда код окна программы занимает не один десяток строк и программа вылетает, сложно найти ошибку. Для этого в Java есть логи (logs) – мгновенные сообщения о состоянии программы в консоли. Когда я только начинал делать приложение, я не оставлял логи, так как не рассчитывал на большой размер кода. Позже я пожалел об этом, ведь постепенно приложение росло и начали появляться ошибки. Чтобы их исправить я добавлял логи и отслеживал поведение программы. 2) Необработанные исключения ввода Наличие рабочего алгоритма шифровки – только половина дела. Когда описывается алгоритм, предполагается тип и количество вводимых данных, а пользователь может ошибиться или случайно ввести данные некорректно. Не предполагаемые входные данные являются исключениями и должны обрабатываться – предотвращаться. Реализация обработки исключений добавила немало строк кода в моё приложение и заставила меня повозиться. Я убедился, что необрабатываемые исключения лучше продумывать заранее, чтобы не возникало проблем с их интеграцией. Демонстрация готового продукта
Рисунок 7. Тест приложения Все отзывы оказались положительными, поэтому на следующий день я представил своё приложение ученикам школы, в которой учусь.
Заключение. В ходе работы я ознакомился с особенностями платформ и написал приложение-справочник по криптографии на ОС Android. Я исследовал историю криптографии и систематизировал классы и типы шифров(Рисунок х). Я также с В ходе процесса было выявлено, что создание подобного приложения является возможным и доказано экспериментально. Для создания приложения я использовал язык программирования Java и среду разработки Android Studio, использующую этот язык. Язык Java был для меня не новым, однако с функциями android-разметки я столкнулся впервые. Кроме того, после демонстрации готовой продукции многим ученикам школы понравилось моё приложение и я надеюсь, что они заинтересуются изучением криптографии. Криптография имеет немаловажное значение в нашей жизни, её изучение развивает мышление и логику, а создав это уникальное приложение я сделал свой вклад в увеличение популярности этой науки и упростил жизнь заинтересовавшимся людям. В процессе работы у меня вызвало необычайный интерес создания приложений на Android и я хочу и в дальнейшем продолжить изучать это направление и создавать приложения.
Начиная работу над своим приложением, мне хотелось узнать больше о криптографии и Anrdoid – проектировании. Язык Java давно меня привлекал и его изучать я начал летом, однако, применить полученные знания я смог только начав проект. Самым сложным и интересным для меня было создание алгоритма RSA на Java. Даже разбирать этот алгоритм было не просто. В ходе своей работы я научился программировать приложения на Android. Я выяснил, какая среда является для меня оптимальной, научился предотвращать ошибки в проектах и создал полезное приложение, с теорией, практикой и заданиями по криптографии. Мне хочется в дальнейшем заниматься исследованием языка Java, его возможностей и программированием под ОС Android в целом.
Список литературы. 1. StartAndroid.ru - http://startandroid.ru/ru/ 2. Освой Android играючи - http://developer.alexanderklimov.ru/android/ 3. Герберт Шилдт "Java. Полное руководство". 9-е издание. 2016г, 1376 с. 4. Школьный курс Java - https://sites.google.com/site/school9java/ 5. Статьи из Википедии - https:// ru.wikipedia.org/wiki/ 6. С.Хашими, С.Коматинени, Д.Маклин - "Разработка приложений для android",2011г., 736с. 7. Приложение 1 Шифр Атбаш: public void onBtnClick(View v){ StringBuilder stringBuilder = new StringBuilder(et.getEditableText()); char charArraySB[] = stringBuilder.toString().toCharArray(); for(int i = 0;i<stringBuilder.length();i++){ char c = charArraySB[i]; boolean upper = Character. isUpperCase (c); c = Character. toLowerCase (c); if(alphabet.indexOf(c)>=0){ c = alphabet.charAt(rAlphabet.indexOf(c)); } if(upper){ c = Character. toUpperCase (c); } stringBuilder.deleteCharAt(i); stringBuilder.insert(i, c); } result.setText(stringBuilder); }
Шифр Цезаря: public void onCriptBtnClick(View v){ StringBuilder stringBuilder = new StringBuilder(et.getEditableText()); char charArraySB[] = stringBuilder.toString().toCharArray(); for(int i = 0;i<stringBuilder.length();i++){ int index = alphabet.indexOf(charArraySB[i]); if(index!=-1){ index = index + move; if(index >= alphabet.length()){ index = index - alphabet.length(); } char enter = alphabet.charAt(index); if(Character.isUpperCase(charArraySB[i])){ Character.toUpperCase(enter); } stringBuilder.deleteCharAt(i); stringBuilder.insert(i,enter); } } result.setText(stringBuilder); }
public void onDecriptBtnClick(View v){ StringBuilder stringBuilder = new StringBuilder(et.getEditableText()); char charArraySB[] = stringBuilder.toString().toCharArray(); for(int i = 0;i<stringBuilder.length();i++){
char c = charArraySB[i]; boolean upper = Character.isUpperCase(c); c = Character.toLowerCase(c); int index = alphabet.indexOf(c); if(index!=-1){ index = index - move; if(index < 0){ index = index + alphabet.length(); } c = alphabet.charAt(index); } if(upper){ c = Character.toUpperCase(c); } stringBuilder.deleteCharAt(i); stringBuilder.insert(i, c); } result.setText(stringBuilder); }
Шифр кодового слова: public void onCriptBtnClick(View v){
if(onButtonsClick()){
StringBuilder stringBuilder = new StringBuilder(et.getEditableText()); char charArraySB[] = stringBuilder.toString().toCharArray(); for(int i = 0;i<stringBuilder.length();i++){ char c = charArraySB[i]; boolean upper = Character.isUpperCase(c); c = Character.toLowerCase(c); if(alphabet.indexOf(c)>=0){ c = newAlphabet.charAt(alphabet.indexOf(c)); } if(upper){ c = Character.toUpperCase(c); } stringBuilder.deleteCharAt(i); stringBuilder.insert(i, c); } result.setText(stringBuilder); } }
public void onDecriptBtnClick(View v){
if(onButtonsClick()){
StringBuilder stringBuilder = new StringBuilder(et.getEditableText()); char charArraySB[] = stringBuilder.toString().toCharArray(); for(int i = 0;i<stringBuilder.length();i++){ char c = charArraySB[i]; boolean upper = Character.isUpperCase(c); c = Character.toLowerCase(c); if(newAlphabet.indexOf(c)>=0){ c = alphabet.charAt(newAlphabet.indexOf(c)); } if(upper){ c = Character.toUpperCase(c); } stringBuilder.deleteCharAt(i); stringBuilder.insert(i, c); } result.setText(stringBuilder);
} } Шифр A1Z26: public void onCriptBtnClick(View v){ StringBuilder stringBuilder = new StringBuilder(); char charArraySB[] = et.getEditableText().toString().toLowerCase().toCharArray(); for(int i = 0;i<charArraySB.length;i++){ int index = alphabet.indexOf(charArraySB[i]); if(index!=-1){ stringBuilder.append((index+1)+"-"); }else{ stringBuilder.setLength(Math.max(stringBuilder.length() - 1, 0)); stringBuilder.append(" "+charArraySB[i]+" "); } } stringBuilder.setLength(Math.max(stringBuilder.length() - 1, 0)); result.setText(stringBuilder); } public void onDecriptBtnClick(View v){ StringBuilder stringBuilder = new StringBuilder(); String words[] = et.getEditableText().toString().split(" "); for(int j = 0;j<words.length;j++){ String nums[] = words[j].split("-"); for(int i = 0;i<nums.length;i++){ if(nums[i].length()<3){ if(nums[i].matches("[+]?\\d+")){ if(Integer.parseInt(nums[i])<alphabet.length()+1){ stringBuilder.append(alphabet.charAt(Integer.parseInt(nums[i])-1)); }else{ stringBuilder.append(nums[i]); } }else{ stringBuilder.append(nums[i]); } }else{ stringBuilder.append(nums[i]); } } stringBuilder.append(' '); } result.setText(stringBuilder); } Шифр Виженера: public void onCriptBtnClick(View v){ if(onButtonsClick()){ StringBuilder textBuilder = new StringBuilder(et.getEditableText()); char charArrayTB[] = textBuilder.toString().toCharArray(), key[] = etKey.getEditableText().toString().toLowerCase().toCharArray(); for(int i = 0;i<textBuilder.length();i++){ char c = charArrayTB[i]; boolean upper = Character.isUpperCase(c); c = Character.toLowerCase(c); int index = alphabet.indexOf(c); if(index!=-1){ int move = 0; int mod = i%key.length; if(newAlphabet.indexOf(key[mod])<alphabet.length()){ move = newAlphabet.indexOf(key[mod])+1; }else if(newAlphabet.indexOf(key[mod])<alphabet.length()+9){ move = newAlphabet.indexOf(key[mod]) - alphabet.length() + 1; }else{ move = 0; } index = index + move; if(index >= alphabet.length()){ index = index - alphabet.length(); } c = alphabet.charAt(index); } if(upper){ c = Character.toUpperCase(c); } textBuilder.insert(i,c); textBuilder.deleteCharAt(i+1);
} result.setText(textBuilder); } }
public void onEncriptBtnClick(View v){ if(onButtonsClick()){ StringBuilder textBuilder = new StringBuilder(et.getEditableText()); char charArrayTB[] = textBuilder.toString().toCharArray(), key[] = etKey.getEditableText().toString().toLowerCase().toCharArray(); for(int i = 0;i<textBuilder.length();i++){ char c = charArrayTB[i]; boolean upper = Character.isUpperCase(c); c = Character.toLowerCase(c); int index = alphabet.indexOf(c); if(index!=-1){ int move = 0; int mod = i%key.length; if(newAlphabet.indexOf(key[mod])<alphabet.length()){ move = newAlphabet.indexOf(key[mod])+1; }else if(newAlphabet.indexOf(key[mod])<alphabet.length()+9){ move = newAlphabet.indexOf(key[mod]) - alphabet.length() + 1; }else{ move = 0; } index = index - move; if(index < 0){ index = index + alphabet.length(); } c = alphabet.charAt(index); } if(upper){ c = Character.toUpperCase(c); } textBuilder.insert(i,c); textBuilder.deleteCharAt(i+1); } result.setText(textBuilder); } } Шифр Табличной маршрутной перестановки: public void onCriptBtnClick(View v){ StringBuilder resultStr = new StringBuilder(); int columns = Integer.parseInt(etKey.getEditableText().toString());
char charArraySB[] = et.getEditableText().toString().toCharArray(); for(int i = columns-1;i>=0;i--){ for(int j = 0; columns*j+i<charArraySB.length; j++){ resultStr.append(charArraySB[columns*j+i]); } } result.setText(resultStr); } public void onDeсriptBtnClick(View v){ StringBuilder resultStr = new StringBuilder(); int columns = Integer.parseInt(etKey.getEditableText().toString()); char charArraySB[] = et.getEditableText().toString().toCharArray(); int rows = charArraySB.length/columns, dop = charArraySB.length%columns-1; for(int i=0;i<rows;i++){ int pos = charArraySB.length-1; pos += i; for(int j=0;j<columns;j++){ pos -= rows-1; if(j<=dop){ pos--; } resultStr.append(charArraySB[pos]); pos--; } } int pos = charArraySB.length-1; for(int i=0;i<=dop;i++){ resultStr.append(charArraySB[pos]); pos -= rows + 1; } result.setText(resultStr); } Шифр RSA: public static byte[] encrypt(String text, PublicKey key) { byte[] cipherText = null; try { // get an RSA cipher object and print the provider final Cipher cipher = Cipher.getInstance(ALGORITHM); // encrypt the plain text using the public key cipher.init(Cipher.ENCRYPT_MODE, key); cipherText = cipher.doFinal(text.getBytes()); } catch (Exception e) { e.printStackTrace(); } return cipherText; } public static String decrypt(byte[] text, PrivateKey key) { byte[] dectyptedText = null; try { // get an RSA cipher object and print the provider final Cipher cipher = Cipher.getInstance(ALGORITHM);
// decrypt the text using the private key cipher.init(Cipher.DECRYPT_MODE, key); dectyptedText = cipher.doFinal(text);
} catch (Exception ex) { ex.printStackTrace(); }
return new String(dectyptedText); }
Шифр DES: public String encrypt(String str) throws UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException { byte[] utf8 = str.getBytes("UTF8"); byte[] enc = ecipher.doFinal(utf8); return new sun.misc.BASE64Encoder().encode(enc); }
public String decrypt(String str) throws IOException, IllegalBlockSizeException, BadPaddingException { byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str); byte[] utf8 = dcipher.doFinal(dec); return new String(utf8, "UTF8"); }
Приложение 2
MainMenuActivity.java: package ru.bukinalexey.criptography; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainMenuActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_menu_layout); Button btnCiphers = (Button)findViewById(R.id.btn_ciphers), btnAbout = (Button)findViewById(R.id.btn_about); OnClickListener onBtnClick = new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); switch(v.getId()){ case R.id.btn_ciphers: intent = new Intent(getApplicationContext(), CipherMenuActivity.class); break; case R.id.btn_about: intent = new Intent(getApplicationContext(), AboutActivity.class); break; } startActivity(intent); } }; btnCiphers.setOnClickListener(onBtnClick); btnAbout.setOnClickListener(onBtnClick); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }AboutActivity.java: package ru.bukinalexey.criptography; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class AboutActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.task_layout); TextView about = (TextView)findViewById(R.id.tv_task_name), aboutText = (TextView)findViewById(R.id.tv_task_text); EditText et = (EditText)findViewById(R.id.et_task); Button btn = (Button)findViewById(R.id.btn_request); et.setVisibility(View.GONE);
btn.setVisibility(View.GONE); about.setText(R.string.about); aboutText.setTextSize(20); aboutText.setText(R.string.about_theory); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } CipherMenuActivity.java: package ru.bukinalexey.criptography; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.SimpleAdapter; public class CipherMenuActivity extends Activity { final String TEXT_CRIPT_NAME = "name"; final String TEXT_LEVEL = "difficulty:"; final String TEXT_COMPLETION = "completion:"; final String SVT_COMPLETION = "saved_complition_task_"; final String APP_PREFERENCES = "CriptographyPreferences"; String[] names; int[] difficulties; SharedPreferences sPref; ListView lv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.list_view_layout); names = getResources().getStringArray(R.array.names); difficulties = getResources().getIntArray(R.array.difficulties); sPref = getSharedPreferences(APP_PREFERENCES, MODE_PRIVATE); ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>(names.length); Map<String, Object> map; for (int i = 0; i < names.length; i++) { map = new HashMap<String, Object>(); map.put(TEXT_CRIPT_NAME, names[i]); map.put(TEXT_LEVEL, "Сложность: " + difficulties[i] + "%"); map.put(TEXT_COMPLETION, "Выполнено: " + sPref.getInt(SVT_COMPLETION + i, 0) + "%"); data.add(map); } String[] from = { TEXT_CRIPT_NAME, TEXT_LEVEL, TEXT_COMPLETION }; int[] to = { R.id.tv_cripting, R.id.tv_level, R.id.tv_complition }; SimpleAdapter sAd = new SimpleAdapter(this, data, R.layout.item, from, to); lv = (ListView) findViewById(R.id.listView1); lv.setAdapter(sAd); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(getApplicationContext(), HomePageActivity.class); intent.putExtra("position", position); startActivity(intent); } }); } @Override protected void onRestart() { super.onRestart(); ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>(difficulties.length); Map<String, Object> map; for (int i = 0; i < names.length; i++) { sPref = getSharedPreferences(APP_PREFERENCES, MODE_PRIVATE); map = new HashMap<String, Object>(); map.put(TEXT_CRIPT_NAME, names[i]); map.put(TEXT_LEVEL, "Сложность: " + difficulties[i] + "%"); map.put(TEXT_COMPLETION, "Выполнено: " + sPref.getInt(SVT_COMPLETION + i, 0) + "%"); data.add(map); } String[] from = { TEXT_CRIPT_NAME, TEXT_LEVEL, TEXT_COMPLETION }; int[] to = { R.id.tv_cripting, R.id.tv_level, R.id.tv_complition }; SimpleAdapter sAd = new SimpleAdapter(this, data, R.layout.item, from, to); lv = (ListView) findViewById(R.id.listView1); lv.setAdapter(sAd); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } HomePageActivity.java: package ru.bukinalexey.criptography; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.text.Html; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import ru.bukinalexey.criptography.ciphers.*; public class HomePageActivity extends Activity implements OnClickListener{ TextView criptName, criptTheory, criptType; Button btnTasks,btnDecoder; String theory, names[]; Intent intent; int position; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.home_page_layout); names = getResources().getStringArray(R.array.names); criptName = (TextView) findViewById(R.id.tv_cript_name); criptTheory = (TextView) findViewById(R.id.tv_theory); btnTasks = (Button)findViewById(R.id.btn_tasks); btnDecoder = (Button)findViewById(R.id.btn_decoder); btnTasks.setOnClickListener(this); btnDecoder.setOnClickListener(this); intent = getIntent(); position = intent.getIntExtra("position", 0); criptName.setText(names[position]); whatTheory(); } @Override public void onClick(View v) { switch(v.getId()){ case R.id.btn_decoder: startDecoder(); break; case R.id.btn_tasks: intent = new Intent(getApplicationContext(), TasksListActivity.class); intent.putExtra("position", position); startActivity(intent); break; } } public void startDecoder(){ boolean bool = true; switch(position){ case 0: intent = new Intent(getApplicationContext(), AtbashActivity.class); break; case 1: intent = new Intent(getApplicationContext(), CesarActivity.class); break; case 2: intent = new Intent(getApplicationContext(), CodeWordActivity.class); break; case 3: intent = new Intent(getApplicationContext(), VigenereActivity.class); break; case 4: intent = new Intent(getApplicationContext(), TableRouteActivity.class); break; case 5: intent = new Intent(getApplicationContext(), A1Z26Activity.class); break; default: bool = false; } if(bool){ startActivity(intent); } } public void whatTheory(){ switch(position){ case 0: criptTheory.setText(Html.fromHtml(getString(R.string.theory_0))); break; case 1: criptTheory.setText(Html.fromHtml(getString(R.string.theory_1))); break; case 2: criptTheory.setText(Html.fromHtml(getString(R.string.theory_2))); break; case 3: criptTheory.setText(Html.fromHtml(getString(R.string.theory_3))); break; case 4: criptTheory.setText(Html.fromHtml(getString(R.string.theory_4))); break; case 5: criptTheory.setText(Html.fromHtml(getString(R.string.theory_5))); break;
MainMenuActivity.java: ackage ru.bukinalexey.criptography;
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;
public class MainMenuActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_menu_layout);
Button btnCiphers = (Button)findViewById(R.id.btn_ciphers), btnAbout = (Button)findViewById(R.id.btn_about); OnClickListener onBtnClick = new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); switch(v.getId()){ case R.id.btn_ciphers: intent = new Intent(getApplicationContext(), CipherMenuActivity.class); break; case R.id.btn_about: intent = new Intent(getApplicationContext(), AboutActivity.class); break; } startActivity(intent);
} }; btnCiphers.setOnClickListener(onBtnClick); btnAbout.setOnClickListener(onBtnClick); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main_menu, menu); return true; }
@Override 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 // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } } } }
TaskActivity.java: package ru.bukinalexey.criptography; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class TaskActivity extends Activity { final String TEXT_TASK_NAME = "task"; final String TEXT_TASK_TEXT = "text"; final String EDITTEXT_TASK = "edit"; final String BUTTON_REQUEST = "request"; final String SVT_COMPLETION = "saved_complition_task_"; final String APP_PREFERENCES = "CriptographyPreferences"; String[] tasks; SharedPreferences sPref; Button btn; EditText et; TextView tn,tt; int s1, s2, difficulties[]; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.task_layout);
Intent intent = getIntent(); s1 = intent.getIntExtra("number", 0); s2 = intent.getIntExtra("position", 0);
gettingResourses(s1, s2); tn =(TextView)findViewById(R.id.tv_task_name); tn.setText(tasks[0]); tt =(TextView)findViewById(R.id.tv_task_text); tt.setText(tasks[1]); et = (EditText)findViewById(R.id.et_task); btn =(Button)findViewById(R.id.btn_request); sPref = getSharedPreferences(APP_PREFERENCES, MODE_PRIVATE); if(sPref.getBoolean(SVT_COMPLETION + s1 + "_" + s2, false)){ btn.setText("Выполнено"); btn.setClickable(false); et.setText(tasks[2]); } }
public void onClickRequest(View v) { String t = et.getText().toString(); if((v==btn)&&(t!=null)){ if(t.equals(tasks[2])){ btn.setText("Выполнено"); int i, tf = 1; for(i = 0; i< TasksListActivity.difficulties.length; i++){ if(sPref.getBoolean(SVT_COMPLETION + s1 + "_" + i, false)){ tf++; } } i++; Editor ed = sPref.edit(); ed.putBoolean(SVT_COMPLETION + s1 + "_" + s2, true); ed.putInt(SVT_COMPLETION + s1, tf*100/i); ed.commit(); btn.setClickable(false); Toast.makeText(this, "Правильно", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this, "Попробуйте ещё раз", Toast.LENGTH_SHORT).show(); } } }
void gettingResourses(int s1,int s2){ switch(s1){ case 0: switch(s2){ case 0: tasks = getResources().getStringArray(R.array.task_list_0_0); break; case 1: tasks = getResources().getStringArray(R.array.task_list_0_1); break; case 2: tasks = getResources().getStringArray(R.array.task_list_0_2); break; case 3: tasks = getResources().getStringArray(R.array.task_list_0_3); break; case 4: tasks = getResources().getStringArray(R.array.task_list_0_4); break; } break; case 1: switch(s2){ case 0: tasks = getResources().getStringArray(R.array.task_list_1_0); break; case 1: tasks = getResources().getStringArray(R.array.task_list_1_1); break; case 2: tasks = getResources().getStringArray(R.array.task_list_1_2); break; case 3: tasks = getResources().getStringArray(R.array.task_list_1_3); break; case 4: tasks = getResources().getStringArray(R.array.task_list_1_4); break; } break; case 2: switch(s2){ case 0: tasks = getResources().getStringArray(R.array.task_list_2_0); break; case 1: tasks = getResources().getStringArray(R.array.task_list_2_1); break; case 2: tasks = getResources().getStringArray(R.array.task_list_2_2); break; case 3: tasks = getResources().getStringArray(R.array.task_list_2_3); break; case 4: tasks = getResources().getStringArray(R.array.task_list_2_4); break; } break; case 3: switch(s2){ case 0: tasks = getResources().getStringArray(R.array.task_list_3_0); break; case 1: tasks = getResources().getStringArray(R.array.task_list_3_1); break; case 2: tasks = getResources().getStringArray(R.array.task_list_3_2); break; case 3: tasks = getResources().getStringArray(R.array.task_list_3_3); break; case 4: tasks = getResources().getStringArray(R.array.task_list_3_4); break; } break; case 4: switch(s2){ case 0: tasks = getResources().getStringArray(R.array.task_list_4_0); break; case 1: tasks = getResources().getStringArray(R.array.task_list_4_1); break; case 2: tasks = getResources().getStringArray(R.array.task_list_4_2); break; case 3: tasks = getResources().getStringArray(R.array.task_list_4_3); break; case 4: tasks = getResources().getStringArray(R.array.task_list_4_4); break; } break; case 5: switch(s2){ case 0: tasks = getResources().getStringArray(R.array.task_list_5_0); break; case 1: tasks = getResources().getStringArray(R.array.task_list_5_1); break; case 2: tasks = getResources().getStringArray(R.array.task_list_5_2); break; case 3: tasks = getResources().getStringArray(R.array.task_list_5_3); break; case 4: tasks = getResources().getStringArray(R.array.task_list_5_4); break; } break; } }
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main_menu, menu); return true; }
@Override 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 // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); }
}
TaskListActivity: package ru.bukinalexey.criptography; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.SimpleAdapter;
public class TasksListActivity extends Activity {
/** описываем необходимые константы */ final String TEXT_TASK_NAME = "name", TEXT_IS_COMPLETED = "выполнено"; final String TEXT_LEVEL = "difficulty"; final String CB_COMPLETION = "completion"; final String SVT_COMPLETION = "saved_complition_task_"; final String APP_PREFERENCES = "CriptographyPreferences"; String[] tasks; int cipher; static int difficulties[]; SharedPreferences sPref; ListView lv;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.list_view_layout);
Intent intent = getIntent(); cipher = intent.getIntExtra("position", 0); gettingResourses(cipher);
sPref = getSharedPreferences(APP_PREFERENCES, MODE_PRIVATE); ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>(difficulties.length); Map<String, Object> map; for (int i = 0; i < difficulties.length; i++) { map = new HashMap<String, Object>(); map.put(TEXT_TASK_NAME, "Задание " + (i+1)); map.put(TEXT_LEVEL, "Сложность: " + difficulties[i] + "%"); String completion = "НЕ ВЫПОЛНЕНО"; if(sPref.getBoolean(SVT_COMPLETION + cipher + "_" + i, false)){ completion = "ВЫПОЛНЕНО"; } map.put(TEXT_IS_COMPLETED, completion); data.add(map); }
String[] from = { TEXT_TASK_NAME, TEXT_LEVEL, TEXT_IS_COMPLETED}; int[] to = { R.id.tv_cripting, R.id.tv_level, R.id.tv_complition}; lv = (ListView) findViewById(R.id.listView1); SimpleAdapter sAd = new SimpleAdapter(this, data, R.layout.tasks_list_item, from, to); lv.setAdapter(sAd);
final Intent intent2 = new Intent(getApplicationContext(), TaskActivity.class); intent2.putExtra("number", cipher); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { intent2.putExtra("position", position); startActivity(intent2); } }); }
@Override protected void onRestart() { super.onRestart(); sPref = getSharedPreferences(APP_PREFERENCES, MODE_PRIVATE); ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>(difficulties.length); Map<String, Object> map; for (int i = 0; i < difficulties.length; i++) { map = new HashMap<String, Object>(); map.put(TEXT_TASK_NAME, "Задание " + (i+1)); map.put(TEXT_LEVEL, "Сложность: " + difficulties[i] + "%"); String completion = "НЕ ВЫПОЛНЕНО"; if(sPref.getBoolean(SVT_COMPLETION + cipher + "_" + i, false)){ completion = "ВЫПОЛНЕНО"; } map.put(TEXT_IS_COMPLETED, completion); data.add(map); }
String[] from = { TEXT_TASK_NAME, TEXT_LEVEL, TEXT_IS_COMPLETED}; int[] to = { R.id.tv_cripting, R.id.tv_level, R.id.tv_complition}; lv = (ListView) findViewById(R.id.listView1); SimpleAdapter sAd = new SimpleAdapter(this, data, R.layout.tasks_list_item, from, to); lv.setAdapter(sAd); }
void gettingResourses(int cipher){ switch(cipher){ case 0: difficulties = getResources().getIntArray(R.array.difficulties_0); break; case 1: difficulties = getResources().getIntArray(R.array.difficulties_1); break; case 2: difficulties = getResources().getIntArray(R.array.difficulties_2); break; case 3: difficulties = getResources().getIntArray(R.array.difficulties_3); break; case 4: difficulties = getResources().getIntArray(R.array.difficulties_4); break; case 5: difficulties = getResources().getIntArray(R.array.difficulties_5); break; } }
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main_menu, menu); return true; }
@Override 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 // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); }
}
Приложение 3
home_page_layout.xml: <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="none" android:background="@color/beige_theme_color" >
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" >
<TextView android:id="@+id/tv_cript_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:textColor="@color/black" android:layout_marginBottom="10dp" android:layout_marginTop="20dp" android:textSize="30sp" />
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" >
<Button android:id="@+id/btn_decoder" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/coder" android:textSize="25sp" />
<Button android:id="@+id/btn_tasks" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/tests" android:textSize="25sp" />
</LinearLayout>
<TextView android:id="@+id/tv_theory" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="10dp" android:textColor="@color/black" android:textSize="20sp" />
</LinearLayout>
</ScrollView> item.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:background="@color/beige_theme_color" android:orientation="vertical" >
<TextView android:id="@+id/tv_cripting" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="10dp" android:textColor="@color/black" android:textSize="30sp" android:layout_gravity="center_horizontal">
</TextView>
<TextView android:id="@+id/tv_level" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="10dp" android:textColor="@color/black" android:textSize="20sp" >
</TextView>
<TextView android:id="@+id/tv_complition" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="10dp" android:textColor="@color/black" android:textSize="20sp" > </TextView> </LinearLayout>
List_view_layout.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@color/beige_theme_color" tools:context="ru.bukinalexey.criptography.MainMenuActivity" >
<ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="match_parent" > </ListView>
</LinearLayout>
main_menu_layout.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/beige_theme_color" >
<TextView android:id="@+id/tv_type" android:layout_marginTop="30dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="@string/app_name" android:textColor="@color/black" android:textSize="30sp" />
<LinearLayout android:id="@+id/lay" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/tv_type" android:layout_centerHorizontal="true" android:layout_marginTop="80dp" android:orientation="vertical" >
<Button android:id="@+id/btn_ciphers" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/ciphers" android:textSize="30sp" />
<Button android:id="@+id/btn_try" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="Проверить себя" android:textSize="30sp" />
<Button android:id="@+id/btn_help" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="Помощь" android:textSize="30sp" />
<Button android:id="@+id/btn_about" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="@string/about" android:textSize="30sp" />
</LinearLayout>
</RelativeLayout>
remove_ciphers_layout.xml: <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/beige_theme_color" android:scrollbars="none">
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" >
<TextView android:id="@+id/tv_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:textColor="@color/black" android:layout_marginTop="20dp" android:textSize="40sp" />
<TextView android:id="@+id/tv_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/text" android:layout_marginLeft="5dp" android:textColor="@color/black" android:textSize="20sp" />
<EditText android:id="@+id/et_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/enter_text" android:inputType="textMultiLine" >
<requestFocus /> </EditText>
<TextView android:id="@+id/tv_alphabet" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/alphabet" android:layout_marginLeft="5dp" android:textColor="@color/black" android:textSize="20sp" />
<Spinner android:id="@+id/spinner_alphabet" android:layout_width="match_parent" android:layout_height="wrap_content" />
<TextView android:id="@+id/tv_key" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:textColor="@color/black" android:textSize="20sp" />
<EditText android:id="@+id/et_key" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:hint="@string/enter_key" />
<Spinner android:id="@+id/spinner_move" android:layout_width="match_parent" android:layout_height="wrap_content" />
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" >
<Button android:id="@+id/btn_cript" android:layout_width="wrap_content" android:layout_height="60dp" android:layout_weight="1" android:onClick="onCriptBtnClick" android:text="@string/code" android:textSize="19sp" />
<Button android:id="@+id/btn_encript" android:layout_width="wrap_content" android:layout_height="60dp" android:layout_weight="1" android:onClick="onEncriptBtnClick" android:text="@string/decode" android:textSize="19sp" /> </LinearLayout>
<TextView android:id="@+id/tv_answer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:text="@string/result" android:textColor="@color/black" android:textSize="20sp" />
<TextView android:id="@+id/tv_result" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="@string/here_is_result" android:paddingBottom="30dp" android:paddingLeft="20dp" android:paddingRight="20dp" android:paddingTop="10dp" android:textColor="@color/black" android:textIsSelectable="true" android:textSize="20sp" /> </LinearLayout> </ScrollView>
task_layout.xml: <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/beige_theme_color" android:scrollbars="none"> <LinearLayout android:layout_width="match_parent" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_height="wrap_content" android:orientation="vertical">
<TextView android:id="@+id/tv_task_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:layout_marginTop="20dp" android:textSize="30sp" android:textColor="@color/black" />
<TextView android:id="@+id/tv_task_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:autoLink="web|email" android:textSize="18sp" android:textColor="@color/black" />
<ImageView android:id="@+id/iv" android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="fitCenter" />
<EditText android:id="@+id/et_task" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:hint="@string/write_it_here" />
<Button android:id="@+id/btn_request" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="onClickRequest" android:textSize="20sp" android:text="@string/request" android:layout_gravity="center_horizontal" /> </LinearLayout> </ScrollView>
Tasks_list_item.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/beige_theme_color" android:orientation="vertical" >
<TextView android:id="@+id/tv_cripting" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="10dp" android:textColor="@color/black" android:textSize="30sp" > </TextView> <TextView android:id="@+id/tv_level" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="10dp" android:textColor="@color/black" android:textSize="20sp" > </TextView> <TextView android:id="@+id/tv_complition" android:layout_width="match_parent" android:layout_marginLeft="20dp" android:layout_marginRight="10dp" android:layout_height="wrap_content" android:textColor="@color/black" android:textSize="20sp" > </TextView> </LinearLayout>
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|