package com.technicolor.wifitestapp;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.IBinder;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.core.app.NotificationCompat;
public class WifiTestService extends Service {
private static String LOG_TAG = "easy";
private Context mContext;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(LOG_TAG, "onStartCommand");
printAllNetworks();
return START_STICKY;//super.onStartCommand(intent, flags, startId);
}
private ConnectivityManager.NetworkCallback mNetworkCallback;
@Override
public void onCreate() {
Log.d(LOG_TAG, "onCreate");
registerNetworkCallback();
mContext=getApplicationContext();
super.onCreate();
startFgService();
}
@Override
public void onDestroy() {
Log.d(LOG_TAG, "onDestory");
super.onDestroy();
unregisterNetworkCallback();
}
void startFgService(){
Intent intent = new Intent(this, MainActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
String CHANNEL_ID= "test";
NotificationCompat.Builder builder;
NotificationChannel ch = new NotificationChannel(CHANNEL_ID, "test channel", NotificationManager.IMPORTANCE_DEFAULT);
((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(ch);
builder = new NotificationCompat.Builder(this,CHANNEL_ID );
builder.setContentIntent(pi);
startForeground(1, builder.build());
}
private void printAllNetworks(){
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
Network[] networks = cm.getAllNetworks();
for ( Network n : networks){
Log.d(LOG_TAG, "print all networks");
NetworkCapabilities np = cm.getNetworkCapabilities(n);
Log.d(LOG_TAG, np.toString());
}
}
@RequiresApi(api = Build.VERSION_CODES.Q)
private void workaround(){
WifiManager mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
Network[] networks = cm.getAllNetworks();
for ( Network n : networks){
Log.d(LOG_TAG, "print all networks");
LinkProperties lp = cm.getLinkProperties(n);
String iName = lp.getInterfaceName();
Log.d(LOG_TAG, iName);
if(iName.equals("eth0")){
Log.d(LOG_TAG, iName + "found don't workaround....");
return;
}
}
if (mWifiManager.isWifiEnabled()) {
Log.d(LOG_TAG, "wifi manager disconnect and recoonect");
Toast.makeText(mContext, "wifi manager disconnect and reconnect", Toast.LENGTH_LONG).show();
mWifiManager.disconnect();
mWifiManager.reconnect();
} else {
Log.e(LOG_TAG, "wifi disabled");
}
}
private void registerNetworkCallback() {
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
mNetworkCallback= new ConnectivityManager.NetworkCallback(){
@Override
public void onAvailable(@NonNull Network network) {
super.onAvailable(network);
Log.d(LOG_TAG, "onAvailable : "+network.toString());
printAllNetworks();
}
@RequiresApi(api = Build.VERSION_CODES.Q)
@Override
public void onLost(@NonNull Network network) {
super.onLost(network);
Log.d(LOG_TAG, "onLost try to workaround");
workaround();
}
};
cm.registerNetworkCallback(builder.build(), mNetworkCallback);
}
private void unregisterNetworkCallback(){
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
cm.unregisterNetworkCallback(mNetworkCallback);
}
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext=getApplicationContext();
//startService(new Intent(mContext, WifiTestService.class));
startForegroundService(new Intent(mContext, WifiTestService.class));
}