altosdroid: Fix a pile of compile warnings
[fw/altos] / altosdroid / app / src / main / java / org / altusmetrum / AltosDroid / AltosDroid.java
index 1bcb67ef72e849c56f682a803bc815e1d26dcf90..46709f0f7f3c9bff417aad335ac6d85270ac08f5 100644 (file)
 package org.altusmetrum.AltosDroid;
 
 import java.lang.ref.WeakReference;
-import java.text.*;
 import java.util.*;
-import java.io.*;
 
+import android.Manifest;
 import android.app.Activity;
 import android.app.PendingIntent;
 import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
 import android.content.Intent;
 import android.content.Context;
 import android.content.ComponentName;
@@ -38,10 +36,8 @@ import android.os.Handler;
 import android.os.Message;
 import android.os.Messenger;
 import android.os.RemoteException;
-import android.content.res.Resources;
-import android.support.v4.app.FragmentActivity;
-import android.support.v4.app.FragmentManager;
-import android.util.DisplayMetrics;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
 import android.view.*;
 import android.widget.*;
 import android.app.AlertDialog;
@@ -49,9 +45,8 @@ import android.location.Location;
 import android.location.LocationManager;
 import android.location.LocationListener;
 import android.hardware.usb.*;
-import android.graphics.*;
-import android.graphics.drawable.*;
-
+import android.content.pm.PackageManager;
+import androidx.core.app.ActivityCompat;
 import org.altusmetrum.altoslib_13.*;
 
 class SavedState {
@@ -146,7 +141,7 @@ class Tracker implements CharSequence, Comparable {
        }
 }
 
-public class AltosDroid extends FragmentActivity implements AltosUnitsListener, LocationListener {
+public class AltosDroid extends FragmentActivity implements AltosUnitsListener, LocationListener, ActivityCompat.OnRequestPermissionsResultCallback {
 
        // Actions sent to the telemetry server at startup time
 
@@ -177,6 +172,7 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener,
        public static final int SETUP_UNITS = 2;
        public static final int SETUP_MAP_SOURCE = 4;
        public static final int SETUP_MAP_TYPE = 8;
+       public static final int SETUP_FONT_SIZE = 16;
 
        public static FragmentManager   fm;
 
@@ -601,8 +597,7 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener,
                for (AltosDroidTab mTab : mTabs)
                        mTab.update_ui(telem_state, state, from_receiver, location, mTab == mTabsAdapter.currentItem());
 
-               AltosDebug.debug("quiet %b\n", quiet);
-               if (mAltosVoice != null)
+               if (mAltosVoice != null && mTabsAdapter.currentItem() != null)
                        mAltosVoice.tell(telem_state, state, from_receiver, location, (AltosDroidTab) mTabsAdapter.currentItem(), quiet);
 
        }
@@ -624,7 +619,7 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener,
                }
                int deg = (int) Math.floor(p);
                double min = (p - Math.floor(p)) * 60.0;
-               return String.format("%d°%9.4f\" %s", deg, min, h);
+               return String.format("%d° %7.4f\" %s", deg, min, h);
        }
 
        static String number(String format, double value) {
@@ -647,14 +642,29 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener,
                return tab_view;
        }
 
+       static public int[] themes = {
+               R.style.Small,
+               R.style.Medium,
+               R.style.Large,
+               R.style.Extra
+       };
+
+       static public int[] dialog_themes = {
+               R.style.Small_Dialog,
+               R.style.Medium_Dialog,
+               R.style.Large_Dialog,
+               R.style.Extra_Dialog
+       };
+
        @Override
        public void onCreate(Bundle savedInstanceState) {
+               // Initialise preferences
+               AltosDroidPreferences.init(this);
+               setTheme(themes[AltosDroidPreferences.font_size()]);
                super.onCreate(savedInstanceState);
                AltosDebug.init(this);
                AltosDebug.debug("+++ ON CREATE +++");
 
-               // Initialise preferences
-               AltosDroidPreferences.init(this);
 
                fm = getSupportFragmentManager();
 
@@ -689,7 +699,7 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener,
                mStateView     = (TextView) findViewById(R.id.state_value);
                mAgeView       = (TextView) findViewById(R.id.age_value);
                mAgeNewColor   = mAgeView.getTextColors().getDefaultColor();
-               mAgeOldColor   = getResources().getColor(R.color.old_color);
+               mAgeOldColor   = getResources().getColor(R.color.old_color, getTheme());
        }
 
        private void ensureBluetooth() {
@@ -798,11 +808,7 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener,
                noticeIntent(intent);
        }
 
-       @Override
-       public void onResume() {
-               super.onResume();
-               AltosDebug.debug("+ ON RESUME +");
-
+       private void enable_location_updates() {
                // Listen for GPS and Network position updates
                LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, this);
@@ -817,12 +823,81 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener,
                update_ui(telemetry_state, state, true);
        }
 
