/
nea
/
androidGroupBuilder
Обзор
Документация
Войти
/
nea
/
androidGroupBuilder
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app/src/main/java/com/ea/groupbuilder/PrimeActivity.java
1 200 строк
59 KB
ea
Группа Автоморфизмов отлажено 23_04_2026
23 апр 2026, 17:08
23 апр 2026, 17:08
4513276
Код
Авторство
О чём код?
package com.ea.groupbuilder; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.AlertDialog; import android.content.Intent; import android.content.pm.ActivityInfo; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import com.google.android.material.floatingactionbutton.FloatingActionButton; import java.util.ArrayList; import java.util.List; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.atomic.AtomicBoolean; import android.view.ViewConfiguration; import android.widget.PopupMenu; import android.widget.TextView; public class PrimeActivity extends AppCompatActivity implements SurfaceHolder.Callback { // отображает иерархию p - подгрупп - построение диаграммы, не работает для Sn private final static String TAG = "GRUGRA_P-GRUPP"; final static private boolean DISPLAYLOG = false; private DbHelper dbH; private mAplication mApp; public substitutionS classSubs; private SurfaceView view; private PaintAll paintKal = null; public Canvas canvas = null; public volatile boolean IsCreat = false; // не созданы final static private Paint paintTxt = new Paint(Paint.ANTI_ALIAS_FLAG), paintPoint = new Paint(Paint.ANTI_ALIAS_FLAG), paintCount = new Paint(Paint.ANTI_ALIAS_FLAG), paintNorm = new Paint(Paint.ANTI_ALIAS_FLAG), paintZag = new Paint(Paint.ANTI_ALIAS_FLAG), paintClick = new Paint(Paint.ANTI_ALIAS_FLAG), paintCirc = new Paint(Paint.ANTI_ALIAS_FLAG); private static SQLiteDatabase db = null; private Cursor mCursor; final private colorSelector colorSlt = new colorSelector(); public FloatingActionButton fab; private TextView txtSoor; private final Timer tmr = new Timer(); // задает мигание для групп с заданным классом static private volatile boolean tnrFlag = false; // признак рисовать или нет группу private long mOldClicktime = 0L; final static int DOUBLE_TAP_TIMEOUT = ViewConfiguration.getDoubleTapTimeout(); private float xTopOld = 0f, yTopOld = 0f; public int snFlag = 0; // индекс при выборе таблиц: 0 - группа, 1 - Sn public String nTabE [], // {"elements" + mApp.tableNameEnd, "elements_n"} nTabA [], // {"sylow_attachments" + mApp.tableNameEnd, "sylow_attachments_n"}; nTabP []; // {"pairing_area" + mApp.tableNameEnd, "pairing_area_n"}; final String nTabId [] = {"_id", "id_true"}; public String nTabS [], nTabG []; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_norm_sub); view = findViewById(R.id.norm_view); view.getHolder().addCallback(this); txtSoor = findViewById(R.id.grzak_norm); mApp = (mAplication) getApplication(); mApp.activityCavs = this; dbH = mApp.dbH; db = dbH.getReadableDatabase(); DbHelper.err = ""; nTabE = new String[] {"elements" + mApp.tableNameEnd, "elements_n"}; nTabA = new String[] {"sylow_attachments" + mApp.tableNameEnd, "sylow_attachments_n"}; nTabP = new String[] {"pairing_area" + mApp.tableNameEnd, "pairing_area_n"}; nTabS = new String[] {"sylov_table" + mApp.tableNameEnd, "sylov_table_n"}; // ????? nTabG = new String[] {"sylov_com_grup" + mApp.tableNameEnd, "sylov_com_grup_n"}; // ???? tmr.scheduleAtFixedRate(new TimerTask() { // для мигания - не используется сейчас public void run() { tnrFlag = ! tnrFlag; } }, 0, 600); // каждые 0.7 секунд paintPoint.setStyle(Paint.Style.FILL); paintPoint.setStrokeWidth(7); paintCirc.setStyle(Paint.Style.STROKE); paintCirc.setStrokeWidth(3); paintClick.setStyle(Paint.Style.STROKE); paintClick.setStrokeWidth(3); paintClick.setARGB(255, 255, 0, 255); paintTxt.setStyle(Paint.Style.STROKE); paintTxt.setStrokeWidth(0.8f); paintTxt.setTextSize(18); paintTxt.setARGB(255, 0, 0, 0); paintCount.setStyle(Paint.Style.STROKE); paintCount.setStrokeWidth(0.5f); paintCount.setTextSize(15); paintCount.setARGB(255, 255, 0, 0); paintNorm.setStyle(Paint.Style.STROKE); paintNorm.setStrokeWidth(0.5f); paintNorm.setTextSize(15); paintNorm.setARGB(255, 0, 0, 255); paintZag.setStyle(Paint.Style.FILL); paintZag.setStrokeWidth(0.8f); paintZag.setTextSize(18); paintZag.setARGB(255, 0, 0, 0); classSubs = mApp.classSubs; setTitle("Иерархия некоторых P подгрупп"); valDataRect.clear(); valDataLines.clear(); view.setOnTouchListener ( new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(), j; int actionCode = action & MotionEvent.ACTION_MASK; // код действия: нажатие, отпускание,... int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; float xt = event.getX(pointerIndex), yt = event.getY(pointerIndex); final ViewConfiguration conf = ViewConfiguration.get(getApplicationContext()); // системные параметры для DblCklick long time_now = event.getEventTime(); long deltaTime = time_now - mOldClicktime; float deltaX = xTopOld - xt, deltaY = yTopOld - yt; float delta2 = deltaX * deltaX + deltaY * deltaY; float velocity = 0f; if (deltaTime > 0) velocity = (float) (500f * Math.sqrt(delta2) / deltaTime); switch (actionCode) { case MotionEvent.ACTION_DOWN: // 0 case MotionEvent.ACTION_POINTER_DOWN: // 5 for (j = 0; j < valDataRect.size(); j++) { dataRect dItem = valDataRect.get(j); if (dItem.f_test(xt, yt)) { dItem.clickFlag = !dItem.clickFlag; if (DISPLAYLOG) Log.e(TAG, "onTouch valDataRect= " + valDataRect.size() + " # " + dItem.numer1 + " dItem.clickFlag =" + dItem.clickFlag ); } } txtSoor.setText(""); xTopOld = xt; yTopOld = yt; mOldClicktime = time_now; break; case MotionEvent.ACTION_MOVE: // 2 // Log.e(TAG, "onTouch delta2 = "+ Math.sqrt(delta2) + " deltaX = " + deltaX + " deltaY = "+ deltaY +" deltaTime= " + deltaTime + " < DOUBLE_TAP_TIMEOUT = " + DOUBLE_TAP_TIMEOUT + " velocity =" + velocity + " > conf.getScaledMinimumFlingVelocity()= " + conf.getScaledMinimumFlingVelocity() ); if (deltaTime < DOUBLE_TAP_TIMEOUT) { // было смахивание if (velocity >= conf.getScaledMinimumFlingVelocity()) f_popClaer(); } break; case MotionEvent.ACTION_POINTER_UP: // 6 case MotionEvent.ACTION_CANCEL: // 3 default: break; } v.performClick(); return true; } } ); fab = findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { kolvoItemClick = 0; // считаю количество выбранных подгрупп for (int j = 0; j < valDataRect.size(); j++) { if (valDataRect.get(j).clickFlag) { tekDataRect = valDataRect.get(j); kolvoItemClick++; } } txtSoor.setText(""); if (DISPLAYLOG) Log.e(TAG, "fab kolvoItemClick=" + kolvoItemClick ); if (kolvoItemClick == 1) { PopupMenu popupMenu = new PopupMenu(getApplicationContext(), fab); popupMenu.inflate(R.menu.menu_popup_canvas); popupMenu.show(); popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.action_canv_lst: // Элементы подгруппы f_popList(0); return true; case R.id.action_norm_prop: f_mess(); // выдать сообщение return true; case R.id.action_canv_cykl: f_popList(1); // Цикловые индексы подгруппы return true; case R.id.action_canvas_clear: f_popClaer(); // очистить все выделения return true; default: return false; } } }); } else if (kolvoItemClick > 1) { PopupMenu popupMenu = new PopupMenu(getApplicationContext(), fab); popupMenu.inflate(R.menu.manu_popup_canv_many); popupMenu.show(); popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { /* case R.id.action_canv_many_klass: f_popList(2); // 2 - Общие цикловые индексы подгрупп return true; */ case R.id.action_canv_many_list: f_popList(3); // 3 - Общие элементы подгрупп return true; case R.id.action_canv_many_clear: f_popClaer(); // очистить все выделения return true; default: return false; } } }); } else { // ничего не выбрано PopupMenu popupMenu = new PopupMenu(getApplicationContext(), fab); popupMenu.inflate(R.menu.menu_popup_canv_select); popupMenu.show(); popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.action_canv_1: // Выбрать общие силовы подгруппы по простому f_popSelect(0); return true; case R.id.action_canv_2: // Выбрать подгруппы уровня f_popSelect(1); return true; case R.id.action_canv_3: // Выбрать силовы подгруппы по простому f_popSelect(2); return true; case R.id.action_canv_clas: // Выбрать подгруппы содержащии класс f_popSelect(3); return true; case R.id.action_canv_normp: // Выбрать подгруппы с заданной нормальной подгр-пой f_popSelect(4); return true; default: return false; } } }); } } }); } static final String txtCoob[] ={ "Выбраны общие силовы подгруппы по простому ", "Выбраны подгруппы уровня ", "Выбраны силовы подгруппы по простому ", "Выбраны силовы подгруппы с заданным классом ", "Выбраны силовы подгруппы с заданной нормальнлй подгруппой " }; private void f_popSelect(int kod) { /* выбрать kod = 0 Выбрать общие силовы подгруппы по простому 1 Выбрать подгруппы уровня 2 Выбрать силовы подгруппы по простому 3 - Выбрать подгруппы содержащии кдасс 4 - выбрать норм подгр=пу */ txtSoor.setText("Выделено: " + txtCoob[kod]); AdapterShowList adapterList = new AdapterShowList(this); adapterList.f_selectCanvasMenu(this, dbH, kod); adapterList.f_showList(); } public void f_go(int intVal, int kod) { if (DISPLAYLOG) Log.e(TAG, "f_go intVal=" + intVal + " kod = " + kod); if (kod == 4) { // указать норм подгр=пу, выбрана № intVal final String sqlGet = "select distinct nn1, nn2 from (\n" + " select S.nomer1 as nn1, S.nomer2 as nn2\n" + " from sylov_com_grup" + mApp.tableNameEnd + " s\n" + "\twhere s.id_s in (\n" + "select P.id_subs\n" + " from pairing_area" + mApp.tableNameEnd + " P, sub_structure S20\n" + " where S20.num_subs = P.class_area and not P.cykl_len is null and \n" + " S20.num_maim = " + intVal + "\n" + "\t\t\t\t )\n" + " union all\n" + " select S.num as nn1, 0 as nn2\n" + " from sylov_table s\n" + "\twhere s.id_s in (\n" + "\t select P.id_subs\n" + " from pairing_area" + mApp.tableNameEnd + " P, sub_structure S20\n" + " where S20.num_subs = P.class_area and not P.cykl_len is null and \n" + " S20.num_maim = " + intVal + "\n" + "\t\t\t )\n" + " )"; Cursor cursorGet = db.rawQuery(sqlGet, null); int iL1 = cursorGet.getColumnIndex("nn1"), iL2 = cursorGet.getColumnIndex("nn2"), n1, n2, i; for ( i = 0; i < valDataRect.size(); i++) // очистка norm_nomer_count valDataRect.get(i).clickFlag = false; if (cursorGet.moveToFirst()) { do { n1 = cursorGet.getInt(iL1); n2 = cursorGet.getInt(iL2); for ( i = 0; i < valDataRect.size(); i++) { dataRect dRec = valDataRect.get(i); if (dRec.numer1 == n1 && dRec.numer2 == n2) { dRec.clickFlag = true; break; } } } while (cursorGet.moveToNext()); } cursorGet.close(); } else { for (int i = 0; i < valDataRect.size(); i++) { dataRect dRec = valDataRect.get(i); switch (kod) { case 0: if (dRec.numer2 > 0 && dRec.pe == intVal) dRec.clickFlag = true; break; case 1: if (dRec.numer2 == intVal) dRec.clickFlag = true; break; case 2: if (dRec.numer2 == 0 && dRec.pe == intVal) dRec.clickFlag = true; break; case 3: // пометить группы с выбранным классом break; // classFlag установлен в AdapterShowList } } } txtSoor.setText(txtCoob[kod] + intVal); } private void f_popList(int cod) { if (DISPLAYLOG) Log.e(TAG, "f_popList cod = " + cod); AdapterShowList adapterList = new AdapterShowList(this); adapterList.f_setCanvas(this, dbH, valDataRect, cod); adapterList.f_showList(); } private void f_popClaer() { // очистить все выделения for (int i = 0; i < valDataRect.size(); i++) { valDataRect.get(i).clickFlag = false; valDataRect.get(i).classFlag = 0; // рисование кружков без мигания // valDataRect.get(i).norm_nomer_count = 0; } } private void f_paint() { // f_paint_auto() // рисование if (IsCreat) { int j; canvas.drawColor(Color.WHITE); canvas.save(); sh = canvas.getHeight(); sw = canvas.getWidth(); colorSelector.indColor = 0; canvas.drawText( (mApp.tableNameEnd.equals("_a") ? "Автоморфизмы " : "") + mApp.groupName, 17f, sh / 20f, paintZag); if (valDataRect.size() == 0) { f_create0(); // уровень -1, 0 for (j = 0; j < countUroven; j++) f_createUroven(j + 1); // общ сил подгруппы уровня j + 1 if (snFlag > 0) f_create1(); // установить classFlag 0 признак в подгруппу Sn входит P-группа основной группы } if (valDataLines.size() == 0) { f_createLines(1); f_createLines(2); } for (j = 0; j < valDataRect.size(); j++) { valDataRect.get(j).f_draw(); // рисование кружков } for (j = 0; j < valDataLines.size(); j++) { valDataLines.get(j).f_draw(); // рисование линии } // Log.e(TAG, "f_paint valDataRect= " + valDataRect.size()); canvas.restore(); } } private void f_create1() { // установить classFlag 0 признак в подгруппу Sn входит P-группа основной группы final String ss1 = "select syl_flag, num_s, num_p, sum(xxx) sum_p, norm_nomer\n" + " from (\n" + " select distinct 0 syl_flag, SN.num num_s, SM.num num_p, count(*) xxx, SN.norm_nomer norm_nomer\n" + // силовские " from elements" + mApp.tableNameEnd + " AA, elements_n BB, sylov_table SM, sylov_table_n SN\n" + " where AA._id = BB.link_to_elements and\n" + " AA._id = SM.id_s and BB.id_true = SN.id_s and\n" + " substr(BB.sylow_num, (\n" + " select substr( '0000', 1, 3 - length(S.num)) || S.num\n" + " from sylov_table_n S)\n" + " ) > 0\n" + " group by SN.num, SM.num\n" + " having count(*) > 1\n" + " union all\n" + " select distinct SN.nomer2 syl_flag, SN.nomer1 num_s, SM.nomer1 num_p, count(*) xxx, SN.norm_nomer norm_nomer_i \n" + // уровень выше силовских " from elements" + mApp.tableNameEnd + " AA, elements_n BB, sylov_com_grup" + mApp.tableNameEnd + " SM, sylov_com_grup_n SN\n" + " where AA._id = BB.link_to_elements and\n" + " AA._id = SM.id_s and BB.id_true = SN.id_s\n" + " group by SN.nomer1, SM.nomer1\n" + " having count(*) > 1\n" + " )\n" + " group by syl_flag, num_s, num_p\n" + "order by num_s asc, num_p asc;"; int syl_flag, num_s, num_p, sum_p, m, l = valDataRect.size(), syl_flag_i, num_s_i, num_p_i, sum_p_i, norm_nomer_i; dataRect dRect; for (m = 0; m < l; m++) { dRect = valDataRect.get(m); dRect.sylSubFlg.clear(); dRect.numSub.clear(); dRect.countItem.clear(); } Cursor curSnForm = db.rawQuery(ss1, null); curSnForm.moveToFirst(); if (curSnForm.getCount() > 0) { syl_flag_i = curSnForm.getColumnIndex("syl_flag"); num_s_i = curSnForm.getColumnIndex("num_s"); num_p_i = curSnForm.getColumnIndex("num_p"); sum_p_i = curSnForm.getColumnIndex("sum_p"); norm_nomer_i = curSnForm.getColumnIndex("norm_nomer"); do { num_p = curSnForm.getInt(num_p_i); num_s = curSnForm.getInt(num_s_i); sum_p = curSnForm.getInt(sum_p_i); syl_flag = curSnForm.getInt(syl_flag_i); // уровень подгр // Log.e(TAG, "f_calcPrim new fff=" + fff + " id = " + id ); for (m = 0; m < l; m++) { dRect = valDataRect.get(m); if (syl_flag == dRect.numer2 && num_s == dRect.numer1) { dRect.classFlag = 1; dRect.sylSubFlg.add(syl_flag); dRect.numSub.add(num_p); dRect.countItem.add(sum_p); dRect.norm_nomer_count = curSnForm.getInt(norm_nomer_i); } } } while (curSnForm.moveToNext()); } curSnForm.close(); } static private int countUroven = 0; // всего уровней общих подгрупп static boolean rejPnt = false; // true - не рисую все сил подгруппы, только 1-ю и последнюю для каждого p double radius = 0., wElement = 0.; // ширина на 1 элемент группы = 2 * radius private int sh = 0; private int sw = 0; // размеры экрана, размер private int sh2 = 0; // высота элемента + отступ private int kolvoItemClick = 0; // количество выбранных подгрупп private void f_create0() { // рисование уровня -1 и 0 - силовские подгруппы String selStr; dbH.f_getParm(0, 5, snFlag ); int cNo = dbH.f_getCount("select count(*) as ccc from " + nTabE[snFlag] + " where sylow_num is null;"); // чмсло эл-тов не входящих в сил подгр int cSoc = dbH.f_getCount("select count(*) as ccc from " + nTabE[snFlag] + " where sylow_num is null and nomer_soc > 0;"); // чмсло эл-тов цоколя int hTop, wTop, iL1, iL2, iL4, iL5, pe, peOld = 0, norm_n = 0; countUroven = dbH.f_getCount("select max(nomer2) as ccc from " + nTabG[snFlag] + ";"); // max уровней вложенности общих сил подгрупп // DbHelper.countElements = dbH.f_getCount("select count(*) as ccc from " + nTabE[snFlag] + ";"); valDataRect.clear(); // определяю общее число элементов по сил подгрупп int allSylGrupp = dbH.f_getCount("select max(num) as ccc from " + nTabS[snFlag] + ";"); // всего групп // allSylCount = dbH.f_getCount("select count(id_s) as ccc from " + nTabS[snFlag] + ";"); // всего в них элементов Log.e(TAG, "f_create0 allSylGrupp= " + allSylGrupp + " countUroven=" + countUroven + " snFlag = " + snFlag + " tableNameEnd = " + mApp.tableNameEnd + " nTabG="+ nTabG[snFlag] + " nTabE = " + nTabE[snFlag]); int cPe0 = ( snFlag == 0 ? substitutionS.sylovPrimeGrupNum.size() : substitutionS.sylovPrimeGrupNum_n.size()); // разных pe if (allSylGrupp <= 0) return; iL1 = (int) sh / 12; if (countUroven > 0) sh2 = (int) (sh / (countUroven + 2) - iL1); // высота элемента + отступ else sh2 = (int) (0.25 * sh) - 15; sh -= iL1; // поднять все sh - высота экрана // h отступа // высота элемента вместе с отступом int hElement = (int) (0.35 * sh2); // высота элемента int hSpace = sh2 - hElement; // h отступа double kElem, kPusto, lPusto, lBody; if (allSylGrupp > 15) { rejPnt = true; // не рисую все сил подгруппы, только 1-ю и последнюю для каждого p kElem = 3.* cPe0; // элеметнов на этаже 0 kPusto = 4.* cPe0 - 1; // промежутков на этаже } else { kPusto = allSylGrupp - 1; kElem = allSylGrupp; } radius = 0.5 * 0.55 * sw / kElem; // от длины на 1 элемент if (radius > 0.5 * hElement) radius = 0.5 * hElement; wElement = 2. * radius; int nom1; /* if (DISPLAYLOG) Log.e(TAG, "f_create0 radius= " + radius + " hElement=" + hElement + " kPusto = " + kPusto + " kElem="+ kElem+ " cNo="+ cNo + " cPe="+ cPe0 + " allSylGrupp = "+ allSylGrupp + " countUroven=" + countUroven); if (DISPLAYLOG) Log.e(TAG, "f_create0 sw= " + sw + " sh = " + sh + " sw2= " + wElement + " sh2 = " + sh2 + " dbH.countElements=" + DbHelper.countElements + " cNo=" + cNo + " rejPnt="+ rejPnt); if (DISPLAYLOG) Log.e(TAG, "f_create0 hElement= " + hElement + " hSpace = " + hSpace + " wElement= " + wElement); */ // рисование никчемных элементов - с номером 0 = подвал hTop = sh - sh2; wTop = (int) (sw / 2.); paintCirc.setARGB(255, colorSelector.rCol, colorSelector.gCol, colorSelector.bCol); valDataRect.add( new dataRect(0, 0, -1, wTop, hTop, cNo, cSoc, 0, 0f, 0f, 0f, 0)); // if (DISPLAYLOG) // Log.e(TAG, "f_create0 -1 уровень wTop=" + wTop + " hTop=" + hTop ); // рисую уровень сил подгрупп int peEndNum = 0, // № последней сил подгрупп для текущего pe peFirst = 0; // номер считанной записи по pe selStr = "select num, pe, count(id_s) as ccc, norm_nomer\n" + "\tfrom " + nTabS[snFlag] + "\n" + "\tgroup by num, pe, norm_nomer\n" + "\torder by pe asc, num asc;"; mCursor = db.rawQuery(selStr, null); lBody = (int) ( kElem * wElement); lPusto = (int) (sw - lBody) / ( kPusto + 4.);// 2 отступа с начале и 2 в конце int l0 = (int) (2 * lPusto + radius), // координата центра след круга kolPeGr = 0; // кол-во разных групп для текущего pe hTop = sh - sh2 * 2; boolean tochkaFlag = false; // if (DISPLAYLOG) // Log.e(TAG, "f_create0 lBody= " + lBody + " LPusto=" + lPusto + " hTop=" + hTop + " kElem=" + kElem // + " kPusto=" + kPusto); if (mCursor.moveToFirst()) { if (mCursor.getCount() > 0) { iL1 = mCursor.getColumnIndex("num"); iL2 = mCursor.getColumnIndex("pe"); iL4 = mCursor.getColumnIndex("ccc"); iL5 = mCursor.getColumnIndex("norm_nomer"); do { cNo = mCursor.getInt(iL4); pe = mCursor.getInt(iL2); nom1 = mCursor.getInt(iL1); // num norm_n = mCursor.getInt(iL5); if (pe != peOld) { peOld = pe; colorSlt.f_setColor(); paintCirc.setARGB(255, colorSelector.rCol, colorSelector.gCol, colorSelector.bCol); peFirst = 0; peEndNum = dbH.f_getCount("select max(num) as ccc from " + nTabS[snFlag] + " where pe = " + pe + "; "); kolPeGr = dbH.f_getCount("select count(distinct num) as ccc from " + nTabS[snFlag] + " where pe =" + pe + "; "); } // if (DISPLAYLOG) // Log.e(TAG, "f_create0 nom1="+ nom1 + " pe= "+ pe+ " peFirst= "+ peFirst + " peEndNum= "+ peEndNum +" lBody= " + lBody + " lPusto=" + lPusto + " hTop=" + hTop + " l0=" + l0); cSoc = dbH.f_getCount("select count(*) as ccc from " + nTabE[snFlag] + " E, " + nTabS[snFlag] + " S \n" + "where E.nomer_soc > 0 and \n" + " S.id_s = E." + nTabId[snFlag] + " and S.num = "+ nom1 + ";"); // чмсло эл-тов цоколя tochkaFlag = false; if (rejPnt) { // рисовать не все сил подгруппы if (peFirst == 0 || peFirst == 1 || peEndNum == nom1) { if (peEndNum == nom1 && peFirst != 0 && kolPeGr > 3) { // увеличить отступ tochkaFlag = true; l0 += lPusto; } if (tochkaFlag) valDataRect.add(new dataRect(pe, nom1, 0, l0, hTop, cNo, cSoc, colorSelector.indColor, (float) (l0 - 2f * lPusto / 5f - lPusto), (float) (l0 - 2f * lPusto), (float) (l0 - 4f * lPusto / 5f - lPusto), norm_n)); else valDataRect.add(new dataRect(pe, nom1, 0, l0, hTop, cNo, cSoc, colorSelector.indColor, 0f, 0f, 0f, norm_n)); // if (DISPLAYLOG) // Log.e(TAG, "f_create0!!! nom1= "+nom1+ " pe= "+ pe+ " hTop"+ hTop + " l0=" + l0); l0 += (wElement + lPusto); } } else { valDataRect.add(new dataRect(pe, nom1, 0, l0, hTop, cNo, cSoc, colorSelector.indColor, 0f, 0f, 0f, norm_n)); // if (DISPLAYLOG) // Log.e(TAG, "f_create0!!! pe= "+ pe+ " hTop"+ hTop + " l0=" + l0); l0 += (wElement + lPusto); } peFirst++; } while (mCursor.moveToNext()); } } // Log.e(TAG, "fcreate0 valDataRect= " + valDataRect.size()); } private void f_createUroven(int urv) { // рисование для общих подстановок уровня urv // всего групп уровня urv int allUr1Grupp = dbH.f_getCount("select count(distinct nomer1) as ccc from " + nTabG[snFlag] + " where nomer2 = " + urv + ";"), // всего элементов уровня 1 allUr1Count = dbH.f_getCount("select count(*) as ccc from " + nTabG[snFlag] + " where nomer2 = " + urv + ";"), cPe1 = dbH.f_getCount("select count(distinct pe) as ccc from " + nTabG[snFlag] + " where nomer2 = " + urv + ";"); // разных pe double kElem, kPusto, lPusto, lBody; rejPnt = allUr1Grupp > 15; if (rejPnt) { // не рисую все сил подгруппы, только 1-ю и последнюю для каждого p kElem = 3.* cPe1; // элеметнов на этаже 0 kPusto = 4.* cPe1 - 1; // промежутков на этаже } else { kPusto = allUr1Grupp - 1; kElem = allUr1Grupp; } lBody = (int) ( kElem * wElement); lPusto = (int) (sw - lBody) / ( kPusto + 4.);// 2 отступа с начале и 2 в конце int l0 = (int) (3 * lPusto); // координата центра след круга int hTop = sh - sh2 * (urv + 2); int iL2, iL3, iL4, iL5, nom1, cNo, peFirst = 0, peEndNum = 0, pe, peOld = 0, cSoc, nn_nom = 0, kolPeGr = 0; // кол-во разных групп для текущего pe String selStr = "select pe, nomer1, count(id_s) as ccc, norm_nomer\n" + "from " + nTabG[snFlag] + " where nomer2 = " + urv + "\n" + "group by pe, nomer1, norm_nomer\n" + "having count(id_s) > 1 " + " order by nomer1 asc; "; mCursor = db.rawQuery(selStr, null); // if (DISPLAYLOG) // Log.e(TAG, "f_createUroven lBody= " +lBody +" lPusto=" + lPusto + " hTop=" + hTop + " allUr1Grupp=" + allUr1Grupp // + " allUr1Count=" + allUr1Count + " urv = " + urv); colorSlt.f_setColor(); paintCirc.setARGB(255, colorSelector.rCol, colorSelector.gCol, colorSelector.bCol); boolean tochkaFlag; if (mCursor.moveToFirst()) { iL2 = mCursor.getColumnIndex("pe"); iL3 = mCursor.getColumnIndex("nomer1"); iL4 = mCursor.getColumnIndex("ccc"); iL5 = mCursor.getColumnIndex("norm_nomer"); do { nom1 = mCursor.getInt(iL3); pe = mCursor.getInt(iL2); cNo = mCursor.getInt(iL4); nn_nom = mCursor.getInt(iL5); if (pe != peOld) { peOld = pe; colorSlt.f_setColor(); paintCirc.setARGB(255, colorSelector.rCol, colorSelector.gCol, colorSelector.bCol); peFirst = 0; peEndNum = dbH.f_getCount("select max(nomer1) as ccc from " + nTabG[snFlag] + " where nomer2 = "+ urv + " and pe = " + pe + "; "); kolPeGr = dbH.f_getCount("select count(distinct nomer1) as ccc from " + nTabG[snFlag] + " where nomer2= "+ urv + " and pe = " + pe + ";"); } cSoc = dbH.f_getCount("select count(*) as ccc from " + nTabE[snFlag] + " E, " + nTabG[snFlag] + " S \n" + "where E.nomer_soc > 0 and \n" + " S.id_s = E." + nTabId[snFlag] + " and S.nomer1 = "+nom1+";"); // чмсло эл-тов цоколя tochkaFlag = false; if (rejPnt) { // рисовать не все сил подгруппы if (peFirst == 0 || peFirst == 1 || peEndNum == nom1) { if (peEndNum == nom1 && peFirst != 0 && kolPeGr > 3) { // увеличить отступ l0 += lPusto; tochkaFlag = true; } if (tochkaFlag) valDataRect.add(new dataRect(pe, nom1, urv, l0, hTop, cNo, cSoc, colorSelector.indColor, (float) (l0 - 2f * lPusto / 5f - lPusto), (float) (l0 - 2f * lPusto), (float) (l0 - 4f * lPusto / 5f - lPusto), nn_nom)); else valDataRect.add(new dataRect(pe, nom1, urv, l0, hTop, cNo, cSoc, colorSelector.indColor, 0f, 0f, 0f, nn_nom)); // if (DISPLAYLOG) // Log.e(TAG, "f_createUroven!!! nom1= "+nom1+ " pe= "+ pe+ " hTop"+ hTop + " l0=" + l0 + " urv="+ urv); l0 += (wElement + lPusto); } } else { valDataRect.add(new dataRect(pe, nom1, urv, l0, hTop, cNo, cSoc, colorSelector.indColor, 0f, 0f, 0f, nn_nom)); // if (DISPLAYLOG) // Log.e(TAG, "f_createUroven!!! pe= "+ pe+ " hTop"+ hTop + " l0=" + l0); l0 += (wElement + lPusto); } peFirst++; } while (mCursor.moveToNext()); } } private void f_createLines(int uroven) { // построение линий уровня uroven substitutionS.codEdinicy = dbH.f_getCount("select _id as ccc from " + nTabE[snFlag] + " where deg = 0;"); final String selStr = "select mail_num as syln, att_num as comn, pe as pe from " + nTabA[snFlag] + "\n" + "where main_lelel = "+ (uroven - 1) +" and att_level = "+ uroven +" \n"; // if (DISPLAYLOG) // Log.e(TAG, "f_createLines uroven= " +uroven +" SQL=" + selStr); mCursor = db.rawQuery(selStr, null); int iL1, iL2, iLPe, sNom, cNom, j, pe0 = 0, pe; dataRect sRect, cRect; Paint paintLine = new Paint(Paint.ANTI_ALIAS_FLAG); paintLine.setStrokeWidth(1); if (mCursor.moveToFirst()) { iL1 = mCursor.getColumnIndex("syln"); iLPe = mCursor.getColumnIndex("pe"); iL2 = mCursor.getColumnIndex("comn"); do { sNom = mCursor.getInt(iL1); // номер силовской подгруппы cNom = mCursor.getInt(iL2); // номер общей pe = mCursor.getInt(iLPe); if (pe != pe0) { colorSlt.f_setColor(); paintLine.setARGB(255, colorSelector.rCol, colorSelector.gCol, colorSelector.bCol); pe0 = pe; } sRect = cRect = null; for (j=0; j<valDataRect.size(); j++) { if (valDataRect.get(j).numer2 == (uroven - 1) && valDataRect.get(j).numer1 == sNom) // силова sRect = valDataRect.get(j); if (valDataRect.get(j).numer2 == uroven && valDataRect.get(j).numer1 == cNom) // общая cRect = valDataRect.get(j); } if (sRect != null && cRect != null) { // создаю линию valDataLines.add( new dataLines(cRect, sRect, paintLine)); // if (DISPLAYLOG) // Log.e(TAG, "f_createLines uroven= " +uroven + " sNom=" + sNom +" cNom=" + cNom + " cRect.xBot=" + cRect.xBot +" yBot=" + cRect.yBot + // " sRect.xTop=" + sRect.xTop + " yTop=" + sRect.yTop); } } while (mCursor.moveToNext()); } } static private dataRect tekDataRect; // кликнуты крудок public void f_mess() { // двойной клик выдать сообщение String str, siqvel, ss1 = ""; int urMain = 0, urSub = 1, kolSubs = 0, i, kolKomm = 0, // число элементов из коммутанта kolChet = 0; // число четных подстановок switch (tekDataRect.numer2) { case -1: str = "Элементы, не входящие в силовские подгруппы "; kolKomm = dbH.f_getCount("select count(E._id) as ccc from " + nTabE[snFlag] + " E\n" + " where E.switchboard_num > 0 and E.sylow_num is null;"); kolChet = dbH.f_getCount("select count(E._id) as ccc from " + nTabE[snFlag] + " E\n" + " where E.parity = 0 and E.sylow_num is null;"); str += "\nсодержит " + kolKomm + " коммутаторов"; str += "\nсодержит " + tekDataRect.socCount + " элементов цоколя"; str += "\nи " + kolChet + " четных подстановок"; break; case 0: // if ( > 0) { str = "Подгруппа силова № " + tekDataRect.numer1 + ((snFlag > 0) ? " группы Sn" : "") + " P= "+ tekDataRect.pe; siqvel = "select ' ' || att_num as stext from " + nTabA[snFlag] + " G\n" + " where G.main_lelel = 0 and G.pe = " + tekDataRect.pe + " and \n" + " G.att_level = 1 and G.mail_num = "+ tekDataRect.numer1 + ";"; kolSubs = dbH.f_getMas(siqvel); if (kolSubs > 0) { str += "\n содержит " + kolSubs + " подгрупп уровня 1 с номерами:"; for (i = 0; i < kolSubs; i++) str += (" " + DbHelper.selectedMas[i]); } kolKomm = dbH.f_getCount("select count(E._id) as ccc from " + nTabE[snFlag] + " E, " + nTabS[snFlag] + " S\n" + " where E." + nTabId[snFlag] + " = S.id_s and E.switchboard_num > 0 and S.num = " + tekDataRect.numer1 + ";"); kolChet = dbH.f_getCount("select count(E." + nTabId[snFlag] + ") as ccc from " + nTabE[snFlag] + " E, " + nTabS[snFlag] + " S\n" + " where E." + nTabId[snFlag] + " = S.id_s and E.parity = 0 and S.num = " + tekDataRect.numer1 + ";"); str += "\nсодержит " + kolKomm + " коммутаторов"; str += "\nсодержит " + tekDataRect.socCount + " элементов цоколя"; str += "\nи " + kolChet + " четных подстановок"; break; default: str = "Общая подгруппа силовских подгрупп "+ ((snFlag > 0) ? " группы Sn" : "") + " № " + tekDataRect.numer1 + " уровня "+tekDataRect.numer2+ " P= "+ tekDataRect.pe ; urMain = tekDataRect.numer2 - 1; urSub = tekDataRect.numer2; // что содержит siqvel = "select ' ' || att_num as stext from " + nTabA[snFlag] + " G\n" + " where G.main_lelel = " + urSub + " and G.pe = " + tekDataRect.pe + " and \n" + " G.att_level = "+ (urSub + 1) + " and G.mail_num = "+ tekDataRect.numer1 + ";"; kolSubs = dbH.f_getMas(siqvel); if (kolSubs > 0) { str += "\n содержит " + kolSubs + " подгрупп уровня " + (urSub + 1) + " с номерами:"; for (i = 0; i < kolSubs; i++) str += (" " + DbHelper.selectedMas[i]); } // куда входит /* select mail_num as ccc from sylow_attachments G where G.pe = 2 and G.main_lelel = 0 and G.att_level = 1 and G.att_num = 4 */ siqvel = "select ' ' || mail_num as stext from " + nTabA[snFlag] + " G\n" + " where G.main_lelel = " + urMain + " and G.pe = " + tekDataRect.pe + " and \n" + " G.att_level = "+ urSub + " and G.att_num = "+ tekDataRect.numer1 + ";"; kolSubs = dbH.f_getMas(siqvel); if (kolSubs > 0) { str += "\n входит в " + kolSubs + " подгрупп уровня " + urMain + " с номерами:"; for (i = 0; i < kolSubs; i++) str += (" " + DbHelper.selectedMas[i]); } kolKomm = dbH.f_getCount("select count(E." + nTabId[snFlag] + ") as ccc from " + nTabG[snFlag] + " S, " + nTabE[snFlag] + " E\n" + " where E." + nTabId[snFlag] + " = S.id_s and E.switchboard_num > 0 and S.nomer1 = " + tekDataRect.numer1 + ";"); kolChet = dbH.f_getCount("select count(E." + nTabId[snFlag] + ") as ccc from " + nTabG[snFlag] + " S, " + nTabE[snFlag] + " E\n" + " where E." + nTabId[snFlag] + " = S.id_s and E.parity = 0 and S.nomer1 = " + tekDataRect.numer1 + ";"); str += "\nсодержит " + kolKomm + " коммутаторов"; str += "\nсодержит " + tekDataRect.socCount + " элементов цоколя"; str += "\nи " + kolChet + " четных подстановок"; } if (tekDataRect.classFlag > 0) { ss1 = "\nЭта подгруппа Sn cодержит элементы p-подгрупп построенной группы:\n"; for (i = 0; i < tekDataRect.numSub.size(); i++) ss1 += " уровня " + tekDataRect.sylSubFlg.get(i) + " № " + tekDataRect.numSub.get(i) + " всего элементов построенной подгруппы " + tekDataRect.countItem.get(i) + "\n"; } str += ss1 + "\nвсего элементов "+tekDataRect.count; if (DISPLAYLOG) Log.e(TAG, "f_mess kolSubs= " + kolSubs + " urMain="+ urMain + " urSub="+ urSub+ " sql= " + str); AlertDialog.Builder builderCanv; builderCanv = new AlertDialog.Builder(this); builderCanv.setMessage(str) .setNegativeButton("Выход", null) .setIcon(R.drawable.textview_border) .show(); } private MenuItem mItemSn; // Выделение распавших классов public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_canvas, menu); mItemSn = menu.findItem(R.id.action_sn_subgrup); mItemSn.setEnabled( dbH.f_testFn() ); return super.onCreateOptionsMenu(menu); } public boolean onPrepareOptionsMenu(Menu menu) { mItemSn.setEnabled( dbH.f_testFn() ); return super.onPrepareOptionsMenu(menu); } public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_sn_subgrup: // Как подгр-па Sn item.setChecked( ! item.isChecked()); snFlag = item.isChecked() ? 1 : 0; stopPotok(); repaint(); break; case R.id.action_exit_canvas: finish(); break; case R.id.action_help_canvas: Intent intent = new Intent(PrimeActivity.this, helpActivity.class); startActivity(intent); break; } return super.onOptionsItemSelected(item); } @Override public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) { if (DISPLAYLOG) Log.d(TAG, "surfaceChanged width=" + width +" height="+ height ); IsCreat = true; repaint(); } @Override public void surfaceCreated(@NonNull SurfaceHolder holder) { IsCreat = true; repaint(); } @Override public void surfaceDestroyed(@NonNull SurfaceHolder holder) { IsCreat = false; } @Override protected void onStop( ) { super.onStop() ; if (DISPLAYLOG) Log.d(TAG, "=== onStop" ); stopPotok(); mApp.activityCavs = null; } @Override protected void onDestroy( ) { super.onDestroy(); if (DISPLAYLOG) Log.d(TAG, "=== onDestroy"); stopPotok(); if (tmr != null) { tmr.purge(); tmr.cancel(); } } @Override protected void onRestart( ) { super.onRestart() ; if (DISPLAYLOG) Log.d(TAG, "=== onRestart" ); } @Override protected void onPause() { super.onPause(); //Log.d("SQL", "=== onPause txtKak="+txtKak ); stopPotok(); } public void startPotok() // запустить поток для рисования { paintKal = new PaintAll(this, view); paintKal.setRunning(true); paintKal.setName("paintKal"); paintKal.setPriority(1); paintKal.start(); // запустить поток // Log.d(TAG, "startPotok " ); } public void stopPotok() {// остановить поток рисования if (paintKal != null) { if (paintKal.running.get()) { paintKal.stopPotok(); boolean retry = true; while (retry) { try {// ожидание завершение потока paintKal.join(); retry = false; } catch (InterruptedException e) { Log.d(TAG, "Error stopPotok " + e.toString()); // Toast.makeText(getApplicationContext(), "Error stopPotok " + e.toString(), //??? Toast.LENGTH_LONG).show(); } } } if (DISPLAYLOG) Log.e(TAG, "stopPotok snFlag = " + snFlag ); } paintKal = null; // IsCreat = false; valDataLines.clear(); valDataRect.clear(); } public void repaint() { if (DISPLAYLOG) Log.e(TAG, "repaint snFlag = " + snFlag + " IsCreat = " + IsCreat + " paintKal = " + (paintKal == null) ); if (IsCreat) { if (DISPLAYLOG) Log.d(TAG, "repaint sh2= " + sh2); if (paintKal == null) startPotok(); } } final private List<dataLines> valDataLines = new ArrayList<>(); // список всех построенных линий private class dataLines { // построенная линия final private dataRect sRect, cRect; final private Paint paintLine; dataLines(dataRect n1Rect, dataRect n2Rect, Paint nPaint) { sRect = n2Rect; cRect = n1Rect; paintLine = nPaint; paintLine.setAntiAlias(true); } public void f_draw() { canvas.drawLine((float) cRect.xBot, (float) cRect.yBot, (float) sRect.xTop, (float) sRect.yTop, paintLine ); } } // хранилище данных Rect final public List<dataRect> valDataRect = new ArrayList<>(); // список всех построенных Item public class dataRect{ // один кружок для рисования public boolean clickFlag = false; // выбрана подгруппа final private float t1, t2, t3; final private int count; // число элементов public int numer1, numer2, pe; // номер подгр, уровня, public int classFlag = 0, // > 0 - кружок мигает - выбранный класс входит в эту подгруппу norm_nomer_count = 0; // номер норм подгруппы, если она нормальная final private int socCount; private int indColor = 1; // число эл-тов цоколя final private float xn, yn; // координаты центра public double xTop = 0, yTop = 0; // входная точка для линий public double xBot = 0, yBot = 0; // выходная точка для линий // данные подгруппы когда есть Sn public List<Integer> sylSubFlg = new ArrayList<>(), // 0 - силова, иначе уровень подгр=пы numSub = new ArrayList<>(), // номер подгр-пы countItem = new ArrayList<>(); // элементов подго в данной группе Sn dataRect(int pe_, int numer1_, int numer2_, int xn_, int yn_, int count_, int cSoc, int indColor_, float g1, float g2, float g3, int n_nomer) { indColor = indColor_; t1 = g1; t2 = g2; t3 = g3; pe = pe_; numer1 = numer1_; numer2 = numer2_; xn = xn_; yn = yn_; count = count_; socCount = cSoc; norm_nomer_count = n_nomer; if (DISPLAYLOG) Log.e(TAG, "dataRect numer1 = " +numer1 +" xn=" + xn + " yn=" + yn + " urov="+ numer2); // устанавливает все xTop,... yBot xTop = xBot = xn ; yTop = yn - radius; yBot = yn + radius; } public void f_draw() { // рисование colorSelector.indColor = indColor; colorSlt.f_setColor(); if (t1 > 0f) { // много кружков - рисовать точки paintPoint.setARGB(255, colorSelector.rCol, colorSelector.gCol, colorSelector.bCol); canvas.drawPoint(t1, yn, paintPoint); canvas.drawPoint(t2, yn, paintPoint); canvas.drawPoint(t3, yn, paintPoint); } RectF rectSyl = new RectF((float) (xn - radius), (float) (yn - radius), (float) (xn + radius), (float) (yn + radius)); paintCirc.setStyle(Paint.Style.STROKE); paintCirc.setARGB(255, colorSelector.rCol, colorSelector.gCol, colorSelector.bCol ); canvas.drawCircle(xn, yn, (float) radius, paintCirc); if (clickFlag) { canvas.drawCircle(xn, yn, (float) radius + 4f, paintClick); // Log.e(TAG, "f_draw valDataRect= " + valDataRect.size() + " # " + numer1); } // Log.e(TAG, "f_draw tnrFlag = " + tnrFlag +" classFlag= "+ classFlag + " numer1= " + numer1 + " count =" + count + " norm_nomer_count = " + norm_nomer_count); if (tnrFlag || classFlag == 0) { // мигание paintCirc.setStyle(Paint.Style.FILL); // заливаем canvas.drawArc(rectSyl, 0f, (float) (360f * count / (snFlag > 0 ? DbHelper.countElements_n : DbHelper.countElements)), true, paintCirc); canvas.drawText("" + numer1, (float) (xn - 0.5f * radius), (float) (yn - 0.17f * radius), paintTxt); canvas.drawText("" + count, (float) (xn - 0.5f * radius), (float) (yn + 0.53f * radius), paintCount); if (norm_nomer_count > 0) { canvas.drawText("" + norm_nomer_count, (float) (xn + 0.95f * radius), (float) (yn + 0.85f * radius), paintNorm); // Log.e(TAG, "f_draw numer1= " + numer1 + " count =" + count + " norm_nomer_count = " + norm_nomer_count); } } } private boolean f_test(float xT, float yT) { return Math.sqrt((xT - xn) * (xT - xn) + (yT - yn) * (yT - yn)) < radius; } } private class PaintAll extends Thread { private final PrimeActivity activity; private final SurfaceView view; volatile AtomicBoolean running; public PaintAll(PrimeActivity cActivity, SurfaceView view) { activity = cActivity; this.view = view; running = new AtomicBoolean(); running.set(false); } /** состояния потока*/ public void setRunning(boolean run) { running.set(run); } /** в потоке */ public void run() { // Log.d(TAG, "***start " ); while (running.get()) { if (isInterrupted()) return; canvas = null; // своя ссылка на канву try { // подготовка Canvas-а canvas = view.getHolder().lockCanvas(); synchronized (view.getHolder()) { activity.f_paint(); // собственно рисование } } catch (Exception e) { StackTraceElement ste[] = e.getStackTrace(); Log.d(TAG, "***Error " + e.toString() + " running=" + running.get()); for (int i = 0; i < ste.length; i++) Log.d(TAG, "***Error " + i + " " + ste[i].getMethodName() + " line " + ste[i].getLineNumber()); // Toast.makeText(activity, "Error" + e.toString() +" "+activity.buildStep+ " "+ activity.IsKaleydoskop.get()+" running="+running.get() + " "+e.getStackTrace(), Toast.LENGTH_SHORT).show(); } finally { // try закончился if (canvas != null) { view.getHolder().unlockCanvasAndPost(canvas); } } } } public void stopPotok() { //прервать рисование running.set(false); // текущая итерация - последняя this.interrupt(); // и заканчивается она прямо сейчас } } @Override protected void onStart(){ super.onStart(); mApp.activityCavs = this; } } //----------------------