11package io .pslab .fragment ;
22
33import android .annotation .SuppressLint ;
4+ import android .app .Activity ;
5+ import android .content .Context ;
46import android .graphics .Bitmap ;
57import android .graphics .Color ;
68import android .graphics .Matrix ;
2022import androidx .fragment .app .Fragment ;
2123
2224import java .util .ArrayList ;
25+ import java .util .List ;
2326
2427import io .pslab .R ;
2528import io .pslab .items .PinDetails ;
2629
2730public class PSLabPinLayoutFragment extends Fragment implements View .OnTouchListener {
2831
29- private ArrayList <PinDetails > pinDetails = new ArrayList <>();
32+ private final List <PinDetails > pinDetails = new ArrayList <>();
3033
31- private Matrix matrix = new Matrix ();
32- private Matrix savedMatrix = new Matrix ();
34+ private final Matrix matrix = new Matrix ();
35+ private final Matrix savedMatrix = new Matrix ();
3336
3437 public static boolean frontSide = true ;
3538
@@ -38,8 +41,8 @@ public class PSLabPinLayoutFragment extends Fragment implements View.OnTouchList
3841 private static final int ZOOM = 2 ;
3942 private int mode = NONE ;
4043
41- private PointF start = new PointF ();
42- private PointF mid = new PointF ();
44+ private final PointF start = new PointF ();
45+ private final PointF mid = new PointF ();
4346 private float oldDist = 1f ;
4447
4548 private ImageView colorMap ;
@@ -75,54 +78,61 @@ public void onPause() {
7578 super .onPause ();
7679 imgLayout .setImageDrawable (null );
7780 colorMap .setImageDrawable (null );
81+ // Force garbage collection to avoid OOM on older devices.
82+ System .gc ();
7883 }
7984
8085 private void populatePinDetails () {
81- pinDetails .add (new PinDetails ("ESP" , "ESP Programmer pin" , Color .parseColor ("#6b40a9" ), Color .parseColor ("#dc1616" )));
82- pinDetails .add (new PinDetails ("RXP" , "Receiver pin for UART communication" , Color .parseColor ("#4372a2" ), Color .parseColor ("#1616dc" )));
83- pinDetails .add (new PinDetails ("TXP" , "Transmitter pin for UART communication" , Color .parseColor ("#4372a2" ), Color .parseColor ("#37dc16" )));
84- pinDetails .add (new PinDetails ("GND" , "Ground pin (0 V)" , Color .parseColor ("#ff4040" ), Color .parseColor ("#16dcda" )));
85- pinDetails .add (new PinDetails ("SI1" , "Wave generator pin 1" , Color .parseColor ("#406743" ), Color .parseColor ("#226a0c" )));
86- pinDetails .add (new PinDetails ("SI2" , "Wave generator pin 2" , Color .parseColor ("#406743" ), Color .parseColor ("#226aba" )));
87- pinDetails .add (new PinDetails ("SQ1" , "PWM generator pin 1" , Color .parseColor ("#406743" ), Color .parseColor ("#baaa22" )));
88- pinDetails .add (new PinDetails ("SQ2" , "PWM generator pin 2" , Color .parseColor ("#406743" ), Color .parseColor ("#22ba6d" )));
89- pinDetails .add (new PinDetails ("SQ3" , "PWM generator pin 3" , Color .parseColor ("#406743" ), Color .parseColor ("#aa44aa" )));
90- pinDetails .add (new PinDetails ("SQ4" , "PWM generator pin 4" , Color .parseColor ("#406743" ), Color .parseColor ("#d28080" )));
91- pinDetails .add (new PinDetails ("LA1" , "Logic analyzer pin 1" , Color .parseColor ("#406743" ), Color .parseColor ("#0053ad" )));
92- pinDetails .add (new PinDetails ("LA2" , "Logic analyzer pin 2" , Color .parseColor ("#406743" ), Color .parseColor ("#ad2d00" )));
93- pinDetails .add (new PinDetails ("LA3" , "Logic analyzer pin 3" , Color .parseColor ("#406743" ), Color .parseColor ("#e7a4ff" )));
94- pinDetails .add (new PinDetails ("LA4" , "Logic analyzer pin 4" , Color .parseColor ("#406743" ), Color .parseColor ("#e7a41a" )));
95- pinDetails .add (new PinDetails ("AC1" , "Alternative channel input" , Color .parseColor ("#ffe040" ), Color .parseColor ("#b01498" )));
96- pinDetails .add (new PinDetails ("CH1" , "Oscilloscope channel input 1" , Color .parseColor ("#ffe040" ), Color .parseColor ("#0b4189" )));
97- pinDetails .add (new PinDetails ("CH2" , "Oscilloscope channel input 2" , Color .parseColor ("#ffe040" ), Color .parseColor ("#410b89" )));
98- pinDetails .add (new PinDetails ("CH3" , "Oscilloscope channel input 3" , Color .parseColor ("#ffe040" ), Color .parseColor ("#41890b" )));
99- pinDetails .add (new PinDetails ("CHG" , "Oscilloscope channel 3 gain set" , Color .parseColor ("#ffe040" ), Color .parseColor ("#89410b" )));
100- pinDetails .add (new PinDetails ("MIC" , "External microphone input" , Color .parseColor ("#7d5840" ), Color .parseColor ("#890b41" )));
101- pinDetails .add (new PinDetails ("FRQ" , "Frequency counter pin" , Color .parseColor ("#7d5840" ), Color .parseColor ("#ff0b41" )));
102- pinDetails .add (new PinDetails ("CAP" , "Capacitance measurement pin" , Color .parseColor ("#7d5840" ), Color .parseColor ("#ff410b" )));
103- pinDetails .add (new PinDetails ("RES" , "Resistance measurement pin" , Color .parseColor ("#7d5840" ), Color .parseColor ("#41ff0b" )));
104- pinDetails .add (new PinDetails ("VOL" , "Voltage measurement pin" , Color .parseColor ("#7d5840" ), Color .parseColor ("#410bff" )));
105- pinDetails .add (new PinDetails ("PCS" , "Programmable current source (3.3 mA)" , Color .parseColor ("#c3007c" ), Color .parseColor ("#3fa96f" )));
106- pinDetails .add (new PinDetails ("PV3" , "Programmable voltage source 3 (0-3.3 V)" , Color .parseColor ("#c3007c" ), Color .parseColor ("#a93f6f" )));
107- pinDetails .add (new PinDetails ("PV2" , "Programmable voltage source 2 (-+3.3 V)" , Color .parseColor ("#c3007c" ), Color .parseColor ("#a96f3f" )));
108- pinDetails .add (new PinDetails ("PV1" , "Programmable voltage source 1 (-+5.0 V)" , Color .parseColor ("#c3007c" ), Color .parseColor ("#446e72" )));
109- pinDetails .add (new PinDetails ("SCL" , "Serial clock pin for I2C" , Color .parseColor ("#4372a2" ), Color .parseColor ("#6e4472" )));
110- pinDetails .add (new PinDetails ("SDA" , "Serial data pin for I2C" , Color .parseColor ("#4372a2" ), Color .parseColor ("#6e7244" )));
111- pinDetails .add (new PinDetails ("VDD" , "Voltage supply pin (3.3 V)" , Color .parseColor ("#ff4040" ), Color .parseColor ("#d25c3c" )));
112- pinDetails .add (new PinDetails ("STA" , "Bluetooth device state output pin" , Color .parseColor ("#4372a2" ), Color .parseColor ("#5c5c3c" )));
113- pinDetails .add (new PinDetails ("V+" , "Voltage test pin (+8.0 V)" , Color .parseColor ("#ff4040" ), Color .parseColor ("#5cd23c" )));
114- pinDetails .add (new PinDetails ("ENA" , "Bluetooth device enable/disable pin" , Color .parseColor ("#4372a2" ), Color .parseColor ("#5c143c" )));
115- pinDetails .add (new PinDetails ("V-" , "Voltage test pin (-8.0 V)" , Color .parseColor ("#ff4040" ), Color .parseColor ("#5c3c14" )));
116- pinDetails .add (new PinDetails ("MCL" , "Master clear pin for programmer" , Color .parseColor ("#4372a2" ), Color .parseColor ("#143c14" )));
117- pinDetails .add (new PinDetails ("PGM" , "Mode pin for programmer" , Color .parseColor ("#4372a2" ), Color .parseColor ("#b73cf1" )));
118- pinDetails .add (new PinDetails ("PGC" , "Clock pin for programmer" , Color .parseColor ("#4372a2" ), Color .parseColor ("#fff724" )));
119- pinDetails .add (new PinDetails ("PGD" , "Data pin for programmer" , Color .parseColor ("#4372a2" ), Color .parseColor ("#724fff" )));
120- pinDetails .add (new PinDetails ("NRF" , "Radio communication module using nRF24" , Color .parseColor ("#6b40a9" ), Color .parseColor ("#ffa64f" )));
121- pinDetails .add (new PinDetails ("USB" , "Micro B type USB socket" , Color .parseColor ("#6b40a9" ), Color .parseColor ("#ff2b4f" )));
122- pinDetails .add (new PinDetails ("VCC" , "Voltage supply pin (+5.0 V)" , Color .parseColor ("#ff4040" ), Color .parseColor ("#6b6500" )));
123- pinDetails .add (new PinDetails ("+5V" , "Test pin +5.0 V" , Color .parseColor ("#ff4040" ), Color .parseColor ("#765f40" )));
124- pinDetails .add (new PinDetails ("D+" , "Test pin for USB Data +" , Color .parseColor ("#6b40a9" ), Color .parseColor ("#681654" )));
125- pinDetails .add (new PinDetails ("D-" , "Test pin for USB Data -" , Color .parseColor ("#6b40a9" ), Color .parseColor ("#a68b47" )));
86+ pinDetails .add (new PinDetails (getString (R .string .pin_esp_name ), getString (R .string .pin_esp_description ), getColor (R .color .category_usb ), getColor (R .color .pin_esp )));
87+ pinDetails .add (new PinDetails (getString (R .string .pin_rxd_name ), getString (R .string .pin_rxd_description ), getColor (R .color .category_communication ), getColor (R .color .pin_rxd )));
88+ pinDetails .add (new PinDetails (getString (R .string .pin_txd_name ), getString (R .string .pin_txd_description ), getColor (R .color .category_communication ), getColor (R .color .pin_txd )));
89+ pinDetails .add (new PinDetails (getString (R .string .pin_gnd_name ), getString (R .string .pin_gnd_description ), getColor (R .color .category_voltage ), getColor (R .color .pin_gnd )));
90+ pinDetails .add (new PinDetails (getString (R .string .pin_si1_name ), getString (R .string .pin_si1_description ), getColor (R .color .category_wavegen ), getColor (R .color .pin_si1 )));
91+ pinDetails .add (new PinDetails (getString (R .string .pin_si2_name ), getString (R .string .pin_si2_description ), getColor (R .color .category_wavegen ), getColor (R .color .pin_si2 )));
92+ pinDetails .add (new PinDetails (getString (R .string .pin_sq1_name ), getString (R .string .pin_sq1_description ), getColor (R .color .category_wavegen ), getColor (R .color .pin_sq1 )));
93+ pinDetails .add (new PinDetails (getString (R .string .pin_sq2_name ), getString (R .string .pin_sq2_description ), getColor (R .color .category_wavegen ), getColor (R .color .pin_sq2 )));
94+ pinDetails .add (new PinDetails (getString (R .string .pin_sq3_name ), getString (R .string .pin_sq3_description ), getColor (R .color .category_wavegen ), getColor (R .color .pin_sq3 )));
95+ pinDetails .add (new PinDetails (getString (R .string .pin_sq4_name ), getString (R .string .pin_sq4_description ), getColor (R .color .category_wavegen ), getColor (R .color .pin_sq4 )));
96+ pinDetails .add (new PinDetails (getString (R .string .pin_la1_name ), getString (R .string .pin_la1_description ), getColor (R .color .category_wavegen ), getColor (R .color .pin_la1 )));
97+ pinDetails .add (new PinDetails (getString (R .string .pin_la2_name ), getString (R .string .pin_la2_description ), getColor (R .color .category_wavegen ), getColor (R .color .pin_la2 )));
98+ pinDetails .add (new PinDetails (getString (R .string .pin_la3_name ), getString (R .string .pin_la3_description ), getColor (R .color .category_wavegen ), getColor (R .color .pin_la3 )));
99+ pinDetails .add (new PinDetails (getString (R .string .pin_la4_name ), getString (R .string .pin_la4_description ), getColor (R .color .category_wavegen ), getColor (R .color .pin_la4 )));
100+ pinDetails .add (new PinDetails (getString (R .string .pin_ac1_name ), getString (R .string .pin_ac1_description ), getColor (R .color .category_oscilloscope ), getColor (R .color .pin_ac1 )));
101+ pinDetails .add (new PinDetails (getString (R .string .pin_ch1_name ), getString (R .string .pin_ch1_description ), getColor (R .color .category_oscilloscope ), getColor (R .color .pin_ch1 )));
102+ pinDetails .add (new PinDetails (getString (R .string .pin_ch2_name ), getString (R .string .pin_ch2_description ), getColor (R .color .category_oscilloscope ), getColor (R .color .pin_ch2 )));
103+ pinDetails .add (new PinDetails (getString (R .string .pin_ch3_name ), getString (R .string .pin_ch3_description ), getColor (R .color .category_oscilloscope ), getColor (R .color .pin_ch3 )));
104+ pinDetails .add (new PinDetails (getString (R .string .pin_chg_name ), getString (R .string .pin_chg_description ), getColor (R .color .category_oscilloscope ), getColor (R .color .pin_chg )));
105+ pinDetails .add (new PinDetails (getString (R .string .pin_mic_name ), getString (R .string .pin_mic_description ), getColor (R .color .category_measurement ), getColor (R .color .pin_mic )));
106+ pinDetails .add (new PinDetails (getString (R .string .pin_frq_name ), getString (R .string .pin_frq_description ), getColor (R .color .category_measurement ), getColor (R .color .pin_frq )));
107+ pinDetails .add (new PinDetails (getString (R .string .pin_cap_name ), getString (R .string .pin_cap_description ), getColor (R .color .category_measurement ), getColor (R .color .pin_cap )));
108+ pinDetails .add (new PinDetails (getString (R .string .pin_res_name ), getString (R .string .pin_res_description ), getColor (R .color .category_measurement ), getColor (R .color .pin_res )));
109+ pinDetails .add (new PinDetails (getString (R .string .pin_vol_name ), getString (R .string .pin_vol_description ), getColor (R .color .category_measurement ), getColor (R .color .pin_vol )));
110+ pinDetails .add (new PinDetails (getString (R .string .pin_pcs_name ), getString (R .string .pin_pcs_description ), getColor (R .color .category_power_source ), getColor (R .color .pin_pcs )));
111+ pinDetails .add (new PinDetails (getString (R .string .pin_pv3_name ), getString (R .string .pin_pv3_description ), getColor (R .color .category_power_source ), getColor (R .color .pin_pv3 )));
112+ pinDetails .add (new PinDetails (getString (R .string .pin_pv2_name ), getString (R .string .pin_pv2_description ), getColor (R .color .category_power_source ), getColor (R .color .pin_pv2 )));
113+ pinDetails .add (new PinDetails (getString (R .string .pin_pv1_name ), getString (R .string .pin_pv1_description ), getColor (R .color .category_power_source ), getColor (R .color .pin_pv1 )));
114+ pinDetails .add (new PinDetails (getString (R .string .pin_scl_name ), getString (R .string .pin_scl_description ), getColor (R .color .category_communication ), getColor (R .color .pin_scl )));
115+ pinDetails .add (new PinDetails (getString (R .string .pin_sda_name ), getString (R .string .pin_sda_description ), getColor (R .color .category_communication ), getColor (R .color .pin_sda )));
116+ pinDetails .add (new PinDetails (getString (R .string .pin_vdd_name ), getString (R .string .pin_vdd_description ), getColor (R .color .category_voltage ), getColor (R .color .pin_vdd )));
117+ pinDetails .add (new PinDetails (getString (R .string .pin_sta_name ), getString (R .string .pin_sta_description ), getColor (R .color .category_communication ), getColor (R .color .pin_sta )));
118+ pinDetails .add (new PinDetails (getString (R .string .pin_vpl_name ), getString (R .string .pin_vpl_description ), getColor (R .color .category_voltage ), getColor (R .color .pin_vpl )));
119+ pinDetails .add (new PinDetails (getString (R .string .pin_ena_name ), getString (R .string .pin_ena_description ), getColor (R .color .category_communication ), getColor (R .color .pin_ena )));
120+ pinDetails .add (new PinDetails (getString (R .string .pin_vmi_name ), getString (R .string .pin_vmi_description ), getColor (R .color .category_voltage ), getColor (R .color .pin_vmi )));
121+ pinDetails .add (new PinDetails (getString (R .string .pin_mcl_name ), getString (R .string .pin_mcl_description ), getColor (R .color .category_communication ), getColor (R .color .pin_mcl )));
122+ pinDetails .add (new PinDetails (getString (R .string .pin_pgm_name ), getString (R .string .pin_pgm_description ), getColor (R .color .category_communication ), getColor (R .color .pin_pgm )));
123+ pinDetails .add (new PinDetails (getString (R .string .pin_pgc_name ), getString (R .string .pin_pgc_description ), getColor (R .color .category_communication ), getColor (R .color .pin_pgc )));
124+ pinDetails .add (new PinDetails (getString (R .string .pin_pgd_name ), getString (R .string .pin_pgd_description ), getColor (R .color .category_communication ), getColor (R .color .pin_pgd )));
125+ pinDetails .add (new PinDetails (getString (R .string .pin_nrf_name ), getString (R .string .pin_nrf_description ), getColor (R .color .category_usb ), getColor (R .color .pin_nrf )));
126+ pinDetails .add (new PinDetails (getString (R .string .pin_usb_name ), getString (R .string .pin_usb_description ), getColor (R .color .category_usb ), getColor (R .color .pin_usb )));
127+ pinDetails .add (new PinDetails (getString (R .string .pin_vcc_name ), getString (R .string .pin_vcc_description ), getColor (R .color .category_voltage ), getColor (R .color .pin_vcc )));
128+ pinDetails .add (new PinDetails (getString (R .string .pin_pl5_name ), getString (R .string .pin_pl5_description ), getColor (R .color .category_voltage ), getColor (R .color .pin_pl5 )));
129+ pinDetails .add (new PinDetails (getString (R .string .pin_dpl_name ), getString (R .string .pin_dpl_description ), getColor (R .color .category_usb ), getColor (R .color .pin_dpl )));
130+ pinDetails .add (new PinDetails (getString (R .string .pin_dmi_name ), getString (R .string .pin_dmi_description ), getColor (R .color .category_usb ), getColor (R .color .pin_dmi )));
131+ }
132+
133+ private int getColor (int colorId ) {
134+ final Context context = getContext ();
135+ return context == null ? 0 : context .getColor (colorId );
126136 }
127137
128138 @ SuppressLint ("ClickableViewAccessibility" )
@@ -189,6 +199,12 @@ public boolean onTouch(View v, MotionEvent event) {
189199 }
190200
191201 private void displayPinDescription (PinDetails pin ) {
202+ final Activity activity = getActivity ();
203+
204+ if (activity == null ) {
205+ return ;
206+ }
207+
192208 final AlertDialog .Builder builder = new AlertDialog .Builder (getActivity ());
193209 LayoutInflater inflater = getActivity ().getLayoutInflater ();
194210 View view = inflater .inflate (R .layout .pin_description_dialog , null );
@@ -205,11 +221,10 @@ private void displayPinDescription(PinDetails pin) {
205221 builder .create ();
206222 final AlertDialog dialog = builder .show ();
207223
208- dialogButton .setOnClickListener (new View .OnClickListener () {
209- @ Override
210- public void onClick (View v ) {
211- dialog .dismiss ();
212- }
224+ dialogButton .setOnTouchListener ((v , event ) -> {
225+ view .performClick ();
226+ dialog .dismiss ();
227+ return true ;
213228 });
214229 }
215230
0 commit comments