1
0
mirror of https://github.com/oliexdev/openScale.git synced 2025-08-23 00:33:09 +02:00

ask user for read/write permission and coarse location permission if needed.

This commit is contained in:
OliE
2018-02-10 10:51:37 +01:00
parent d59391608d
commit 97a75762dc
9 changed files with 264 additions and 42 deletions

View File

@@ -7,7 +7,7 @@ android {
applicationId "com.health.openscale"
testApplicationId "com.health.openscale.test"
minSdkVersion 18
targetSdkVersion 22 // don't set target sdk > 22 otherwise bluetooth le discovery need permission to ACCESS_COARSE_LOCATION
targetSdkVersion 27
versionCode 23
versionName "1.7"

View File

@@ -18,10 +18,7 @@ package com.health.openscale.gui;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -61,6 +58,7 @@ import com.health.openscale.gui.fragments.GraphFragment;
import com.health.openscale.gui.fragments.OverviewFragment;
import com.health.openscale.gui.fragments.StatisticsFragment;
import com.health.openscale.gui.fragments.TableFragment;
import com.health.openscale.gui.utils.PermissionHelper;
import java.lang.reflect.Field;
@@ -72,6 +70,8 @@ public class MainActivity extends AppCompatActivity {
private static int bluetoothStatusIcon = R.drawable.ic_bluetooth_disabled;
private static MenuItem bluetoothStatus;
private boolean permGrantedCoarseLocation;
private Fragment currentFragment;
private DrawerLayout drawerLayout;
private Toolbar toolbar;
@@ -96,6 +96,7 @@ public class MainActivity extends AppCompatActivity {
setContentView(R.layout.activity_main);
currentFragment = null;
permGrantedCoarseLocation = false;
// Set a Toolbar to replace the ActionBar.
toolbar = (Toolbar) findViewById(R.id.toolbar);
@@ -382,42 +383,33 @@ public class MainActivity extends AppCompatActivity {
}
private void invokeSearchBluetoothDevice() {
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter btAdapter = bluetoothManager.getAdapter();
if (btAdapter == null || !btAdapter.isEnabled()) {
setBluetoothStatusIcon(R.drawable.ic_bluetooth_disabled);
Toast.makeText(getApplicationContext(), "Bluetooth " + getResources().getString(R.string.info_is_not_enable), Toast.LENGTH_SHORT).show();
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, 1);
return;
}
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String deviceName = prefs.getString("btDeviceName", "-");
if (deviceName == "-") {
Toast.makeText(getApplicationContext(), getResources().getString(R.string.info_bluetooth_no_device_set), Toast.LENGTH_SHORT).show();
return;
}
// Check if Bluetooth 4.x is available
if (deviceName != "openScale_MCU") {
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
setBluetoothStatusIcon(R.drawable.ic_bluetooth_disabled);
Toast.makeText(getApplicationContext(), "Bluetooth 4.x " + getResources().getString(R.string.info_is_not_available), Toast.LENGTH_SHORT).show();
return;
}
permGrantedCoarseLocation = PermissionHelper.requestBluetoothPermission(this, false);
} else {
permGrantedCoarseLocation = PermissionHelper.requestBluetoothPermission(this, true);
}
Toast.makeText(getApplicationContext(), getResources().getString(R.string.info_bluetooth_try_connection) + " " + deviceName, Toast.LENGTH_SHORT).show();
setBluetoothStatusIcon(R.drawable.ic_bluetooth_searching);
if (permGrantedCoarseLocation) {
if (deviceName == "-") {
Toast.makeText(getApplicationContext(), getResources().getString(R.string.info_bluetooth_no_device_set), Toast.LENGTH_SHORT).show();
return;
}
OpenScale.getInstance(getApplicationContext()).stopSearchingForBluetooth();
if (!OpenScale.getInstance(getApplicationContext()).startSearchingForBluetooth(deviceName, callbackBtHandler)) {
Toast.makeText(getApplicationContext(), deviceName + " " + getResources().getString(R.string.label_bt_device_no_support), Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), getResources().getString(R.string.info_bluetooth_try_connection) + " " + deviceName, Toast.LENGTH_SHORT).show();
setBluetoothStatusIcon(R.drawable.ic_bluetooth_searching);
OpenScale.getInstance(getApplicationContext()).stopSearchingForBluetooth();
if (!OpenScale.getInstance(getApplicationContext()).startSearchingForBluetooth(deviceName, callbackBtHandler)) {
Toast.makeText(getApplicationContext(), deviceName + " " + getResources().getString(R.string.label_bt_device_no_support), Toast.LENGTH_SHORT).show();
}
} else {
setBluetoothStatusIcon(R.drawable.ic_bluetooth_disabled);
Toast.makeText(getApplicationContext(), getResources().getString(R.string.permission_not_granted), Toast.LENGTH_SHORT).show();
}
}
@@ -472,6 +464,21 @@ public class MainActivity extends AppCompatActivity {
bluetoothStatus.setIcon(getResources().getDrawable(bluetoothStatusIcon));
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case PermissionHelper.PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
permGrantedCoarseLocation = true;
} else {
permGrantedCoarseLocation = false;
}
return;
}
}
}
@SuppressLint("RestrictedApi")
public static void disableShiftMode(BottomNavigationView view) {
BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);

