1+ package vendor .datalogic .service .eventprofiles ;
2+
3+ import android .app .Activity ;
4+ import android .content .Context ;
5+ import android .content .pm .PackageManager ;
6+ import android .net .ConnectivityManager ;
7+ import android .net .NetworkRequest ;
8+ import android .net .NetworkRequest .Builder ;
9+ import android .net .Network ;
10+ import android .net .NetworkCapabilities ;
11+ import android .os .Bundle ;
12+ import androidx .appcompat .app .AppCompatActivity ;
13+
14+ import android .util .Log ;
15+ import android .widget .Toast ;
16+
17+ import com .datalogic .device .PersistenceType ;
18+ import com .datalogic .device .configuration .ConfigException ;
19+ import com .datalogic .device .configuration .ProfileManager ;
20+ import com .datalogic .device .configuration .ProfileType ;
21+ import com .datalogic .device .configuration .PropertyID ;
22+
23+ import java .util .HashMap ;
24+
25+ public class MainActivity extends AppCompatActivity {
26+
27+ private String TAG = "EventProfiles" ; // Tag for logging
28+ private String profileName = "wifi_test.json" ;
29+ private ConnectivityManager connectivityManager ; // Manages network connectivity
30+ private ConnectivityManager .NetworkCallback networkCallback ; // Callback for network events
31+ private ProfileManager pm ; // Manages device profiles
32+ private HashMap map ; // Stores profile properties
33+
34+ @ Override
35+ protected void onCreate (Bundle savedInstanceState ) {
36+ super .onCreate (savedInstanceState );
37+ Log .d (TAG , "onCreate is called" );
38+ setContentView (R .layout .activity_main );
39+
40+ // 1. Setting up Wi-Fi connectivity to notify when Access Point changes
41+ setUp ();
42+
43+ // 2. Create a new instance of ProfileManager with the current context
44+ pm = new ProfileManager (this );
45+
46+ // 3. Create a HashMap and add key-value pairs for profile properties
47+ map = new HashMap ();
48+ map .put (PropertyID .GREEN_SPOT_ENABLE , "false" ); // Disable green spot (BooleanProperty)
49+ map .put (PropertyID .DEVICE_NAME_BASE , "wifi" ); // Set device name base to "wifi" (TextProperty)
50+
51+ // 4. Create a profile using the ProfileManager
52+ // Step 4.1: Check if "wifi_test.json" profile already exists
53+ boolean profileExists = false ;
54+ for (ProfileType name : pm .getProfilesList ()) {
55+ if (profileName .equals (name .name )) {
56+ profileExists = true ;
57+ break ;
58+ }
59+ }
60+
61+ // Step 4.2: If not exists, create it
62+ if (!profileExists ) {
63+ pm .createProfile (
64+ profileName , // Profile file name
65+ map , // Profile properties
66+ "Wifi Test Profile" , // Profile description
67+ PersistenceType .ENTERPRISE_RESET_PERSISTENT // Persistent across device reboots
68+ );
69+ }
70+
71+ // Note:
72+ // - When Wi-Fi connection is ready, the profile "wifi_test.json" will be loaded (see onAvailable).
73+ // - When Wi-Fi connection is lost, the profile "wifi_test.json" will be unloaded (see onLost).
74+ }
75+
76+ private void setUp () {
77+ // Initialize ConnectivityManager to monitor network changes
78+ connectivityManager = (ConnectivityManager ) getSystemService (Context .CONNECTIVITY_SERVICE );
79+
80+ // Check for location permission (required for Wi-Fi scanning on API 23+)
81+ if (checkSelfPermission (android .Manifest .permission .ACCESS_FINE_LOCATION ) == PackageManager .PERMISSION_GRANTED ) {
82+ // Permission granted, register network callback
83+ registerNetworkCallback ();
84+ } else {
85+ // Request location permission from the user
86+ requestPermissions (new String []{android .Manifest .permission .ACCESS_FINE_LOCATION }, 1 );
87+ }
88+ }
89+
90+ private void registerNetworkCallback () {
91+ Log .d (TAG , "registerNetworkCallback: Callback registered" );
92+ // Define a network callback to handle network events
93+ networkCallback = new ConnectivityManager .NetworkCallback () {
94+ @ Override
95+ public void onAvailable (Network network ) {
96+ Log .d (TAG , "onAvailable: Network is available" );
97+ // Called when a network becomes available
98+ ConnectivityManager cm = (ConnectivityManager ) getSystemService (Context .CONNECTIVITY_SERVICE );
99+ NetworkCapabilities capabilities = cm .getNetworkCapabilities (network );
100+
101+ // Check if the available network is Wi-Fi
102+ if (capabilities != null && capabilities .hasTransport (NetworkCapabilities .TRANSPORT_WIFI )) {
103+ Toast .makeText (MainActivity .this , "Connected to Wi-Fi" , Toast .LENGTH_SHORT ).show ();
104+ // Load the Wi-Fi profile
105+ pm .loadProfile (profileName );
106+ }
107+ }
108+
109+ @ Override
110+ public void onLost (Network network ) {
111+ Log .d (TAG , "onLost: Network is lost" );
112+ // Called when a network is lost
113+ Toast .makeText (MainActivity .this , "Network lost" , Toast .LENGTH_SHORT ).show ();
114+ // Unload the Wi-Fi profile
115+ pm .unloadProfile ();
116+ }
117+ };
118+
119+ // Build a network request to listen for Wi-Fi connectivity changes
120+ NetworkRequest .Builder requestBuilder = new NetworkRequest .Builder ();
121+ requestBuilder .addTransportType (NetworkCapabilities .TRANSPORT_WIFI ); // Listen only for Wi-Fi
122+ connectivityManager .registerNetworkCallback (requestBuilder .build (), networkCallback );
123+ }
124+
125+ @ Override
126+ protected void onDestroy () {
127+ super .onDestroy ();
128+ Log .d (TAG , "onDestroy is called" );
129+
130+ // Unregister the network callback to avoid memory leaks
131+ if (networkCallback != null ) {
132+ connectivityManager .unregisterNetworkCallback (networkCallback );
133+ }
134+
135+ // Delete the profile when the activity destroys
136+ pm .deleteProfile (profileName );
137+ }
138+ }
0 commit comments