kopia lustrzana https://github.com/ge0rg/aprsdroid
Merge branch 'master' into mapsforge
commit
55ce922b52
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
}
|
|
@ -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))
|
||||
}
|
||||
}
|
|
@ -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 =>
|
||||
|
|
Ładowanie…
Reference in New Issue