View File

@@ -153,11 +153,9 @@ public class UserSettingsActivity extends AppCompatActivity {
final Drawable wrapped = DrawableCompat.wrap(drawable.mutate());
String menuTitle = item.getTitle().toString();
if (menuTitle == getResources().getString(R.string.save)) {
if (item.getItemId() == R.id.saveButton) {
DrawableCompat.setTint(wrapped, Color.parseColor("#FFFFFF"));
} else if (menuTitle == getResources().getString(R.string.label_delete)) {
} else if (item.getItemId() == R.id.deleteButton) {
DrawableCompat.setTint(wrapped, Color.parseColor("#FF4444"));
}

View File

@@ -19,6 +19,7 @@ import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.Typeface;
@@ -52,6 +53,7 @@ import com.health.openscale.core.OpenScale;
import com.health.openscale.core.datatypes.ScaleMeasurement;
import com.health.openscale.core.datatypes.ScaleUser;
import com.health.openscale.gui.activities.DataEntryActivity;
import com.health.openscale.gui.utils.PermissionHelper;
import com.health.openscale.gui.views.BMIMeasurementView;
import com.health.openscale.gui.views.BMRMeasurementView;
import com.health.openscale.gui.views.BoneMeasurementView;
@@ -85,6 +87,9 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
private SharedPreferences prefs;
private LinearLayout subpageView;
private boolean permGrantedReadAccess;
private boolean permGrantedWriteAccess;
private ArrayList <MeasurementView> measurementsList;
private int selectedSubpageNr;
@@ -138,6 +143,9 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
selectedSubpageNr = savedInstanceState.getInt(SELECTED_SUBPAGE_NR_KEY);
}
permGrantedReadAccess = false;
permGrantedWriteAccess = false;
OpenScale.getInstance(getContext()).registerFragment(this);
return tableView;
@@ -290,6 +298,13 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
@Override
public void onClick(View v) {
permGrantedReadAccess = PermissionHelper.requestReadPermission(getActivity());
if (!permGrantedReadAccess) {
Toast.makeText(getContext(), getResources().getString(R.string.permission_not_granted), Toast.LENGTH_SHORT).show();
return;
}
int selectedUserId = OpenScale.getInstance(getContext()).getSelectedScaleUserId();
if (selectedUserId == -1)
@@ -339,6 +354,14 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
private class onClickListenerExport implements View.OnClickListener {
@Override
public void onClick(View v) {
permGrantedWriteAccess = PermissionHelper.requestWritePermission(getActivity());
if (!permGrantedWriteAccess) {
Toast.makeText(getContext(), getResources().getString(R.string.permission_not_granted), Toast.LENGTH_SHORT).show();
return;
}
AlertDialog.Builder filenameDialog = new AlertDialog.Builder(getActivity());
filenameDialog.setTitle(getResources().getString(R.string.info_set_filename) + " " + Environment.getExternalStorageDirectory().getPath());
@@ -391,6 +414,28 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case PermissionHelper.PERMISSIONS_REQUEST_ACCESS_READ_STORAGE: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
permGrantedReadAccess = true;
} else {
permGrantedReadAccess = false;
}
return;
}
case PermissionHelper.PERMISSIONS_REQUEST_ACCESS_WRITE_STORAGE: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
permGrantedWriteAccess = true;
} else {
permGrantedWriteAccess = false;
}
return;
}
}
}
private class onClickListenerMoveSubpageLeft implements View.OnClickListener {
@Override
public void onClick(View v) {

View File

@@ -15,7 +15,7 @@
*/
package com.health.openscale.gui.preferences;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.preference.EditTextPreference;
@@ -30,6 +30,7 @@ import android.widget.Toast;
import com.health.openscale.R;
import com.health.openscale.core.OpenScale;
import com.health.openscale.core.datatypes.ScaleUser;
import com.health.openscale.gui.utils.PermissionHelper;
import java.io.File;
import java.io.FileInputStream;
@@ -44,6 +45,9 @@ public class BackupPreferences extends PreferenceFragment {
private static final String PREFERENCE_KEY_IMPORT_BACKUP = "importBackup";
private static final String PREFERENCE_KEY_EXPORT_BACKUP = "exportBackup";
private boolean permGrantedReadAccess;
private boolean permGrantedWriteAccess;
private Preference importBackup;
private Preference exportBackup;
@@ -59,6 +63,9 @@ public class BackupPreferences extends PreferenceFragment {
exportBackup = (Preference) findPreference(PREFERENCE_KEY_EXPORT_BACKUP);
exportBackup.setOnPreferenceClickListener(new onClickListenerExportBackup());
permGrantedReadAccess = false;
permGrantedWriteAccess = false;
initSummary(getPreferenceScreen());
}
@@ -145,6 +152,13 @@ public class BackupPreferences extends PreferenceFragment {
}
private boolean importBackup(String databaseName, File exportDir) {
permGrantedReadAccess = PermissionHelper.requestReadPermission(getActivity());
if (!permGrantedReadAccess) {
Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.permission_not_granted), Toast.LENGTH_SHORT).show();
return false;
}
if (!isExternalStoragePresent())
return false;
@@ -169,6 +183,13 @@ public class BackupPreferences extends PreferenceFragment {
}
private boolean exportBackup(String databaseName, File exportDir) {
permGrantedWriteAccess = PermissionHelper.requestWritePermission(getActivity());
if (!permGrantedWriteAccess) {
Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.permission_not_granted), Toast.LENGTH_SHORT).show();
return false;
}
if (!isExternalStoragePresent())
return false;
@@ -208,4 +229,26 @@ public class BackupPreferences extends PreferenceFragment {
private boolean isExternalStoragePresent() {
return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case PermissionHelper.PERMISSIONS_REQUEST_ACCESS_READ_STORAGE: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
permGrantedReadAccess = true;
} else {
permGrantedReadAccess = false;
}
return;
}
case PermissionHelper.PERMISSIONS_REQUEST_ACCESS_WRITE_STORAGE: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
permGrantedWriteAccess = true;
} else {
permGrantedWriteAccess = false;
}
return;
}
}
}
}

