/
nea
/
androidGroupBuilder
Обзор
Документация
Войти
/
nea
/
androidGroupBuilder
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app/src/main/java/com/ea/groupbuilder/MainActivity.java
469 строк
22 KB
ea
Группа Автоморфизмов отлажено 23_04_2026
23 апр 2026, 17:08
23 апр 2026, 17:08
4513276
Код
Авторство
О чём код?
package com.ea.groupbuilder; import static com.ea.groupbuilder.DbHelper.classSubs; import static com.ea.groupbuilder.DbHelper.db; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ActivityInfo; import android.database.sqlite.SQLiteException; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; public class MainActivity extends AppCompatActivity implements InputIntInterface { private static final String TAG = "GRUGRA_MAINACT"; // final static private boolean DISPLAYLOG = false; public DbHelper dbH = null; private mAplication mApp; public Context context; private int nomerNameSubs = 0; private ListView listview; // списоа в actyvity_main private static final List<ClassNewSubs> newSubsArr = new ArrayList<>(); // массив объектов подстановок с флагом удаления ArrayAdapter<ClassNewSubs> adapterCreater; // адаптер с возможностью пометки строки по клику на ней private EditText name_subs, text_subs, new_grupp; // ввод новой подстановки private static final String defaltNamSbs = "abcdefghijklmnoprstuvwyqrsxzABCDEFGH"; private static boolean goupExist = false; // сохраненная группа есть ? TextView old_grupp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setContentView(R.layout.activity_main); mApp = (mAplication) getApplication(); mApp.activityMain = this; context = mApp.getApplicationContext(); // getBaseContext(); mApp.mExecutor = new myExecutor(mApp); f_db(); DbHelper.classSubs = mApp.classSubs; DbHelper.classSubs.initSubstitutionS(mApp); // инициализация classSubs listview = findViewById(R.id.listview); adapterCreater = new NewSubsAdapter(this); listview.setAdapter(adapterCreater); DbHelper.maxNum = new ArrayList(); // порядок разобранных в f_ciklToSubs циклов подстановок name_subs = findViewById(R.id.name_subs); text_subs = findViewById(R.id.text_subs); old_grupp = findViewById(R.id.old_grupp); new_grupp = findViewById(R.id.new_grupp); f_setDefName(); dbH.f_getGroupName(); // mApp.groupName /* if (mApp.groupName.length() > 0) { goupExist = true; if (DbHelper.saveSnLen > 0) old_grupp.setText("В базе сохранены данные группы: " + mApp.groupName + " (для исследования построена Sn для n=" + DbHelper.saveSnLen + ")" + " Для продолжения работы с " + mApp.groupName + " выберите меню 'Смотреть существующую', для создания новой введите название новой группы:" ); else old_grupp.setText("В базе сохранены данные группы: " + mApp.groupName + " Для продолжения работы с ней выберите меню 'Смотреть существующую', для создания новой введите название новой группы:" ); } else { goupExist = false; old_grupp.setText("В базе нет данных о группе, создайте новую группу"); } */ } @Override protected void onResume(){ super.onResume(); f_db(); DbHelper.classSubs = mApp.classSubs; DbHelper.classSubs.initSubstitutionS(mApp); // инициализация classSubs listview = findViewById(R.id.listview); // Log.d(TAG, "onResume groupName = " + mApp.groupName); if (mApp.groupName.length() > 0) { goupExist = true; if (DbHelper.saveSnLen > 0) old_grupp.setText("В базе сохранены данные группы: " + mApp.groupName + " (для исследования построена Sn для n=" + DbHelper.saveSnLen + ")" + " Для продолжения работы с " + mApp.groupName + " выберите меню 'Смотреть существующую', для создания новой введите название новой группы:"); else old_grupp.setText("В базе сохранены данные группы: " + mApp.groupName + " Для продолжения работы с ней выберите меню 'Смотреть существующую', для создания новой введите название новой группы:"); } else { goupExist = false; old_grupp.setText("В базе нет данных о группе, создайте новую группу"); } adapterCreater = new NewSubsAdapter(this); listview.setAdapter(adapterCreater); DbHelper.maxNum = new ArrayList(); // порядок разобранных в f_ciklToSubs циклов подстановок name_subs = findViewById(R.id.name_subs); text_subs = findViewById(R.id.text_subs); new_grupp = findViewById(R.id.new_grupp); goupExist = (mApp.groupName.length() > 0); // обработка установки и снятия отметки в списке listview.setOnItemClickListener(new AdapterView.OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { // по клику на строке помечаю ее для удаления // получаем нажатый элемент ClassNewSubs ClassNewSubs selectedSubs = (ClassNewSubs)parent.getItemAtPosition(position); boolean flag = selectedSubs.flagDelete; selectedSubs.flagDelete = ! flag; newSubsArr.remove(position); newSubsArr.add(selectedSubs); adapterCreater.notifyDataSetChanged(); } }); invalidateOptionsMenu(); } private void f_setDefName() { // заносит имя подстановки по умолчани String ss; if (nomerNameSubs < defaltNamSbs.length()) { ss = defaltNamSbs.substring(nomerNameSubs, nomerNameSubs + 1); nomerNameSubs++; } else ss = " "; name_subs.setText(ss); } public void onButtonDelClick(View v) { // удаление всех помеченных для удаления строк подстановок ClassNewSubs curSubs; for (int j = newSubsArr.size() - 1; j >= 0; j--) { curSubs = newSubsArr.get(j); // Log.e(TAG, "onButtonAddClick " + newSubsArr.get(j).textSubsr + " " + newSubsArr.get(j).name + " j = " + j + " flag="+ curSubs.flagDelete); if (curSubs.flagDelete) { adapterCreater.remove(curSubs); substitutionS.punktSn = -1; // = 1 строится группа Sn } } adapterCreater.notifyDataSetChanged(); } public void onButtonAddClick(View v) { // добавить новую подстановку в адаптер из полей name_subs, text_subs String nameS = name_subs.getText().toString(), textS = text_subs.getText().toString(); if (nameS.length() > 0 && textS.length() > 0) { if ( ! (textS.startsWith("(") && textS.endsWith(")"))) { DbHelper.err += "Ошибка в подстановке: " + textS; mApp.f_messError(2, "onButtonAddClick", true); } else { adapterCreater.add(new ClassNewSubs(nameS, textS, false)); f_setDefName(); adapterCreater.notifyDataSetChanged(); substitutionS.punktSn = -1; // = 1 строится группа Sn } } } public void f_goStroi() { // построение группы - вызывает активность построения группы if (mApp.kakBuildid) mApp.groupName = new_grupp.getText().toString(); // old_grupp if (mApp.groupName.isEmpty() ) { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()); mApp.groupName = "Группа " + sdf.format(new Date()); } substitutionS.newSubsMas = newSubsArr ; // массив объектов подстановок с флагом удаления Intent intent = new Intent(MainActivity.this, BuildActivity.class); startActivity(intent); } private void f_some() { // некоторые подстановки new ArrayAdapter<String>(this, android.R.layout.select_dialog_singlechoice, getResources().getStringArray( R.array.SpinnerAny)); final String[] groupNames = getResources().getStringArray(R.array.SpinnerAny); // массив строк имен групп в ресурсах AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Некоторые группы подстановок, выберите группу") .setItems(groupNames, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { f_AddSome(which, groupNames[which]); } }) .setCancelable(true); builder.setNegativeButton("Отменить", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); builder.create(); builder.show(); } public void f_AddSome(int someWhich, String newGruppName) { // выбрана группа из Некоторые группы, someWhich - индекс в списке некоторые группы // ссылки на массивы подстановок: int rIndGR[] = {R.array.gruppa1, R.array.gruppa2, R.array.gruppa3, R.array.gruppa4, R.array.gruppa5, R.array.gruppa6, R.array.gruppa7, R.array.gruppa8, R.array.gruppa9, R.array.gruppa10, R.array.gruppa11, R.array.gruppa12, R.array.gruppa13, R.array.gruppa14, R.array.gruppa15, R.array.gruppa16, R.array.gruppa17, R.array.gruppa18, R.array.gruppa19, R.array.gruppa20, R.array.gruppa21, R.array.gruppa22, R.array.gruppa23, R.array.gruppa24, R.array.gruppa25, R.array.gruppa26, R.array.gruppa27, R.array.gruppa28, R.array.gruppa29, R.array.gruppa30, R.array.gruppa31, R.array.gruppa32, R.array.gruppa33, R.array.gruppa34, R.array.gruppa35, R.array.gruppa36, R.array.gruppa37, R.array.gruppa38, R.array.gruppa39, R.array.gruppa40, R.array.gruppa41, R.array.gruppa42, R.array.gruppa43, R.array.gruppa44, R.array.gruppa45, R.array.gruppa46, R.array.gruppa47, R.array.gruppa48, R.array.gruppa49, R.array.gruppa50, R.array.gruppa51, R.array.gruppa52, R.array.gruppa53, R.array.gruppa54, R.array.gruppa55, R.array.gruppa56, R.array.gruppa57, R.array.gruppa58, R.array.gruppa59, R.array.gruppa60, R.array.gruppa61, R.array.gruppa62, R.array.gruppa63, R.array.gruppa64, R.array.gruppa65, R.array.gruppa66, R.array.gruppa67, R.array.gruppa68, R.array.gruppa69, R.array.gruppa70, R.array.gruppa71, R.array.gruppa72, R.array.gruppa73, R.array.gruppa74, R.array.gruppa75 }; new_grupp.setText(newGruppName); String[] podstanivki = getResources().getStringArray(rIndGR[someWhich]); // массив строк мы определили в ресурсах ранее name_subs.setText(""); text_subs.setText(""); adapterCreater.clear(); DbHelper.faktSnLen = 0; mApp.groupIndex = someWhich; if (someWhich == 0 || someWhich == 1 || someWhich == 2 || someWhich == 3) { // подстановки // if (someWhich == 0 || someWhich == 1 || someWhich == 2) { // подстановки substitutionS.punktSn = someWhich; // = 0 строится группа Sn, 1 = An // запрос числа n inputInt iI = inputInt.newInstance(); iI.f_init(this, "Задайте " + (someWhich == 3 ? "порядок" : "степень" ) + " создаваемой группы подстановок, не больше 33", 3); iI.show(getSupportFragmentManager(), "inputInt"); // продолжение f_go() } else { substitutionS.punktSn = -1; // = 1 строится группа Sn f_AddNext(podstanivki); } } private void f_AddNext(String[] podstArray) { String ss; nomerNameSubs = 0; for (String s : podstArray) { ss = defaltNamSbs.substring(nomerNameSubs, nomerNameSubs + 1); nomerNameSubs++; adapterCreater.add(new ClassNewSubs(ss, s, false)); } } public void f_go(int chislo) { //сюда передается введенное число для Sn // интерфейс ввода числа // chislo - введенное число if (chislo > 33) chislo = 33; if (substitutionS.punktSn == 1) { if (chislo < 3) chislo = 3; } DbHelper.faktSnLen = chislo; String[] podsSn = new String[chislo - 1]; if (substitutionS.punktSn == 0) { new_grupp.setText("Группа Sn для n=" + chislo); mApp.groupName = "Группа Sn для n=" + chislo; for (int i = 2; i<=chislo; i++) podsSn[i - 2] = "(1," + i + ")"; } else if (substitutionS.punktSn == 1) { new_grupp.setText("Группа An для n=" + chislo); mApp.groupName = "Группа An для n=" + chislo; podsSn = new String[chislo - 2]; for (int i = 3; i<=chislo; i++) { podsSn[i - 3] = "(1,2)(1," + i + ")"; } } else if (substitutionS.punktSn == 2) { // группа Диэдра new_grupp.setText("Группа диэдра степени n=" + chislo); mApp.groupName = "Группа Dn степен n=" + chislo; DbHelper.faktSubsLen = chislo; podsSn = new String[2]; podsSn[0] = "("; for (int i = 1; i < chislo; i++) { podsSn[0] += (i + 1) + ", "; } podsSn[0] += "1)"; String vidStr = "["; for (int i = 0; i < chislo; i++) { if (i > 0) { vidStr += ","; } vidStr += (chislo - i ) + " "; } vidStr += "]"; int vidMas [] = classSubs.f_toArray(vidStr, DbHelper.faktSubsLen); podsSn[1] = classSubs.f_toIndependentCycle(chislo, vidMas); } else if (substitutionS.punktSn == 3) { new_grupp.setText("Циклическая группа порядка n=" + chislo); mApp.groupName = "Циклическая группа порядка n=" + chislo; podsSn = new String[1]; podsSn[0] = "("; for (int i = 1; i <= chislo; i++) { if (i > 1) podsSn[0] += ","; podsSn[0] += i + " "; } podsSn[0] += ")"; } f_AddNext(podsSn); } private void f_db() { // инициалтзация базы DbHelper.tblMainName = mApp.getResources().getStringArray(R.array.tableMain); // массив строк имен таблиц с _n, _a DbHelper.TblTmpName = mApp.getResources().getStringArray(R.array.tableTmp); // массив строк имен доп таблиц dbH = DbHelper.getInstance(getApplicationContext()); try { dbH.mApp = mApp; db = dbH.getWritableDatabase(); final int version = db.getVersion(); String pth = db.getPath(); dbH.f_setVidGr(0, false); mApp.whatRun = 0; Log.d("GRUGRA_SQL", "=== OPEN version = " + version + " path = " + pth + " maxSize = "+ (db.getMaximumSize() / 1024) + "K " + dbH.db.toString()); } catch (SQLiteException e) { Log.e(TAG, "Error DataBase"+e.getMessage()); dbH = null; Toast.makeText(context, "Error write to DataBase ("+e.getMessage()+")", Toast.LENGTH_LONG).show(); finish(); return; } dbH.mApp = mApp; mApp.dbH = dbH; } public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_create, menu); // создание меню из xml return super.onCreateOptionsMenu(menu); } public boolean onPrepareOptionsMenu (Menu menu) { // изменить меню MenuItem itemLook = menu.findItem(R.id.action_old), actionCreateGenerators = menu.findItem(R.id.action_create_generators), itemPgen = menu.findItem(R.id.action_create_gen_sylow); actionCreateGenerators.setEnabled(dbH.f_testFn()); itemPgen.setEnabled(goupExist); itemLook.setEnabled(goupExist); return true; } public boolean onOptionsItemSelected(MenuItem item) { mApp.kakBuildid = false; switch (item.getItemId()) { case R.id.action_create_generators: // Построить по p-подгруппе Sn f_generPrim(1); break; case R.id.action_create_gen_sylow: // Построить по p-подгр-пе f_generPrim(0); break; case R.id.action_create_gen_delete: // Очистить все substitutionS.newSubsMas.clear(); // сюда заносятся все исходные подстановки для построения группы adapterCreater.clear(); break; case R.id.action_nec: // Некоторые подстановки f_some(); break; case R.id.action_exit: myExecutor.endWork(); // завершение работы finish(); break; case R.id.action_go: mApp.kakBuildid = true; dbH.mApp.whatRun = 1; // создать f_goStroi(); break; case R.id.action_old: // "Смотреть существующую" dbH.mApp.whatRun = 2; // расчет выполнен (или был сделан раньше) f_goStroi(); break; case R.id.action_help: // Смотреть help Intent intent = new Intent(MainActivity.this, helpActivity.class); startActivity(intent); break; } adapterCreater.notifyDataSetChanged(); return super.onOptionsItemSelected(item); } public void f_generPrim( int ffn) { // ffn = 1 - строить по Fn, = 0 по группе new AdapterSelectOne(this, dbH, ffn); adapterCreater.notifyDataSetChanged(); } public void f_setAdapterValue(String setVal, int fFn) { // выбран setVal = sylow_num - построение группы по p подгруппе // Log.e(TAG, "f_setAdapterValue setVal = " + setVal); classForResearch forResech = new classForResearch(); forResech.f_generator(mApp, fFn, setVal); } // работа по построению порождающего множества private static class NewSubsAdapter extends ArrayAdapter<ClassNewSubs> { public NewSubsAdapter(Context context) { super(context, R.layout.layout_input_subs, newSubsArr); } @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { ClassNewSubs itemSubs = getItem(position); if (convertView == null) { convertView = LayoutInflater.from(getContext()) .inflate(R.layout.layout_input_subs, null); } ((TextView) convertView.findViewById(R.id.text1)) .setText(itemSubs.name); ((TextView) convertView.findViewById(R.id.text2)) .setText(itemSubs.textSubsr); CheckBox txtFlag = convertView.findViewById(R.id.checkBox); txtFlag.setChecked(itemSubs.flagDelete); return convertView; } } } //--------------------