+       static final int MY_PERMISSION_REQUEST = 1001;
+
+       public boolean have_location_permission = false;
+       public boolean have_storage_permission = false;
+       public boolean asked_permission = false;
+
+       AltosMapOnline map_online;
+
+       void
+       tell_map_permission(AltosMapOnline map_online) {
+               this.map_online = map_online;
+       }
+
+       @Override
+       public void onRequestPermissionsResult(int requestCode, String[] permissions,
+                                              int[] grantResults) {
+               if (requestCode == MY_PERMISSION_REQUEST) {
+                       for (int i = 0; i < grantResults.length; i++) {
+                               if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
+                                       if (permissions[i].equals(Manifest.permission.ACCESS_FINE_LOCATION)) {
+                                               have_location_permission = true;
+                                               enable_location_updates();
+                                               if (map_online != null)
+                                                       map_online.position_permission();
+                                       }
+                                       if (permissions[i].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
+                                               have_storage_permission = true;
+                                       }
+                               }
+                       }
+               }
+       }
+
+       @Override
+       public void onResume() {
+               super.onResume();
+               AltosDebug.debug("+ ON RESUME +");
+
+               if (!asked_permission) {
+                       asked_permission = true;
+                       if (ActivityCompat.checkSelfPermission(this,
+                                                             Manifest.permission.ACCESS_FINE_LOCATION)
+                           == PackageManager.PERMISSION_GRANTED)
+                       {
+                               have_location_permission = true;
+                       }
+                       if (ActivityCompat.checkSelfPermission(this,
+                                                              Manifest.permission.WRITE_EXTERNAL_STORAGE)
+                           == PackageManager.PERMISSION_GRANTED)
+                       {
+                               have_storage_permission = true;
+                       }
+                       int count = (have_location_permission ? 0 : 1) + (have_storage_permission ? 0 : 1);
+                       if (count > 0)
+                       {
+                               String[] permissions = new String[count];
+                               int i = 0;
+                               if (!have_location_permission)
+                                       permissions[i++] = Manifest.permission.ACCESS_FINE_LOCATION;
+                               if (!have_location_permission)
+                                       permissions[i++] = Manifest.permission.WRITE_EXTERNAL_STORAGE;
+                               ActivityCompat.requestPermissions(this, permissions, MY_PERMISSION_REQUEST);
+                       }
+               }
+               if (have_location_permission)
+                       enable_location_updates();
+       }
+
        @Override
        public void onPause() {
                super.onPause();
                AltosDebug.debug("- ON PAUSE -");
                // Stop listening for location updates
-               ((LocationManager) getSystemService(Context.LOCATION_SERVICE)).removeUpdates(this);
+               if (have_location_permission)
+                       ((LocationManager) getSystemService(Context.LOCATION_SERVICE)).removeUpdates(this);
        }
 
        @Override
@@ -845,7 +920,7 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener,
        }
 
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-               AltosDebug.debug("onActivityResult " + resultCode);
+               AltosDebug.debug("onActivityResult request %d result %d", requestCode, resultCode);
                switch (requestCode) {
                case REQUEST_CONNECT_DEVICE:
                        // When DeviceListActivity returns with a device to connect to
@@ -881,6 +956,8 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener,
        private void note_setup_changes(Intent data) {
                int changes = data.getIntExtra(SetupActivity.EXTRA_SETUP_CHANGES, 0);
 
+               AltosDebug.debug("note_setup_changes changes %d\n", changes);
+
                if ((changes & SETUP_BAUD) != 0) {
                        try {
                                mService.send(Message.obtain(null, TelemetryService.MSG_SETBAUD,
@@ -898,6 +975,11 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener,
                        /* nothing to do here */
                }
                set_switch_time();
+               if ((changes & SETUP_FONT_SIZE) != 0) {
+                       AltosDebug.debug(" ==== Recreate to switch font sizes ==== ");
+                       finish();
+                       startActivity(getIntent());
+               }
        }
 
        private void connectUsb(UsbDevice device) {
@@ -915,10 +997,12 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener,
        }
 
        private void bluetoothEnabled(Intent data) {
-               try {
-                       mService.send(Message.obtain(null, TelemetryService.MSG_BLUETOOTH_ENABLED, null));
-               } catch (RemoteException e) {
-                       AltosDebug.debug("send BT enabled message failed");
+               if (mService != null) {
+                       try {
+                               mService.send(Message.obtain(null, TelemetryService.MSG_BLUETOOTH_ENABLED, null));
+                       } catch (RemoteException e) {
+                               AltosDebug.debug("send BT enabled message failed");
+                       }
                }
        }