Merge branch 'master' into mapsforge

mapsforge
Georg Lukas 2017-12-12 08:48:39 +01:00
commit 55ce922b52
10 zmienionych plików z 141 dodań i 24 usunięć

Wyświetl plik

@ -25,6 +25,7 @@
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
@ -91,6 +92,26 @@
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name=".ProfileImportActivity" android:label="@string/profile_import_activity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="file"
android:mimeType="*/*"
android:host="*"
android:pathPattern=".*\\.aprs" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="content"
android:mimeType="*/*"
android:host="*"
android:pathPattern=".*\\.aprs" />
</intent-filter>
</activity>
<activity android:name=".KeyfileImportActivity" android:label="@string/ssl_import_activity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
@ -126,5 +147,11 @@
<action android:name="org.aprsdroid.app.SERVICE_STOP" />
</intent-filter>
</service>
<!-- start the service if applicable on boot -->
<receiver android:name=".SystemEventReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
</manifest>

Wyświetl plik

@ -157,23 +157,23 @@
<string name="p__connection">APRS подключение</string>
<string name="p_conntype">Протокол подключения</string>
<string name="p_conntype_entry">Выбор протокола подключючения</string>
<string name="p_link">Connection Type</string>
<string name="p_link_entry">Choose the link type</string>
<string name="p_link">Тип соединения</string>
<string name="p_link_entry">Выберите тип связи</string>
<string name="p_connsetup">Параметры подключения</string>
<string name="p_connsetup_summary">Конфигурация подключения</string>
<string name="p_connlog">Протоколирование соединения</string>
<string name="p_connlog_summary">Подробная информация в журнале</string>
<!-- array of connection types -->
<string name="p_conn_aprsis">Internet (APRS-IS)</string>
<string name="p_conn_afsk">Audio (AFSK)</string>
<string name="p_conn_aprsis">Интернет (APRS-IS)</string>
<string name="p_conn_afsk">Аудио (AFSK)</string>
<string name="p_conn_kiss">TNC (KISS)</string>
<string name="p_conn_tnc2">TNC (plaintext TNC2)</string>
<string name="p_conn_kwd">Kenwood (NMEA waypoint)</string>
<string name="p_conn_kwd_info">Kenwood setup help</string>
<string name="p_conn_kwd_gps">Use Android GPS</string>
<string name="p_conn_kwd_gps_summary">Forward NMEA sentences to radio</string>
<string name="p_conn_kwd_gps_debug">Display GPS in log</string>
<string name="p_conn_kwd_gps_debug_summary">Show raw NMEA in APRSdroid</string>
<string name="p_conn_tnc2">TNC (текстовый TNC2)</string>
<string name="p_conn_kwd">Kenwood (путевые точки NMEA)</string>
<string name="p_conn_kwd_info">Помощь настройки Kenwood</string>
<string name="p_conn_kwd_gps">Использовать GPS Android-устройства</string>
<string name="p_conn_kwd_gps_summary">Направить NMEA данные по радиоканалу</string>
<string name="p_conn_kwd_gps_debug">Отображать GPS в журнале</string>
<string name="p_conn_kwd_gps_debug_summary">Показывать данные NMEA в APRSdroid</string>
<!-- array of APRS-IS protocols -->
<string name="p_aprsis_tcp">TCP-соединение</string>
<string name="p_aprsis_http">HTTP POST (только отправка)</string>
@ -350,8 +350,8 @@
<string name="p_bt_channel_entry">Номер канала (обычно: "1";для SPP оставьте пустое)</string>
<string name="p_tnc_init">строка команд TNC</string>
<string name="p_tnc_init_summary">Initialization commands for TNC (URL-encoded, Esc=%%1B, "%%"=%%25)</string>
<string name="p_tnc_init_msg" formatted="false">URL-encoded string (Esc=%1B, \"%\"=%25), delay after each line:</string>
<string name="p_tnc_init_summary">Команды инициализации TNC (URL-encoded, Esc=%%1B, "%%"=%%25)</string>
<string name="p_tnc_init_msg" formatted="false">Строка URL-кодирования (Esc=%1B, \"%\"=%25), задержка после каждой строки:</string>
<string name="p_tnc_delay">Задержка запуска TNC</string>
<string name="p_tnc_delay_summary">Время ожидания после каждой строки</string>
@ -363,7 +363,7 @@
<string name="bt_error_unsupported">Bluetooth не поддерживается!</string>
<string name="bt_error_disabled">Пожалуйста включите Bluetooth!</string>
<string name="bt_error_no_tnc">Пожалуйста настройте Bluetooth TNC!</string>
<string name="bt_error_connect">Could not connect to %s! Please turn on the device and close other Bluetooth connections.</string>
<string name="bt_error_connect">Не могу подключиться к %s! Пожалуйста, включите устройство и закройте прочие соединения по Bluetooth.</string>
<string name="afsk_info_sco_req">Запрос соединения bluetooth</string>
<string name="afsk_info_sco_est">Соединение Bluetooth установлено.</string>
@ -375,17 +375,17 @@
<!-- SSL strings -->
<string name="ssl_import_activity">Импорт SSL-сертификата</string>
<string name="ssl_import_password">Введите пароль сертификата для импорта</string>
<string name="ssl_no_keyfile">No certificate for %s! Using passcode authentication.</string>
<string name="ssl_no_keyfile">Сертификат для %s отсутствует! Используется авторизация по APRS-паролю.</string>
<string name="ssl_import_ok">Сертификат для %s импортирован.</string>
<string name="ssl_import_error">Ошибка импорта сетификата: %s!</string>
<string name="ssl_expired">Ваш сертификат просрочен!</string>
<string name="ssl_expire_in">Ваш сертификат заканчивается через %d дней!</string>
<!-- (USB) Serial TNC settings -->
<string name="p_serial_baudrate">Baud Rate</string>
<string name="p_serial_baudrate_summary">Data rate of the serial port</string>
<string name="p_serial_baudrate">Скорость передачи</string>
<string name="p_serial_baudrate_summary">Передача данных по последовательному порту</string>
<!-- (USB) Serial Errors -->
<string name="p_serial_unsupported">Unsupported serial port!</string>
<string name="p_serial_noperm">No permission for USB device!</string>
<string name="p_serial_notfound">No USB device found!</string>
<string name="p_serial_unsupported">Неподдерживаемый последовательный порт!</string>
<string name="p_serial_noperm">Нет доступа к USB устройсту!</string>
<string name="p_serial_notfound">Не найдено USB устройство!</string>
</resources>

Wyświetl plik

@ -394,6 +394,11 @@
<string name="ssl_expired">Your certificate has expired!</string>
<string name="ssl_expire_in">Your certificate will expire in %d days!</string>
<!-- Config import -->
<string name="profile_import_activity">Profile import</string>
<string name="profile_import_done">Import successful!</string>
<string name="profile_import_error">Error importing profile: %s!</string>
<!-- (USB) Serial TNC settings -->
<string name="p_serial_baudrate">Baud Rate</string>
<string name="p_serial_baudrate_summary">Data rate of the serial port</string>

Wyświetl plik

@ -18,7 +18,7 @@ class APRSdroid extends Activity {
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
// if this is a USB device, auto-launch the service
if (UsbTnc.checkDeviceHandle(prefs, getIntent.getParcelableExtra("device")))
if (UsbTnc.checkDeviceHandle(prefs, getIntent.getParcelableExtra("device")) && prefs.getBoolean("service_running", false))
startService(AprsService.intent(this, AprsService.SERVICE))
prefs.getString("activity", "log") match {

Wyświetl plik

@ -102,6 +102,8 @@ class AprsService extends Service {
def handleStart(i : Intent) {
if (i.getAction() == SERVICE_STOP) {
// explicitly disabled, remember this
prefs.setBoolean("service_running", false)
if (running)
stopSelf()
return
@ -179,6 +181,10 @@ class AprsService extends Service {
sendBroadcast(new Intent(SERVICE_STARTED)
.putExtra(API_VERSION, API_VERSION_CODE)
.putExtra(CALLSIGN, callssid))
// startup completed, remember state
if (!singleShot)
prefs.setBoolean("service_running", true)
}
override def onBind(i : Intent) : IBinder = null

Wyświetl plik

@ -73,7 +73,7 @@ class MainListActivity(actname : String, menuid : Int) extends LoadingListActivi
if (!is_running) {
startService(AprsService.intent(this, AprsService.SERVICE))
} else {
stopService(AprsService.intent(this, AprsService.SERVICE))
stopAprsService()
}
setupButtons(!is_running)
}

Wyświetl plik

@ -35,6 +35,9 @@ class PrefsWrapper(val context : Context) {
def toggleBoolean(name : String, default : Boolean) = {
val new_val = !prefs.getBoolean(name, default)
android.util.Log.d("toggleBoolean", name + "=" + new_val)
setBoolean(name, new_val)
}
def setBoolean(name : String, new_val : Boolean) = {
prefs.edit().putBoolean(name, new_val).commit()
new_val
}

Wyświetl plik

@ -0,0 +1,57 @@
package org.aprsdroid.app
import android.app.Activity
import android.content._
import android.os.Bundle
import android.preference.PreferenceManager
import android.text.InputType
import android.util.Log
import android.widget.{EditText, Toast}
import java.io.File
import java.util.Scanner
import org.json._
import scala.collection.JavaConversions._ // for enumeration of config items
class ProfileImportActivity extends Activity {
val TAG = "APRSdroid.ProfileImport"
override def onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
Log.d(TAG, "created: " + getIntent())
import_config()
}
def import_config() {
try {
// parse stream into string, http://stackoverflow.com/a/5445161/539443
val scanner = new Scanner(getContentResolver().openInputStream(getIntent.getData())).useDelimiter("\\A")
val config_string = scanner.next()
val config = new JSONObject(config_string)
val prefsedit = PreferenceManager.getDefaultSharedPreferences(this).edit()
val keys = config.keys()
while (keys.hasNext()) {
val item = keys.next().asInstanceOf[String]
val value = config.get(item)
Log.d(TAG, "reading: " + item + " = " + value + "/" + value.getClass())
// Hack: too complicated to figure out scala match rules for native types
value.getClass().getSimpleName() match {
case "String" => prefsedit.putString(item, config.getString(item))
case "Boolean" => prefsedit.putBoolean(item, config.getBoolean(item))
case "Int" => prefsedit.putInt(item, config.getInt(item))
}
}
prefsedit.commit()
Toast.makeText(this, R.string.profile_import_done, Toast.LENGTH_SHORT).show()
} catch {
case e : Exception =>
Toast.makeText(this, getString(R.string.profile_import_error, e.getMessage()), Toast.LENGTH_LONG).show()
e.printStackTrace()
}
finish()
}
}

Wyświetl plik

@ -0,0 +1,14 @@
package org.aprsdroid.app
import android.content.{BroadcastReceiver, Context, Intent}
class SystemEventReceiver extends BroadcastReceiver {
val TAG = "APRSdroid.SystemEventReceiver"
override def onReceive(ctx : Context, i : Intent) {
android.util.Log.d(TAG, "onReceive: " + i)
val prefs = new PrefsWrapper(ctx)
if (prefs.getBoolean("service_running", false))
ctx.startService(AprsService.intent(ctx, AprsService.SERVICE))
}
}

Wyświetl plik

@ -63,7 +63,12 @@ trait UIHelper extends Activity
}
}
// manual stop: remember shutdown for next reboot
def stopAprsService() {
// explicitly disabled, remember this
prefs.setBoolean("service_running", false)
stopService(AprsService.intent(this, AprsService.SERVICE))
}
def passcodeConfigRequired(call : String, pass : String) : Boolean = {
import AprsBackend._
@ -303,7 +308,7 @@ trait UIHelper extends Activity
if (!is_running) {
startService(AprsService.intent(this, AprsService.SERVICE))
} else {
stopService(AprsService.intent(this, AprsService.SERVICE))
stopAprsService()
}
true
case R.id.singlebtn =>