View File

@@ -22,6 +22,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
@@ -37,6 +38,7 @@ import android.widget.Toast;
import com.health.openscale.R;
import com.health.openscale.core.bluetooth.BluetoothCommunication;
import com.health.openscale.gui.utils.PermissionHelper;
import java.util.ArrayList;
import java.util.HashMap;
@@ -49,6 +51,8 @@ public class BluetoothPreferences extends PreferenceFragment implements SharedPr
private static final String PREFERENCE_KEY_BLUETOOTH_IGNOREOUTOFRANGE = "ignoreOutOfRange";
private static final String PREFERENCE_KEY_BLUETOOTH_SCANNER = "btScanner";
private boolean permGrantedCoarseLocation;
private CheckBoxPreference smartAssignEnable;
private CheckBoxPreference ignoreOutOfRangeEnable;
private PreferenceScreen btScanner;
@@ -132,6 +136,8 @@ public class BluetoothPreferences extends PreferenceFragment implements SharedPr
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
permGrantedCoarseLocation = false;
btAdapter = BluetoothAdapter.getDefaultAdapter();
addPreferencesFromResource(R.xml.bluetooth_preferences);
@@ -220,7 +226,14 @@ public class BluetoothPreferences extends PreferenceFragment implements SharedPr
private class onClickListenerScannerSelect implements Preference.OnPreferenceClickListener {
@Override
public boolean onPreferenceClick(Preference preference) {
startSearching();
permGrantedCoarseLocation = PermissionHelper.requestBluetoothPermission(getActivity(), true);
if (permGrantedCoarseLocation) {
startSearching();
} else {
Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.permission_not_granted), Toast.LENGTH_SHORT).show();
}
return true;
}
}
@@ -240,4 +253,18 @@ public class BluetoothPreferences extends PreferenceFragment implements SharedPr
return true;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case PermissionHelper.PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
permGrantedCoarseLocation = true;
} else {
permGrantedCoarseLocation = false;
}
return;
}
}
}
}

