/* * Copyright (C) 2018 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.wifirttscan; import static com.example.android.wifirttscan.AccessPointRangingResultsActivity.SCAN_RESULT_EXTRA; import android.Manifest.permission; import android.annotation.SuppressLint; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.net.wifi.ScanResult; import android.net.wifi.WifiManager; import android.net.wifi.rtt.RangingRequest; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.core.app.ActivityCompat; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView.LayoutManager; import android.util.Log; import android.view.View; import android.widget.TextView; import com.example.android.wifirttscan.MyAdapter.ScanResultClickListener; import java.util.ArrayList; import java.util.List; /** * Displays list of Access Points enabled with WifiRTT (to check distance). Requests location * permissions if they are not approved via secondary splash screen explaining why they are needed. */ public class MainActivity extends AppCompatActivity implements ScanResultClickListener { private static final String TAG = "MainActivity"; private boolean mLocationPermissionApproved = false; List<ScanResult> mAccessPointsSupporting80211mc; private WifiManager mWifiManager; private WifiScanReceiver mWifiScanReceiver; private TextView mOutputTextView; private RecyclerView mRecyclerView; private MyAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mOutputTextView = findViewById(R.id.access_point_summary_text_view); mRecyclerView = findViewById(R.id.recycler_view); // Improve performance if you know that changes in content do not change the layout size // of the RecyclerView mRecyclerView.setHasFixedSize(true); // use a linear layout manager LayoutManager layoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(layoutManager); mAccessPointsSupporting80211mc = new ArrayList<>(); mAdapter = new MyAdapter(mAccessPointsSupporting80211mc, this); mRecyclerView.setAdapter(mAdapter); mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); mWifiScanReceiver = new WifiScanReceiver(); } @Override protected void onResume() { Log.d(TAG, "onResume()"); super.onResume(); mLocationPermissionApproved = ActivityCompat.checkSelfPermission(this, permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED; registerReceiver( mWifiScanReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); } @Override protected void onPause() { Log.d(TAG, "onPause()"); super.onPause(); unregisterReceiver(mWifiScanReceiver); } private void logToUi(final String message) { if (!message.isEmpty()) { Log.d(TAG, message); mOutputTextView.setText(message); } } @Override public void onScanResultItemClick(ScanResult scanResult) { Log.d(TAG, "onScanResultItemClick(): ssid: " + scanResult.SSID); Intent intent = new Intent(this, AccessPointRangingResultsActivity.class); intent.putExtra(SCAN_RESULT_EXTRA, scanResult); startActivity(intent); } public void onClickFindDistancesToAccessPoints(View view) { if (mLocationPermissionApproved) { logToUi(getString(R.string.retrieving_access_points)); mWifiManager.startScan(); } else { // On 23+ (M+) devices, fine location permission not granted. Request permission. Intent startIntent = new Intent(this, LocationPermissionRequestActivity.class); startActivity(startIntent); } } private class WifiScanReceiver extends BroadcastReceiver { private List<ScanResult> find80211mcSupportedAccessPoints( @NonNull List<ScanResult> originalList) { List<ScanResult> newList = new ArrayList<>(); for (ScanResult scanResult : originalList) { if (scanResult.is80211mcResponder()) { newList.add(scanResult); } if (newList.size() >= RangingRequest.getMaxPeers()) { break; } } return newList; } // This is checked via mLocationPermissionApproved boolean @SuppressLint("MissingPermission") public void onReceive(Context context, Intent intent) { List<ScanResult> scanResults = mWifiManager.getScanResults(); if (scanResults != null) { if (mLocationPermissionApproved) { mAccessPointsSupporting80211mc = find80211mcSupportedAccessPoints(scanResults); mAdapter.swapData(mAccessPointsSupporting80211mc); logToUi( scanResults.size() + " APs discovered, " + mAccessPointsSupporting80211mc.size() + " RTT capable."); } else { // TODO (jewalker): Add Snackbar regarding permissions Log.d(TAG, "Permissions not allowed."); } } } } }