View File

@@ -0,0 +1,98 @@
/* Copyright (C) 2018 olie.xdev <olie.xdev@googlemail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package com.health.openscale.gui.utils;
import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.widget.Toast;
import com.health.openscale.R;
public class PermissionHelper {
public final static int PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION = 1;
public final static int PERMISSIONS_REQUEST_ACCESS_READ_STORAGE = 2;
public final static int PERMISSIONS_REQUEST_ACCESS_WRITE_STORAGE = 3;
public static boolean requestBluetoothPermission(final Activity activity, boolean BLE) {
final BluetoothManager bluetoothManager = (BluetoothManager) activity.getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter btAdapter = bluetoothManager.getAdapter();
if (btAdapter == null || !btAdapter.isEnabled()) {
Toast.makeText(activity.getApplicationContext(), "Bluetooth " + activity.getResources().getString(R.string.info_is_not_enable), Toast.LENGTH_SHORT).show();
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
activity.startActivityForResult(enableBtIntent, 1);
return false;
}
// Check if Bluetooth 4.x is available
if (BLE) {
if (!activity.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(activity.getApplicationContext(), "Bluetooth 4.x " + activity.getResources().getString(R.string.info_is_not_available), Toast.LENGTH_SHORT).show();
return false;
}
}
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage(R.string.permission_bluetooth_info)
.setPositiveButton(R.string.label_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION);
}
});
AlertDialog dialog = builder.create();
dialog.show();
} else {
return true;
}
return false;
}
public static boolean requestReadPermission(final Activity activity) {
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSIONS_REQUEST_ACCESS_READ_STORAGE);
} else {
return true;
}
return false;
}
public static boolean requestWritePermission(final Activity activity) {
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSIONS_REQUEST_ACCESS_WRITE_STORAGE);
} else {
return true;
}
return false;
}
}

View File

@@ -3,15 +3,16 @@
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.openscale.MainActivity" >
<item
android:id="@+id/action_bluetooth_status"
android:icon="@drawable/ic_bluetooth_disabled"
android:title="@string/action_bluetooth_status"
app:showAsAction="always" />
<item
android:id="@+id/action_add_measurement"
android:icon="@drawable/ic_add"
android:title="+"
app:showAsAction="always" />
<item
android:id="@+id/action_bluetooth_status"
android:icon="@drawable/ic_bluetooth_disabled"
android:title="@string/action_bluetooth_status"
app:showAsAction="always" />
</menu>

View File

@@ -216,4 +216,7 @@
<string name="edit">Edit</string>
<string name="save">Save</string>
<string name="permission_not_granted">Permission not granted</string>
<string name="permission_bluetooth_info">openScale needs permission to access to coarse location to search for Bluetooth devices</string>
</resources>