From d0d3f500808981ce7ae451858f7a92012309b949 Mon Sep 17 00:00:00 2001 From: Marvin W Date: Fri, 5 Jun 2020 18:37:00 +0200 Subject: [PATCH] Drop legacy --- .tx/config | 9 - unifiednlp-app/build.gradle | 90 ------ unifiednlp-app/src/main/AndroidManifest.xml | 39 --- .../nlp/ui/SettingsLauncherActivity.java | 55 ---- unifiednlp-app/src/main/res/values/bools.xml | 20 -- unifiednlp-base/build.gradle | 56 ---- unifiednlp-base/src/main/AndroidManifest.xml | 122 -------- .../org/microg/nlp/AbstractBackendHelper.java | 101 ------- .../microg/nlp/AbstractProviderService.java | 69 ----- .../java/org/microg/nlp/PackageReceiver.java | 44 --- .../main/java/org/microg/nlp/Preferences.java | 105 ------- .../main/java/org/microg/nlp/Provider.java | 27 -- .../nlp/geocode/AbstractGeocodeService.java | 51 ---- .../org/microg/nlp/geocode/BackendFuser.java | 98 ------- .../org/microg/nlp/geocode/BackendHelper.java | 94 ------ .../microg/nlp/geocode/GeocodeProvider.java | 22 -- .../microg/nlp/geocode/GeocodeProviderV1.java | 76 ----- .../microg/nlp/geocode/GeocodeServiceV1.java | 40 --- .../nlp/location/AbstractLocationService.java | 106 ------- .../org/microg/nlp/location/BackendFuser.java | 173 ----------- .../microg/nlp/location/BackendHelper.java | 160 ---------- .../microg/nlp/location/LocationProvider.java | 31 -- .../nlp/location/LocationProviderV1.java | 169 ----------- .../nlp/location/LocationProviderV2.java | 99 ------- .../nlp/location/LocationServiceV1.java | 39 --- .../nlp/location/LocationServiceV2.java | 39 --- .../org/microg/nlp/location/ThreadHelper.java | 82 ------ .../nlp/ui/AbstractBackendPreference.java | 274 ------------------ .../nlp/ui/GeocoderBackendPreference.java | 63 ---- .../nlp/ui/LocationBackendPreference.java | 64 ---- .../microg/nlp/ui/SettingInjectorService.java | 97 ------- .../org/microg/nlp/ui/SettingsActivity.java | 134 --------- .../tools/selfcheck/NlpOsCompatChecks.java | 112 ------- .../tools/selfcheck/NlpStatusChecks.java | 206 ------------- .../src/main/res/drawable-hdpi/info.png | Bin 616 -> 0 bytes .../src/main/res/drawable-hdpi/settings.png | Bin 608 -> 0 bytes .../src/main/res/drawable-mdpi/info.png | Bin 445 -> 0 bytes .../src/main/res/drawable-mdpi/settings.png | Bin 451 -> 0 bytes .../src/main/res/drawable-xhdpi/info.png | Bin 775 -> 0 bytes .../src/main/res/drawable-xhdpi/settings.png | Bin 725 -> 0 bytes .../src/main/res/drawable-xxhdpi/info.png | Bin 1064 -> 0 bytes .../src/main/res/drawable-xxhdpi/settings.png | Bin 1081 -> 0 bytes .../src/main/res/drawable-xxxhdpi/info.png | Bin 1526 -> 0 bytes .../main/res/drawable-xxxhdpi/settings.png | Bin 1419 -> 0 bytes .../src/main/res/drawable/location_marker.xml | 11 - .../main/res/layout/backend_list_entry.xml | 79 ----- .../src/main/res/mipmap-hdpi/ic_nlp_app.png | Bin 2585 -> 0 bytes .../main/res/mipmap-hdpi/ic_nlp_settings.png | Bin 4324 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_nlp_app.png | Bin 1723 -> 0 bytes .../main/res/mipmap-mdpi/ic_nlp_settings.png | Bin 2462 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_nlp_app.png | Bin 3496 -> 0 bytes .../main/res/mipmap-xhdpi/ic_nlp_settings.png | Bin 5991 -> 0 bytes .../src/main/res/mipmap-xxhdpi/ic_nlp_app.png | Bin 5531 -> 0 bytes .../res/mipmap-xxhdpi/ic_nlp_settings.png | Bin 10168 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_nlp_app.png | Bin 8121 -> 0 bytes .../res/mipmap-xxxhdpi/ic_nlp_settings.png | Bin 14699 -> 0 bytes .../src/main/res/values-de/strings.xml | 64 ---- .../src/main/res/values-eo/strings.xml | 66 ----- .../src/main/res/values-es/strings.xml | 18 -- .../src/main/res/values-fr/strings.xml | 68 ----- .../src/main/res/values-pl/strings.xml | 66 ----- .../src/main/res/values-ro/strings.xml | 35 --- .../src/main/res/values-ru/strings.xml | 69 ----- .../src/main/res/values-sr/strings.xml | 61 ---- .../src/main/res/values-uk/strings.xml | 66 ----- .../src/main/res/values-zh-rTW/strings.xml | 61 ---- .../src/main/res/values/strings.xml | 71 ----- .../main/res/xml/nlp_about_preferences.xml | 26 -- .../src/main/res/xml/nlp_injected_setting.xml | 20 -- .../src/main/res/xml/nlp_preferences.xml | 31 -- .../main/res/xml/nlp_setup_preferences.xml | 27 -- 71 files changed, 3805 deletions(-) delete mode 100644 .tx/config delete mode 100644 unifiednlp-app/build.gradle delete mode 100644 unifiednlp-app/src/main/AndroidManifest.xml delete mode 100644 unifiednlp-app/src/main/java/org/microg/nlp/ui/SettingsLauncherActivity.java delete mode 100644 unifiednlp-app/src/main/res/values/bools.xml delete mode 100644 unifiednlp-base/build.gradle delete mode 100644 unifiednlp-base/src/main/AndroidManifest.xml delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/AbstractBackendHelper.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/AbstractProviderService.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/PackageReceiver.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/Preferences.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/Provider.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/geocode/AbstractGeocodeService.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/geocode/BackendFuser.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/geocode/BackendHelper.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/geocode/GeocodeProvider.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/geocode/GeocodeProviderV1.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/geocode/GeocodeServiceV1.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/location/AbstractLocationService.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/location/BackendFuser.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/location/BackendHelper.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/location/LocationProvider.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/location/LocationProviderV1.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/location/LocationProviderV2.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/location/LocationServiceV1.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/location/LocationServiceV2.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/location/ThreadHelper.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/ui/AbstractBackendPreference.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/ui/GeocoderBackendPreference.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/ui/LocationBackendPreference.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/ui/SettingInjectorService.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/nlp/ui/SettingsActivity.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/tools/selfcheck/NlpOsCompatChecks.java delete mode 100644 unifiednlp-base/src/main/java/org/microg/tools/selfcheck/NlpStatusChecks.java delete mode 100644 unifiednlp-base/src/main/res/drawable-hdpi/info.png delete mode 100644 unifiednlp-base/src/main/res/drawable-hdpi/settings.png delete mode 100644 unifiednlp-base/src/main/res/drawable-mdpi/info.png delete mode 100644 unifiednlp-base/src/main/res/drawable-mdpi/settings.png delete mode 100644 unifiednlp-base/src/main/res/drawable-xhdpi/info.png delete mode 100644 unifiednlp-base/src/main/res/drawable-xhdpi/settings.png delete mode 100644 unifiednlp-base/src/main/res/drawable-xxhdpi/info.png delete mode 100644 unifiednlp-base/src/main/res/drawable-xxhdpi/settings.png delete mode 100644 unifiednlp-base/src/main/res/drawable-xxxhdpi/info.png delete mode 100644 unifiednlp-base/src/main/res/drawable-xxxhdpi/settings.png delete mode 100644 unifiednlp-base/src/main/res/drawable/location_marker.xml delete mode 100644 unifiednlp-base/src/main/res/layout/backend_list_entry.xml delete mode 100644 unifiednlp-base/src/main/res/mipmap-hdpi/ic_nlp_app.png delete mode 100644 unifiednlp-base/src/main/res/mipmap-hdpi/ic_nlp_settings.png delete mode 100644 unifiednlp-base/src/main/res/mipmap-mdpi/ic_nlp_app.png delete mode 100644 unifiednlp-base/src/main/res/mipmap-mdpi/ic_nlp_settings.png delete mode 100644 unifiednlp-base/src/main/res/mipmap-xhdpi/ic_nlp_app.png delete mode 100644 unifiednlp-base/src/main/res/mipmap-xhdpi/ic_nlp_settings.png delete mode 100644 unifiednlp-base/src/main/res/mipmap-xxhdpi/ic_nlp_app.png delete mode 100644 unifiednlp-base/src/main/res/mipmap-xxhdpi/ic_nlp_settings.png delete mode 100644 unifiednlp-base/src/main/res/mipmap-xxxhdpi/ic_nlp_app.png delete mode 100644 unifiednlp-base/src/main/res/mipmap-xxxhdpi/ic_nlp_settings.png delete mode 100644 unifiednlp-base/src/main/res/values-de/strings.xml delete mode 100644 unifiednlp-base/src/main/res/values-eo/strings.xml delete mode 100644 unifiednlp-base/src/main/res/values-es/strings.xml delete mode 100644 unifiednlp-base/src/main/res/values-fr/strings.xml delete mode 100644 unifiednlp-base/src/main/res/values-pl/strings.xml delete mode 100644 unifiednlp-base/src/main/res/values-ro/strings.xml delete mode 100644 unifiednlp-base/src/main/res/values-ru/strings.xml delete mode 100644 unifiednlp-base/src/main/res/values-sr/strings.xml delete mode 100644 unifiednlp-base/src/main/res/values-uk/strings.xml delete mode 100644 unifiednlp-base/src/main/res/values-zh-rTW/strings.xml delete mode 100644 unifiednlp-base/src/main/res/values/strings.xml delete mode 100644 unifiednlp-base/src/main/res/xml/nlp_about_preferences.xml delete mode 100644 unifiednlp-base/src/main/res/xml/nlp_injected_setting.xml delete mode 100644 unifiednlp-base/src/main/res/xml/nlp_preferences.xml delete mode 100644 unifiednlp-base/src/main/res/xml/nlp_setup_preferences.xml diff --git a/.tx/config b/.tx/config deleted file mode 100644 index c1b8525..0000000 --- a/.tx/config +++ /dev/null @@ -1,9 +0,0 @@ -[main] -host = https://www.transifex.com -lang_map = he: iw, zh_TW: zh-rTW, es_MX: es-rMX, pt_BR: pt-rBR - -[unifiednlp.strings] -file_filter = unifiednlp-base/src/main/res/values-/strings.xml -source_file = unifiednlp-base/src/main/res/values/strings.xml -source_lang = en -type = ANDROID diff --git a/unifiednlp-app/build.gradle b/unifiednlp-app/build.gradle deleted file mode 100644 index f82a821..0000000 --- a/unifiednlp-app/build.gradle +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2013-2016 microG Project Team - * - * 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. - */ - -apply plugin: 'com.android.application' - -/* This is a hack, trying to provide release updates to F-Droid until it can properly handle Gradle -applicationId "org.microg.nlp" -applicationId "com.google.android.gms" -applicationId "com.google.android.location" -versionName "1.6.8" -versionCode "20187" - */ - -String getMyVersionName() { - def stdout = new ByteArrayOutputStream() - if (rootProject.file("gradlew").exists()) - exec { commandLine 'git', 'describe', '--tags', '--always', '--dirty'; standardOutput = stdout } - else // automatic build system, don't tag dirty - exec { commandLine 'git', 'describe', '--tags', '--always'; standardOutput = stdout } - return stdout.toString().trim().substring(1) -} - -int getMyVersionCode() { - def stdout = new ByteArrayOutputStream() - exec { - commandLine 'git', 'rev-list', '--count', "HEAD" - standardOutput = stdout - } - return Integer.parseInt(stdout.toString().trim()) -} - -android { - compileSdkVersion androidCompileSdk() - buildToolsVersion "$androidBuildVersionTools" - - defaultConfig { - versionName getMyVersionName() - versionCode(20000 + getMyVersionCode()) - minSdkVersion androidMinSdk() - targetSdkVersion androidTargetSdk() - } - - flavorDimensions 'tier' - - productFlavors { - NetworkLocation { - applicationId = 'com.google.android.gms' - minSdkVersion 19 - dimension 'tier' - } - LegacyNetworkLocation { - applicationId = 'com.google.android.location' - dimension 'tier' - } - UnifiedNlp { - applicationId = 'org.microg.nlp' - dimension 'tier' - } - } - - lintOptions { - disable 'MissingTranslation', 'InvalidPackage', 'BatteryLife', 'ImpliedQuantity', 'MissingQuantity' - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } -} - -dependencies { - implementation project(':unifiednlp-base') -} - -if (file('user.gradle').exists()) { - apply from: 'user.gradle' -} diff --git a/unifiednlp-app/src/main/AndroidManifest.xml b/unifiednlp-app/src/main/AndroidManifest.xml deleted file mode 100644 index 6da019f..0000000 --- a/unifiednlp-app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/unifiednlp-app/src/main/java/org/microg/nlp/ui/SettingsLauncherActivity.java b/unifiednlp-app/src/main/java/org/microg/nlp/ui/SettingsLauncherActivity.java deleted file mode 100644 index 2742a60..0000000 --- a/unifiednlp-app/src/main/java/org/microg/nlp/ui/SettingsLauncherActivity.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.ui; - -import android.app.Activity; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.os.Build; -import android.os.Bundle; - -import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; -import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; -import static android.content.pm.PackageManager.DONT_KILL_APP; - -public class SettingsLauncherActivity extends Activity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - startActivity(new Intent(this, SettingsActivity.class)); - finish(); - } - - public static void setLauncherIconEnabled(Context context, boolean enabled) { - PackageManager pm = context.getPackageManager(); - pm.setComponentEnabledSetting(new ComponentName(context, SettingsLauncherActivity.class), - enabled ? COMPONENT_ENABLED_STATE_ENABLED : COMPONENT_ENABLED_STATE_DISABLED, - DONT_KILL_APP); - } - - public static void updateLauncherIcon(Context context) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - if (SettingInjectorService.settingsInjectionPossible(context)) { - setLauncherIconEnabled(context, false); - } else { - setLauncherIconEnabled(context, true); - } - } - } -} diff --git a/unifiednlp-app/src/main/res/values/bools.xml b/unifiednlp-app/src/main/res/values/bools.xml deleted file mode 100644 index e630184..0000000 --- a/unifiednlp-app/src/main/res/values/bools.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - true - \ No newline at end of file diff --git a/unifiednlp-base/build.gradle b/unifiednlp-base/build.gradle deleted file mode 100644 index 88b6afb..0000000 --- a/unifiednlp-base/build.gradle +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2013-2016 microG Project Team - * - * 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. - */ - -apply plugin: 'com.android.library' - -String getMyVersionName() { - def stdout = new ByteArrayOutputStream() - if (rootProject.file("gradlew").exists()) - exec { commandLine 'git', 'describe', '--tags', '--always', '--dirty'; standardOutput = stdout } - else // automatic build system, don't tag dirty - exec { commandLine 'git', 'describe', '--tags', '--always'; standardOutput = stdout } - return stdout.toString().trim().substring(1) -} - -android { - compileSdkVersion androidCompileSdk() - buildToolsVersion "$androidBuildVersionTools" - - defaultConfig { - versionName getMyVersionName() - minSdkVersion androidMinSdk() - targetSdkVersion androidTargetSdk() - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - lintOptions { - // TODO: Remove MissingTranslation once we have stable strings and proper translations. - disable 'MissingTranslation' - } -} - -dependencies { - implementation project(":microg-ui-tools") - implementation project(':unifiednlp-api') - implementation "com.android.support:support-v4:$supportLibraryVersion" - implementation "com.android.support:appcompat-v7:$supportLibraryVersion" - implementation "com.takisoft.fix:preference-v7:$supportLibraryVersion.0" - compileOnly project(':unifiednlp-compat') -} diff --git a/unifiednlp-base/src/main/AndroidManifest.xml b/unifiednlp-base/src/main/AndroidManifest.xml deleted file mode 100644 index 1b2531d..0000000 --- a/unifiednlp-base/src/main/AndroidManifest.xml +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/AbstractBackendHelper.java b/unifiednlp-base/src/main/java/org/microg/nlp/AbstractBackendHelper.java deleted file mode 100644 index 39081cc..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/AbstractBackendHelper.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp; - -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.ServiceConnection; -import android.os.IBinder; -import android.os.RemoteException; -import android.util.Log; - -public abstract class AbstractBackendHelper implements ServiceConnection { - private final Context context; - protected final Intent serviceIntent; - private boolean bound; - private final String TAG; - private final String signatureDigest; - - protected AbstractBackendHelper(String tag, Context context, Intent serviceIntent) { - this(tag, context, serviceIntent, null); - } - - protected AbstractBackendHelper(String tag, Context context, Intent serviceIntent, String signatureDigest) { - TAG = tag; - this.context = context; - this.serviceIntent = serviceIntent; - this.signatureDigest = signatureDigest; - } - - protected abstract void close() throws RemoteException; - - protected abstract boolean hasBackend(); - - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - bound = true; - Log.d(TAG, "Bound to: " + name); - } - - @Override - public void onServiceDisconnected(ComponentName name) { - bound = false; - Log.d(TAG, "Unbound from: " + name); - } - - public void unbind() { - if (bound) { - Log.d(TAG, "Unbinding from: " + serviceIntent); - if (hasBackend()) { - try { - close(); - } catch (Exception e) { - Log.w(TAG, e); - } - } - try { - context.unbindService(this); - } catch (Exception e) { - Log.w(TAG, e); - } - bound = false; - } - } - - public void bind() { - if (!bound) { - Log.d(TAG, "Binding to: " + serviceIntent); - if (signatureDigest != null) { - if (serviceIntent.getPackage() == null) { - Log.w(TAG, "Intent is not properly resolved, can't verify signature. Aborting."); - return; - } - if (!signatureDigest.equals(Preferences.firstSignatureDigest(context, serviceIntent.getPackage()))) { - Log.w(TAG, "Target signature does not match selected package. Aborting."); - return; - } - } - try { - context.bindService(serviceIntent, this, Context.BIND_AUTO_CREATE); - } catch (Exception e) { - Log.w(TAG, e); - } - } - } - -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/AbstractProviderService.java b/unifiednlp-base/src/main/java/org/microg/nlp/AbstractProviderService.java deleted file mode 100644 index 2245a75..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/AbstractProviderService.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp; - -import android.app.IntentService; -import android.content.Intent; -import android.os.IBinder; - -public abstract class AbstractProviderService extends IntentService { - protected String TAG; - - /** - * Creates an ProviderService. Invoked by your subclass's constructor. - * - * @param tag Used for debugging. - */ - public AbstractProviderService(String tag) { - super(tag); - this.TAG = tag; - } - - @Override - public IBinder onBind(Intent intent) { - return getProvider().getBinder(); - } - - @Override - public boolean onUnbind(Intent intent) { - destroyProvider(); - return super.onUnbind(intent); - } - - /** - * Create a new {@link Provider} or return the existing one. - *

- * This might be called more than once, the implementation has to ensure that only one - * {@link Provider} is returned. - * - * @return a new or existing {@link Provider} instance - */ - protected abstract T getProvider(); - - /** - * Destroy the active {@link Provider}. - *

- * After this has been called, the {@link Provider} instance, that was active before should no - * longer be returned with {@link #getProvider()}. - */ - protected abstract void destroyProvider(); - - @Override - protected void onHandleIntent(Intent intent) { - // Default implementation is to do nothing - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/PackageReceiver.java b/unifiednlp-base/src/main/java/org/microg/nlp/PackageReceiver.java deleted file mode 100644 index e0fefaa..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/PackageReceiver.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.util.Log; - -import org.microg.nlp.geocode.AbstractGeocodeService; -import org.microg.nlp.location.AbstractLocationService; - -public class PackageReceiver extends BroadcastReceiver { - private static final String TAG = "NlpPackageReceiver"; - - @Override - public void onReceive(Context context, Intent intent) { - Log.d(TAG, "Intent received: " + intent); - String packageName = intent.getData().getSchemeSpecificPart(); - Preferences preferences = new Preferences(context); - if (preferences.getLocationBackends().contains(packageName)) { - Log.d(TAG, "Reloading location service for " + packageName); - AbstractLocationService.reloadLocationService(context); - } - if (preferences.getGeocoderBackends().contains(packageName)) { - Log.d(TAG, "Reloading geocoding service for " + packageName); - AbstractGeocodeService.reloadGeocodeService(context); - } - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/Preferences.java b/unifiednlp-base/src/main/java/org/microg/nlp/Preferences.java deleted file mode 100644 index 504c1de..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/Preferences.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp; - -import android.content.Context; -import android.content.SharedPreferences; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.Signature; -import android.preference.PreferenceManager; -import android.provider.Settings; - -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -public class Preferences { - private static final String DEFAULT_LOCATION_BACKENDS = "default_location_backends"; - private static final String DEFAULT_GEOCODER_BACKENDS = "default_geocoder_backends"; - private final Context context; - - public Preferences(Context context) { - this.context = context; - } - - private SharedPreferences getSharedPreferences() { - return PreferenceManager.getDefaultSharedPreferences(context); - } - - public String getDefaultLocationBackends() { - String defBackends = Settings.Secure.getString(context.getContentResolver(), DEFAULT_LOCATION_BACKENDS); - return defBackends == null ? "" : defBackends; - } - - public String getLocationBackends() { - return getSharedPreferences().getString(context.getString(R.string.pref_location_backends), - getDefaultLocationBackends()); - } - - public String getDefaultGeocoderBackends() { - String defBackends = Settings.Secure.getString(context.getContentResolver(), DEFAULT_GEOCODER_BACKENDS); - return defBackends == null ? "" : defBackends; - } - - public String getGeocoderBackends() { - return getSharedPreferences().getString(context.getString(R.string.pref_geocoder_backends), - getDefaultGeocoderBackends()); - } - - public static String[] splitBackendString(String backendString) { - return backendString.split("\\|"); - } - - public static String firstSignatureDigest(Context context, String packageName) { - PackageManager packageManager = context.getPackageManager(); - final PackageInfo info; - try { - info = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES); - } catch (PackageManager.NameNotFoundException e) { - return null; - } - if (info != null && info.signatures != null && info.signatures.length > 0) { - for (Signature sig : info.signatures) { - String digest = sha1sum(sig.toByteArray()); - if (digest != null) { - return digest; - } - } - } - return null; - } - - private static String sha1sum(byte[] bytes) { - MessageDigest md; - try { - md = MessageDigest.getInstance("SHA1"); - } catch (final NoSuchAlgorithmException e) { - return null; - } - if (md != null) { - bytes = md.digest(bytes); - if (bytes != null) { - StringBuilder sb = new StringBuilder(2 * bytes.length); - for (byte b : bytes) { - sb.append(String.format("%02x", b)); - } - return sb.toString(); - } - } - return null; - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/Provider.java b/unifiednlp-base/src/main/java/org/microg/nlp/Provider.java deleted file mode 100644 index 50860e2..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/Provider.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp; - -import android.os.IBinder; - -public interface Provider { - IBinder getBinder(); - - void reload(); - - void destroy(); -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/geocode/AbstractGeocodeService.java b/unifiednlp-base/src/main/java/org/microg/nlp/geocode/AbstractGeocodeService.java deleted file mode 100644 index 55e5c62..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/geocode/AbstractGeocodeService.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.geocode; - -import android.content.Context; -import android.content.Intent; - -import org.microg.nlp.AbstractProviderService; - -import static org.microg.nlp.api.Constants.ACTION_RELOAD_SETTINGS; - -public abstract class AbstractGeocodeService extends AbstractProviderService { - public static void reloadGeocodeService(Context context) { - Intent intent = new Intent(ACTION_RELOAD_SETTINGS); - intent.setClass(context, GeocodeServiceV1.class); - context.startService(intent); - } - - /** - * Creates an GeocodeService. Invoked by your subclass's constructor. - * - * @param tag Used for debugging. - */ - public AbstractGeocodeService(String tag) { - super(tag); - } - - @Override - protected void onHandleIntent(Intent intent) { - if (ACTION_RELOAD_SETTINGS.equals(intent.getAction())) { - GeocodeProvider provider = getProvider(); - if (provider != null) { - provider.reload(); - } - } - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/geocode/BackendFuser.java b/unifiednlp-base/src/main/java/org/microg/nlp/geocode/BackendFuser.java deleted file mode 100644 index 5cdb019..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/geocode/BackendFuser.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.geocode; - -import android.content.Context; -import android.content.Intent; -import android.location.Address; - -import org.microg.nlp.Preferences; - -import java.util.ArrayList; -import java.util.List; - -import static org.microg.nlp.api.Constants.ACTION_GEOCODER_BACKEND; - -class BackendFuser { - private final List backendHelpers = new ArrayList(); - private final Context context; - - public BackendFuser(Context context) { - this.context = context; - reset(); - } - - public void bind() { - for (BackendHelper backendHelper : backendHelpers) { - backendHelper.bind(); - } - } - - public void unbind() { - for (BackendHelper backendHelper : backendHelpers) { - backendHelper.unbind(); - } - } - - public List

getFromLocation(double latitude, double longitude, int maxResults, - String locale) { - if (backendHelpers.isEmpty()) - return null; - ArrayList
result = new ArrayList
(); - for (BackendHelper backendHelper : backendHelpers) { - List
backendResult = backendHelper - .getFromLocation(latitude, longitude, maxResults, locale); - if (backendResult != null) { - result.addAll(backendResult); - } - } - return result; - } - - public List
getFromLocationName(String locationName, int maxResults, - double lowerLeftLatitude, double lowerLeftLongitude, - double upperRightLatitude, double upperRightLongitude, - String locale) { - if (backendHelpers.isEmpty()) - return null; - ArrayList
result = new ArrayList
(); - for (BackendHelper backendHelper : backendHelpers) { - List
backendResult = backendHelper - .getFromLocationName(locationName, maxResults, lowerLeftLatitude, - lowerLeftLongitude, upperRightLatitude, upperRightLongitude, locale); - if (backendResult != null) { - result.addAll(backendResult); - } - } - return result; - } - - public void reset() { - unbind(); - backendHelpers.clear(); - for (String backend : Preferences - .splitBackendString(new Preferences(context).getGeocoderBackends())) { - String[] parts = backend.split("/"); - if (parts.length >= 2) { - Intent intent = new Intent(ACTION_GEOCODER_BACKEND); - intent.setPackage(parts[0]); - intent.setClassName(parts[0], parts[1]); - backendHelpers.add(new BackendHelper(context, intent, parts.length >= 3 ? parts[2] : null)); - } - } - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/geocode/BackendHelper.java b/unifiednlp-base/src/main/java/org/microg/nlp/geocode/BackendHelper.java deleted file mode 100644 index 7366405..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/geocode/BackendHelper.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.geocode; - -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.location.Address; -import android.os.IBinder; -import android.os.RemoteException; -import android.util.Log; - -import org.microg.nlp.AbstractBackendHelper; -import org.microg.nlp.api.GeocoderBackend; - -import java.util.List; - -class BackendHelper extends AbstractBackendHelper { - private static final String TAG = "NlpGeoBackendHelper"; - private GeocoderBackend backend; - - public BackendHelper(Context context, Intent serviceIntent, String signatureDigest) { - super(TAG, context, serviceIntent, signatureDigest); - } - - public List
getFromLocation(double latitude, double longitude, int maxResults, - String locale) { - try { - return backend.getFromLocation(latitude, longitude, maxResults, locale); - } catch (Exception e) { - Log.w(TAG, e); - unbind(); - return null; - } - } - - public List
getFromLocationName(String locationName, int maxResults, - double lowerLeftLatitude, double lowerLeftLongitude, - double upperRightLatitude, double upperRightLongitude, - String locale) { - try { - return backend.getFromLocationName(locationName, maxResults, lowerLeftLatitude, - lowerLeftLongitude, upperRightLatitude, upperRightLongitude, locale); - } catch (Exception e) { - Log.w(TAG, e); - unbind(); - return null; - } - } - - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - super.onServiceConnected(name, service); - backend = GeocoderBackend.Stub.asInterface(service); - if (backend != null) { - try { - backend.open(); - } catch (Exception e) { - Log.w(TAG, e); - unbind(); - } - } - } - - @Override - public void onServiceDisconnected(ComponentName name) { - super.onServiceDisconnected(name); - backend = null; - } - - @Override - public void close() throws RemoteException { - backend.close(); - } - - @Override - public boolean hasBackend() { - return backend != null; - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/geocode/GeocodeProvider.java b/unifiednlp-base/src/main/java/org/microg/nlp/geocode/GeocodeProvider.java deleted file mode 100644 index 3dac25d..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/geocode/GeocodeProvider.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.geocode; - -import org.microg.nlp.Provider; - -interface GeocodeProvider extends Provider { -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/geocode/GeocodeProviderV1.java b/unifiednlp-base/src/main/java/org/microg/nlp/geocode/GeocodeProviderV1.java deleted file mode 100644 index 86f3078..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/geocode/GeocodeProviderV1.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.geocode; - -import android.content.Context; -import android.location.Address; -import android.location.GeocoderParams; - -import com.android.location.provider.GeocodeProvider; - -import java.util.List; - -class GeocodeProviderV1 extends GeocodeProvider implements org.microg.nlp.geocode.GeocodeProvider { - private final BackendFuser backendFuser; - - public GeocodeProviderV1(Context context) { - backendFuser = new BackendFuser(context); - backendFuser.bind(); - } - - @Override - public String onGetFromLocation(double latitude, double longitude, int maxResults, - GeocoderParams params, List
addresses) { - List
fuserResult = backendFuser - .getFromLocation(latitude, longitude, maxResults, params.getLocale().toString()); - return handleResult(addresses, fuserResult); - } - - @Override - public String onGetFromLocationName(String locationName, double lowerLeftLatitude, - double lowerLeftLongitude, double upperRightLatitude, - double upperRightLongitude, int maxResults, - GeocoderParams params, List
addresses) { - List
fuserResult = backendFuser.getFromLocationName(locationName, maxResults, - lowerLeftLatitude, lowerLeftLongitude, upperRightLatitude, upperRightLongitude, - params.getLocale().toString()); - return handleResult(addresses, fuserResult); - } - - private String handleResult(List
realResult, List
fuserResult) { - if (fuserResult == null) { - return "no backend"; - } else if (fuserResult.isEmpty()) { - return "no result"; - } else { - realResult.addAll(fuserResult); - return null; - } - } - - @Override - public void reload() { - backendFuser.unbind(); - backendFuser.reset(); - backendFuser.bind(); - } - - @Override - public void destroy() { - backendFuser.unbind(); - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/geocode/GeocodeServiceV1.java b/unifiednlp-base/src/main/java/org/microg/nlp/geocode/GeocodeServiceV1.java deleted file mode 100644 index edaa2c7..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/geocode/GeocodeServiceV1.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.geocode; - -public class GeocodeServiceV1 extends AbstractGeocodeService { - private static final String TAG = "NlpGeocodeService"; - private static GeocodeProviderV1 THE_ONE; - - public GeocodeServiceV1() { - super(TAG); - } - - @Override - protected synchronized GeocodeProvider getProvider() { - if (THE_ONE == null) { - THE_ONE = new GeocodeProviderV1(this); - } - return THE_ONE; - } - - @Override - protected void destroyProvider() { - THE_ONE.destroy(); - THE_ONE = null; - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/location/AbstractLocationService.java b/unifiednlp-base/src/main/java/org/microg/nlp/location/AbstractLocationService.java deleted file mode 100644 index 4f9ba63..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/location/AbstractLocationService.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.location; - -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.location.Location; -import android.os.IBinder; -import android.util.Log; - -import org.microg.nlp.AbstractProviderService; - -import java.lang.reflect.Method; - -import static android.os.Build.VERSION.SDK_INT; -import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1; -import static org.microg.nlp.api.Constants.ACTION_FORCE_LOCATION; -import static org.microg.nlp.api.Constants.ACTION_RELOAD_SETTINGS; -import static org.microg.nlp.api.Constants.INTENT_EXTRA_LOCATION; -import static org.microg.nlp.api.Constants.PERMISSION_FORCE_LOCATION; - -public abstract class AbstractLocationService extends AbstractProviderService { - public static ComponentName reloadLocationService(Context context) { - Intent intent = new Intent(ACTION_RELOAD_SETTINGS); - setIntentTarget(context, intent); - return context.startService(intent); - } - - private static void setIntentTarget(Context context, Intent intent) { - if (SDK_INT >= JELLY_BEAN_MR1) { - intent.setClass(context, LocationServiceV2.class); - } else { - intent.setClass(context, LocationServiceV1.class); - } - } - - public static boolean WAS_BOUND = false; - - /** - * Creates an LocationService. Invoked by your subclass's constructor. - * - * @param tag Used for debugging. - */ - public AbstractLocationService(String tag) { - super(tag); - } - - @Override - public IBinder onBind(Intent intent) { - WAS_BOUND = true; - updateLauncherIcon(); - return super.onBind(intent); - } - - @Override - protected void onHandleIntent(Intent intent) { - LocationProvider provider = getProvider(); - - if (ACTION_RELOAD_SETTINGS.equals(intent.getAction())) { - if (provider != null) { - provider.reload(); - } else { - Log.d(TAG, "Cannot reload settings, provider not ready"); - } - } - - updateLauncherIcon(); - } - - @Override - public boolean onUnbind(Intent intent) { - LocationProvider provider = getProvider(); - if (provider != null) { - provider.onDisable(); - } - updateLauncherIcon(); - return super.onUnbind(intent); - } - - @SuppressWarnings("unchecked") - private void updateLauncherIcon() { - try { - Class cls = Class.forName("org.microg.nlp.ui.SettingsLauncherActivity"); - Method updateLauncherIcon = cls.getDeclaredMethod("updateLauncherIcon", Context.class); - updateLauncherIcon.invoke(null, this); - } catch (Exception ignored) { - // This package does not come with a settings launcher icon - } - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/location/BackendFuser.java b/unifiednlp-base/src/main/java/org/microg/nlp/location/BackendFuser.java deleted file mode 100644 index 92342ee..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/location/BackendFuser.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.location; - -import android.content.Context; -import android.content.Intent; -import android.location.Location; -import android.location.LocationManager; -import android.util.Log; - -import org.microg.nlp.Preferences; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -import static org.microg.nlp.api.Constants.ACTION_LOCATION_BACKEND; -import static org.microg.nlp.api.Constants.LOCATION_EXTRA_OTHER_BACKENDS; - -class BackendFuser { - private static final String TAG = "NlpLocationBackendFuser"; - - private final List backendHelpers = new ArrayList(); - private final LocationProvider locationProvider; - private final Context context; - private boolean fusing = false; - private long lastLocationReportTime = 0; - - public BackendFuser(Context context, LocationProvider locationProvider) { - this.locationProvider = locationProvider; - this.context = context; - reset(); - } - - public void reset() { - unbind(); - backendHelpers.clear(); - lastLocationReportTime = 0; - for (String backend : Preferences - .splitBackendString(new Preferences(context).getLocationBackends())) { - String[] parts = backend.split("/"); - if (parts.length >= 2) { - Intent intent = new Intent(ACTION_LOCATION_BACKEND); - intent.setPackage(parts[0]); - intent.setClassName(parts[0], parts[1]); - backendHelpers.add(new BackendHelper(context, this, intent, parts.length >= 3 ? parts[2] : null)); - } - } - } - - public void unbind() { - for (BackendHelper handler : backendHelpers) { - handler.unbind(); - } - } - - public void bind() { - fusing = false; - for (BackendHelper handler : backendHelpers) { - handler.bind(); - } - } - - public void update() { - boolean hasUpdates = false; - fusing = true; - for (BackendHelper handler : backendHelpers) { - if (handler.update() != null) - hasUpdates = true; - } - fusing = false; - if (hasUpdates) - updateLocation(); - } - - void updateLocation() { - List locations = new ArrayList(); - for (BackendHelper handler : backendHelpers) { - locations.add(handler.getLastLocation()); - } - Location location = mergeLocations(locations); - if (location != null) { - location.setProvider(LocationManager.NETWORK_PROVIDER); - if (lastLocationReportTime < location.getTime()) { - lastLocationReportTime = location.getTime(); - locationProvider.reportLocation(location); - Log.v(TAG, "location=" + location); - } else { - Log.v(TAG, "Ignoring location update as it's older than other provider."); - } - } - } - - private Location mergeLocations(List locations) { - Collections.sort(locations, LocationComparator.INSTANCE); - if (locations.isEmpty() || locations.get(0) == null) - return null; - if (locations.size() == 1) - return locations.get(0); - Location location = new Location(locations.get(0)); - ArrayList backendResults = new ArrayList(); - for (Location backendResult : locations) { - if (locations.get(0) == backendResult) - continue; - if (backendResult != null) - backendResults.add(backendResult); - } - if (!backendResults.isEmpty()) { - location.getExtras().putParcelableArrayList(LOCATION_EXTRA_OTHER_BACKENDS, backendResults); - } - return location; - } - - public void reportLocation() { - if (fusing) - return; - updateLocation(); - } - - public void destroy() { - unbind(); - backendHelpers.clear(); - } - - public static class LocationComparator implements Comparator { - - public static final LocationComparator INSTANCE = new LocationComparator(); - public static final long SWITCH_ON_FRESHNESS_CLIFF_MS = 30000; // 30 seconds - - /** - * @return whether {@param lhs} is better than {@param rhs} - */ - @Override - public int compare(Location lhs, Location rhs) { - if (lhs == rhs) - return 0; - if (lhs == null) { - return 1; - } - if (rhs == null) { - return -1; - } - if (!lhs.hasAccuracy()) { - return 1; - } - if (!rhs.hasAccuracy()) { - return -1; - } - if (rhs.getTime() > lhs.getTime() + SWITCH_ON_FRESHNESS_CLIFF_MS) { - return 1; - } - if (lhs.getTime() > rhs.getTime() + SWITCH_ON_FRESHNESS_CLIFF_MS) { - return -1; - } - return (int) (lhs.getAccuracy() - rhs.getAccuracy()); - } - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/location/BackendHelper.java b/unifiednlp-base/src/main/java/org/microg/nlp/location/BackendHelper.java deleted file mode 100644 index 86986e6..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/location/BackendHelper.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.location; - -import android.annotation.TargetApi; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.location.Location; -import android.os.Build; -import android.os.Bundle; -import android.os.IBinder; -import android.os.RemoteException; -import android.os.SystemClock; -import android.util.Log; - -import com.android.location.provider.LocationProviderBase; - -import org.microg.nlp.AbstractBackendHelper; -import org.microg.nlp.api.LocationBackend; -import org.microg.nlp.api.LocationCallback; - -import static org.microg.nlp.api.Constants.LOCATION_EXTRA_BACKEND_COMPONENT; -import static org.microg.nlp.api.Constants.LOCATION_EXTRA_BACKEND_PROVIDER; - -class BackendHelper extends AbstractBackendHelper { - private static final String TAG = "NlpLocBackendHelper"; - private final BackendFuser backendFuser; - private final Callback callback = new Callback(); - private LocationBackend backend; - private boolean updateWaiting; - private Location lastLocation; - - public BackendHelper(Context context, BackendFuser backendFuser, Intent serviceIntent, String signatureDigest) { - super(TAG, context, serviceIntent, signatureDigest); - this.backendFuser = backendFuser; - } - - public Location getLastLocation() { - return lastLocation; - } - - /** - * Requests a location update from the backend. - * - * @return The location reported by the backend. This may be null if a backend cannot determine its - * location, or if it is going to return a location asynchronously. - */ - public Location update() { - Location result = null; - if (backend == null) { - Log.d(TAG, "Not (yet) bound."); - updateWaiting = true; - } else { - updateWaiting = false; - try { - result = backend.update(); - if (result != null && (lastLocation == null || result.getTime() > lastLocation.getTime())) { - setLastLocation(result); - backendFuser.reportLocation(); - } - } catch (Exception e) { - Log.w(TAG, e); - unbind(); - } - } - return result; - } - - private void setLastLocation(Location location) { - if (location == null || !location.hasAccuracy()) { - return; - } - if (location.getExtras() == null) { - location.setExtras(new Bundle()); - } - location.getExtras().putString(LOCATION_EXTRA_BACKEND_PROVIDER, location.getProvider()); - location.getExtras().putString(LOCATION_EXTRA_BACKEND_COMPONENT, - serviceIntent.getComponent().flattenToShortString()); - location.setProvider("network"); - if (!location.hasAccuracy()) { - location.setAccuracy(50000); - } - if (location.getTime() <= 0) { - location.setTime(System.currentTimeMillis()); - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - updateElapsedRealtimeNanos(location); - } - Location noGpsLocation = new Location(location); - noGpsLocation.setExtras(null); - location.getExtras().putParcelable(LocationProviderBase.EXTRA_NO_GPS_LOCATION, noGpsLocation); - lastLocation = location; - } - - @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) - private void updateElapsedRealtimeNanos(Location location) { - if (location.getElapsedRealtimeNanos() <= 0) { - location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); - } - } - - @Override - public void close() throws RemoteException { - backend.close(); - } - - @Override - public boolean hasBackend() { - return backend != null; - } - - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - super.onServiceConnected(name, service); - backend = LocationBackend.Stub.asInterface(service); - if (backend != null) { - try { - backend.open(callback); - if (updateWaiting) { - update(); - } - } catch (Exception e) { - Log.w(TAG, e); - unbind(); - } - } - } - - @Override - public void onServiceDisconnected(ComponentName name) { - super.onServiceDisconnected(name); - backend = null; - } - - private class Callback extends LocationCallback.Stub { - @Override - public void report(Location location) throws RemoteException { - if ((location == null) || - (lastLocation != null && location.getTime() > 0 && location.getTime() <= lastLocation.getTime())) - return; - setLastLocation(location); - backendFuser.reportLocation(); - } - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/location/LocationProvider.java b/unifiednlp-base/src/main/java/org/microg/nlp/location/LocationProvider.java deleted file mode 100644 index b575331..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/location/LocationProvider.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.location; - -import android.location.Location; - -import org.microg.nlp.Provider; - -interface LocationProvider extends Provider { - int FASTEST_REFRESH_INTERVAL = 2500; // in milliseconds - - void onEnable(); - - void onDisable(); - - void reportLocation(Location location); -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/location/LocationProviderV1.java b/unifiednlp-base/src/main/java/org/microg/nlp/location/LocationProviderV1.java deleted file mode 100644 index 71cf987..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/location/LocationProviderV1.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.location; - -import android.content.Context; -import android.location.Criteria; -import android.location.Location; -import android.net.NetworkInfo; -import android.os.Bundle; -import android.os.WorkSource; -import android.util.Log; - -import static android.location.LocationProvider.AVAILABLE; - -public class LocationProviderV1 extends com.android.location.provider.LocationProvider - implements LocationProvider { - private static final String TAG = "NlpLocationProvider"; - - private final ThreadHelper helper; - private long autoTime = Long.MAX_VALUE; - private boolean autoUpdate = false; - - public LocationProviderV1(Context context) { - this.helper = new ThreadHelper(context, this); - } - - @Override - public void onDisable() { - Log.d(TAG, "onDisable"); - helper.disable(); - } - - @Override - public void reload() { - helper.reload(); - } - - @Override - public void onEnable() { - Log.d(TAG, "onEnable"); - } - - @Override - public boolean onRequiresNetwork() { - return false; - } - - @Override - public boolean onRequiresSatellite() { - return false; - } - - @Override - public boolean onRequiresCell() { - return false; - } - - @Override - public boolean onHasMonetaryCost() { - return false; - } - - @Override - public boolean onSupportsAltitude() { - return true; - } - - @Override - public boolean onSupportsSpeed() { - return true; - } - - @Override - public boolean onSupportsBearing() { - return true; - } - - @Override - public int onGetPowerRequirement() { - return Criteria.POWER_LOW; - } - - @Override - public boolean onMeetsCriteria(Criteria criteria) { - if (criteria.getAccuracy() == Criteria.ACCURACY_FINE) { - return false; - } - return true; - } - - @Override - public int onGetAccuracy() { - return Criteria.ACCURACY_COARSE; - } - - @Override - public int onGetStatus(Bundle extras) { - return AVAILABLE; - } - - @Override - public long onGetStatusUpdateTime() { - return 0; - } - - @Override - public String onGetInternalState() { - return null; - } - - @Override - public void onEnableLocationTracking(boolean enable) { - Log.v(TAG, "onEnableLocationTracking: " + enable); - autoUpdate = enable; - if (autoUpdate && autoTime != Long.MAX_VALUE) helper.enable(); - } - - @Override - public void onSetMinTime(long minTime, WorkSource ws) { - Log.v(TAG, "onSetMinTime: " + minTime + " by " + ws); - autoTime = Math.max(minTime, FASTEST_REFRESH_INTERVAL); - helper.setTime(autoTime); - if (autoUpdate) helper.enable(); - } - - @Override - public void onUpdateNetworkState(int state, NetworkInfo info) { - - } - - @Override - public void onUpdateLocation(Location location) { - - } - - @Override - public boolean onSendExtraCommand(String command, Bundle extras) { - return false; - } - - @Override - public void onAddListener(int uid, WorkSource ws) { - - } - - @Override - public void onRemoveListener(int uid, WorkSource ws) { - - } - - @Override - public void destroy() { - helper.destroy(); - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/location/LocationProviderV2.java b/unifiednlp-base/src/main/java/org/microg/nlp/location/LocationProviderV2.java deleted file mode 100644 index 0575a8c..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/location/LocationProviderV2.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.location; - -import android.content.Context; -import android.location.Criteria; -import android.location.Location; -import android.os.Bundle; -import android.os.WorkSource; -import android.util.Log; - -import com.android.location.provider.LocationProviderBase; -import com.android.location.provider.ProviderPropertiesUnbundled; -import com.android.location.provider.ProviderRequestUnbundled; - -import static android.location.LocationProvider.AVAILABLE; - -class LocationProviderV2 extends LocationProviderBase implements LocationProvider { - private static final String TAG = "NlpLocationProvider"; - private static final ProviderPropertiesUnbundled props = ProviderPropertiesUnbundled.create( - false, // requiresNetwork - false, // requiresSatellite - false, // requiresCell - false, // hasMonetaryCost - true, // supportsAltitude - true, // supportsSpeed - true, // supportsBearing - Criteria.POWER_LOW, // powerRequirement - Criteria.ACCURACY_COARSE); // accuracy - private final ThreadHelper helper; - - public LocationProviderV2(Context context) { - super(TAG, props); - this.helper = new ThreadHelper(context, this); - } - - @Override - public void onDisable() { - Log.d(TAG, "onDisable"); - helper.disable(); - } - - @Override - public void reload() { - helper.reload(); - } - - @Override - public void destroy() { - helper.destroy(); - } - - @Override - public void onEnable() { - Log.d(TAG, "onEnable"); - } - - @Override - public int onGetStatus(Bundle extras) { - return AVAILABLE; - } - - @Override - public long onGetStatusUpdateTime() { - return 0; - } - - @Override - public void onSetRequest(ProviderRequestUnbundled requests, WorkSource source) { - Log.v(TAG, "onSetRequest: " + requests + " by " + source); - - long autoTime = Math.max(requests.getInterval(), FASTEST_REFRESH_INTERVAL); - boolean autoUpdate = requests.getReportLocation(); - - Log.v(TAG, "using autoUpdate=" + autoUpdate + " autoTime=" + autoTime); - - if (autoUpdate) { - helper.setTime(autoTime); - helper.enable(); - } else { - helper.disable(); - } - } - -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/location/LocationServiceV1.java b/unifiednlp-base/src/main/java/org/microg/nlp/location/LocationServiceV1.java deleted file mode 100644 index 41d28fc..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/location/LocationServiceV1.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.location; - -public class LocationServiceV1 extends AbstractLocationService { - private static LocationProviderV1 THE_ONE; - - public LocationServiceV1() { - super("NlpLocationServiceV1"); - } - - @Override - protected synchronized LocationProvider getProvider() { - if (THE_ONE == null) { - THE_ONE = new LocationProviderV1(this); - } - return THE_ONE; - } - - @Override - protected void destroyProvider() { - THE_ONE.destroy(); - THE_ONE = null; - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/location/LocationServiceV2.java b/unifiednlp-base/src/main/java/org/microg/nlp/location/LocationServiceV2.java deleted file mode 100644 index fcca9af..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/location/LocationServiceV2.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.location; - -public class LocationServiceV2 extends AbstractLocationService { - private static LocationProviderV2 THE_ONE; - - public LocationServiceV2() { - super("NlpLocationServiceV2"); - } - - @Override - protected synchronized LocationProvider getProvider() { - if (THE_ONE == null) { - THE_ONE = new LocationProviderV2(this); - } - return THE_ONE; - } - - @Override - protected void destroyProvider() { - THE_ONE.destroy(); - THE_ONE = null; - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/location/ThreadHelper.java b/unifiednlp-base/src/main/java/org/microg/nlp/location/ThreadHelper.java deleted file mode 100644 index 28e66db..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/location/ThreadHelper.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.location; - -import android.content.Context; -import android.location.Location; - -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; - -class ThreadHelper implements Runnable { - private final BackendFuser backendFuser; - private ScheduledThreadPoolExecutor executor; - private long time = 60000; // Initialize with 60s - private final AtomicBoolean enabled = new AtomicBoolean(false); - - public ThreadHelper(Context context, LocationProvider locationProvider) { - backendFuser = new BackendFuser(context, locationProvider); - } - - public void reload() { - disable(); - backendFuser.reset(); - enable(); - } - - public void disable() { - if (executor != null) { - executor.shutdownNow(); - executor = null; - } - backendFuser.unbind(); - enabled.set(false); - } - - public void setTime(long time) { - this.time = time; - } - - void reset() { - if (executor != null) { - executor.shutdownNow(); - executor = null; - } - executor = new ScheduledThreadPoolExecutor(1); - executor.scheduleAtFixedRate(this, 0, time, TimeUnit.MILLISECONDS); - } - - public void enable() { - if (enabled.compareAndSet(false, true)) { - backendFuser.bind(); - } - reset(); - } - - @Override - public void run() { - backendFuser.update(); - } - - public void destroy() { - if (executor != null) { - executor.shutdownNow(); - } - backendFuser.destroy(); - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/ui/AbstractBackendPreference.java b/unifiednlp-base/src/main/java/org/microg/nlp/ui/AbstractBackendPreference.java deleted file mode 100644 index 047b9ce..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/ui/AbstractBackendPreference.java +++ /dev/null @@ -1,274 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.ui; - -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.ServiceConnection; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.content.pm.ServiceInfo; -import android.os.IBinder; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.CheckBox; -import android.widget.ListView; -import android.widget.TextView; -import android.widget.Toast; - -import org.microg.nlp.Preferences; -import org.microg.nlp.R; -import org.microg.tools.ui.DialogPreference; - -import java.util.ArrayList; -import java.util.List; - -import static android.content.Context.BIND_AUTO_CREATE; -import static android.content.Intent.ACTION_VIEW; -import static org.microg.nlp.api.Constants.METADATA_BACKEND_ABOUT_ACTIVITY; -import static org.microg.nlp.api.Constants.METADATA_BACKEND_INIT_ACTIVITY; -import static org.microg.nlp.api.Constants.METADATA_BACKEND_SETTINGS_ACTIVITY; -import static org.microg.nlp.api.Constants.METADATA_BACKEND_SUMMARY; - -abstract class AbstractBackendPreference extends DialogPreference { - private ListView listView; - private final Adapter adapter; - private List knownBackends; - - AbstractBackendPreference(Context context, AttributeSet attrs) { - super(context, attrs); - - setPositiveButtonText(android.R.string.ok); - setNegativeButtonText(android.R.string.cancel); - - setDialogIcon(null); - - adapter = new Adapter(); - } - - @Override - protected View onCreateDialogView() { - listView = new ListView(getContext()); - updateBackends(); - return listView; - } - - private void updateBackends() { - knownBackends = queryKnownBackends(); - markBackendsAsEnabled(); - resetAdapter(); - } - - List queryKnownBackends() { - return intentToKnownBackends(buildBackendIntent()); - } - - private void resetAdapter() { - adapter.clear(); - for (BackendInfo backend : knownBackends) { - adapter.add(backend); - } - listView.setAdapter(adapter); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - for (BackendInfo backend : knownBackends) { - if (backend.enabled) { - if (sb.length() != 0) { - sb.append("|"); - } - sb.append(backend.toSettingsString()); - } - } - return sb.toString(); - } - - void markBackendsAsEnabled() { - for (String backend : Preferences.splitBackendString(getPersistedString(defaultValue()))) { - String[] parts = backend.split("/"); - if (parts.length >= 2) { - for (BackendInfo backendInfo : knownBackends) { - ServiceInfo serviceInfo = backendInfo.serviceInfo; - if (serviceInfo.packageName.equals(parts[0]) && serviceInfo.name.equals(parts[1])) { - if (parts.length == 2 || parts[2].equals(backendInfo.signatureDigest)) { - backendInfo.enabled = true; - } - } - } - } - } - } - - List intentToKnownBackends(Intent intent) { - List knownBackends = new ArrayList(); - List resolveInfos = getContext().getPackageManager() - .queryIntentServices(intent, PackageManager.GET_META_DATA); - for (ResolveInfo info : resolveInfos) { - ServiceInfo serviceInfo = info.serviceInfo; - String simpleName = String.valueOf(serviceInfo.loadLabel(getContext().getPackageManager())); - String signatureDigest = Preferences.firstSignatureDigest(getContext(), serviceInfo.packageName); - knownBackends.add(new BackendInfo(serviceInfo, simpleName, signatureDigest)); - } - return knownBackends; - } - - private Intent createExternalIntent(BackendInfo backendInfo, String metaName) { - Intent intent = new Intent(ACTION_VIEW); - intent.setPackage(backendInfo.serviceInfo.packageName); - intent.setClassName(backendInfo.serviceInfo.packageName, backendInfo.getMeta(metaName)); - return intent; - } - - private class Adapter extends ArrayAdapter { - - public Adapter() { - super(AbstractBackendPreference.this.getContext(), R.layout.backend_list_entry); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View v; - if (convertView != null) { - v = convertView; - } else { - v = ((LayoutInflater) getContext().getSystemService( - Context.LAYOUT_INFLATER_SERVICE)).inflate( - R.layout.backend_list_entry, parent, false); - } - final BackendInfo backend = getItem(position); - TextView title = (TextView) v.findViewById(android.R.id.text1); - title.setText(backend.simpleName); - TextView subtitle = (TextView) v.findViewById(android.R.id.text2); - if (backend.getMeta(METADATA_BACKEND_SUMMARY) != null) { - subtitle.setText(backend.serviceInfo.metaData.getString(METADATA_BACKEND_SUMMARY)); - subtitle.setVisibility(View.VISIBLE); - } else { - subtitle.setVisibility(View.GONE); - } - final CheckBox checkbox = (CheckBox) v.findViewById(R.id.enabled); - if (checkbox.isChecked() != backend.enabled) { - checkbox.toggle(); - } - checkbox.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - backend.enabled = checkbox.isChecked(); - if (backend.enabled) enableBackend(backend); - } - }); - configureExternalButton(backend, v.findViewById(android.R.id.button1), - METADATA_BACKEND_SETTINGS_ACTIVITY); - configureExternalButton(backend, v.findViewById(android.R.id.button2), - METADATA_BACKEND_ABOUT_ACTIVITY); - return v; - } - - private void configureExternalButton(final BackendInfo backend, View button, - final String metaName) { - if (backend.getMeta(metaName) != null) { - button.setVisibility(View.VISIBLE); - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - getContext().startActivity(createExternalIntent(backend, metaName)); - } - }); - } else { - button.setVisibility(View.GONE); - } - } - } - - protected void enableBackend(BackendInfo backendInfo) { - try { - if (backendInfo.getMeta(METADATA_BACKEND_INIT_ACTIVITY) != null) { - getContext().startActivity(createExternalIntent(backendInfo, METADATA_BACKEND_INIT_ACTIVITY)); - } else { - Intent intent = buildBackendIntent(); - intent.setPackage(backendInfo.serviceInfo.packageName); - intent.setClassName(backendInfo.serviceInfo.packageName, backendInfo.serviceInfo.name); - getContext().bindService(intent, new ServiceConnection() { - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - Intent i = getBackendInitIntent(service); - if (i != null) { - getContext().startActivity(i); - } - getContext().unbindService(this); - } - - @Override - public void onServiceDisconnected(ComponentName name) { - - } - }, BIND_AUTO_CREATE); - } - } catch (Exception e) { - backendInfo.enabled = false; - Toast.makeText(getContext(), "Error initializing backend", Toast.LENGTH_SHORT).show(); - resetAdapter(); - } - } - - @Override - protected void onDialogClosed(boolean positiveResult) { - if (positiveResult) { - persistString(toString()); - onValueChanged(); - } - } - - protected abstract void onValueChanged(); - - protected abstract Intent buildBackendIntent(); - - protected abstract String defaultValue(); - - protected abstract Intent getBackendInitIntent(IBinder service); - - private class BackendInfo { - private final ServiceInfo serviceInfo; - private final String simpleName; - private final String signatureDigest; - private boolean enabled = false; - - public BackendInfo(ServiceInfo serviceInfo, String simpleName, String signatureDigest) { - this.serviceInfo = serviceInfo; - this.simpleName = simpleName; - this.signatureDigest = signatureDigest; - } - - public String getMeta(String metaName) { - return serviceInfo.metaData != null ? serviceInfo.metaData.getString(metaName) : null; - } - - @Override - public String toString() { - return simpleName; - } - - public String toSettingsString() { - return serviceInfo.packageName + "/" + serviceInfo.name + "/" + signatureDigest; - } - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/ui/GeocoderBackendPreference.java b/unifiednlp-base/src/main/java/org/microg/nlp/ui/GeocoderBackendPreference.java deleted file mode 100644 index 4fa63c1..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/ui/GeocoderBackendPreference.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.ui; - -import android.content.Context; -import android.content.Intent; -import android.os.IBinder; -import android.os.RemoteException; -import android.util.AttributeSet; - -import org.microg.nlp.Preferences; -import org.microg.nlp.R; -import org.microg.nlp.api.GeocoderBackend; -import org.microg.nlp.geocode.AbstractGeocodeService; - -import static org.microg.nlp.api.Constants.ACTION_GEOCODER_BACKEND; - -public class GeocoderBackendPreference extends AbstractBackendPreference { - public GeocoderBackendPreference(Context context, AttributeSet attrs) { - super(context, attrs); - setDialogTitle(R.string.configure_geocoder_backends); - setTitle(R.string.configure_geocoder_backends); - } - - @Override - protected void onValueChanged() { - AbstractGeocodeService.reloadGeocodeService(getContext()); - } - - @Override - protected Intent buildBackendIntent() { - return new Intent(ACTION_GEOCODER_BACKEND); - } - - @Override - protected String defaultValue() { - return new Preferences(getContext()).getDefaultGeocoderBackends(); - } - - @Override - protected Intent getBackendInitIntent(IBinder service) { - GeocoderBackend backend = GeocoderBackend.Stub.asInterface(service); - try { - return backend.getInitIntent(); - } catch (RemoteException e) { - return null; - } - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/ui/LocationBackendPreference.java b/unifiednlp-base/src/main/java/org/microg/nlp/ui/LocationBackendPreference.java deleted file mode 100644 index 0546563..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/ui/LocationBackendPreference.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.ui; - -import android.content.Context; -import android.content.Intent; -import android.os.IBinder; -import android.os.RemoteException; -import android.util.AttributeSet; - -import org.microg.nlp.Preferences; -import org.microg.nlp.R; -import org.microg.nlp.api.GeocoderBackend; -import org.microg.nlp.api.LocationBackend; -import org.microg.nlp.location.AbstractLocationService; - -import static org.microg.nlp.api.Constants.ACTION_LOCATION_BACKEND; - -public class LocationBackendPreference extends AbstractBackendPreference { - public LocationBackendPreference(Context context, AttributeSet attrs) { - super(context, attrs); - setDialogTitle(R.string.configure_location_backends); - setTitle(R.string.configure_location_backends); - } - - @Override - protected void onValueChanged() { - AbstractLocationService.reloadLocationService(getContext()); - } - - @Override - protected Intent buildBackendIntent() { - return new Intent(ACTION_LOCATION_BACKEND); - } - - @Override - protected String defaultValue() { - return new Preferences(getContext()).getDefaultLocationBackends(); - } - - @Override - protected Intent getBackendInitIntent(IBinder service) { - LocationBackend backend = LocationBackend.Stub.asInterface(service); - try { - return backend.getInitIntent(); - } catch (RemoteException e) { - return null; - } - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/ui/SettingInjectorService.java b/unifiednlp-base/src/main/java/org/microg/nlp/ui/SettingInjectorService.java deleted file mode 100644 index 3a50ba1..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/ui/SettingInjectorService.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.ui; - -import android.annotation.TargetApi; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.os.Build; -import android.os.UserHandle; -import android.util.Log; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.List; - -import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; -import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; -import static android.content.pm.PackageManager.DONT_KILL_APP; -import static android.content.pm.PackageManager.GET_META_DATA; - -@TargetApi(Build.VERSION_CODES.KITKAT) -public class SettingInjectorService extends android.location.SettingInjectorService { - private static final String TAG = "NlpSettingInjector"; - - public SettingInjectorService() { - super(TAG); - } - - @Override - @SuppressWarnings("deprecation") - protected String onGetSummary() { - return ""; - } - - @Override - protected boolean onGetEnabled() { - return true; - } - - /** - * Dirty method to check whether settings injection is possible on the currently used system - */ - @SuppressWarnings("unchecked") - public static boolean settingsInjectionPossible(Context context) { - try { - Context settingsContext = context.createPackageContext("com.android.settings", CONTEXT_INCLUDE_CODE); - ClassLoader cl = settingsContext.getClassLoader(); - Class cls = cl.loadClass("com.android.settings.location.SettingsInjector"); - int pSiVersion; - Method pSi; - try { - pSi = cls.getDeclaredMethod("parseServiceInfo", ResolveInfo.class, PackageManager.class); - pSiVersion = 1; - } catch (NoSuchMethodException e) { - pSi = cls.getDeclaredMethod("parseServiceInfo", ResolveInfo.class, UserHandle.class, PackageManager.class); - pSiVersion = 2; - } - pSi.setAccessible(true); - PackageManager pm = context.getPackageManager(); - Intent intent = new Intent(context, SettingInjectorService.class); - List ris = pm.queryIntentServices(intent, GET_META_DATA); - ResolveInfo ri = ris.get(0); - Object result = null; - if (pSiVersion == 1) { - result = pSi.invoke(null, ri, pm); - } else if (pSiVersion == 2) { - result = pSi.invoke(null, ri, android.os.Process.myUserHandle(), pm); - } - if (result != null) { - Log.d(TAG, "Setting injection possible!"); - return true; - } - } catch (InvocationTargetException e) { - Log.d(TAG, "settings injection not possible: " + e.getMessage()); - } catch (Exception e) { - Log.w(TAG, "Can't determine if settings injection is possible", e); - } - return false; - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/nlp/ui/SettingsActivity.java b/unifiednlp-base/src/main/java/org/microg/nlp/ui/SettingsActivity.java deleted file mode 100644 index 88df2cb..0000000 --- a/unifiednlp-base/src/main/java/org/microg/nlp/ui/SettingsActivity.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.nlp.ui; - -import android.content.Context; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.FragmentTransaction; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.preference.Preference; -import android.support.v7.widget.Toolbar; - -import org.microg.nlp.BuildConfig; -import org.microg.nlp.R; -import org.microg.tools.selfcheck.NlpOsCompatChecks; -import org.microg.tools.selfcheck.NlpStatusChecks; -import org.microg.tools.selfcheck.PermissionCheckGroup; -import org.microg.tools.selfcheck.SelfCheckGroup; -import org.microg.tools.ui.AbstractAboutFragment; -import org.microg.tools.ui.AbstractSelfCheckFragment; -import org.microg.tools.ui.AbstractSettingsFragment; - -import java.util.List; - -import static android.Manifest.permission.ACCESS_COARSE_LOCATION; -import static android.os.Build.VERSION.SDK_INT; -import static android.os.Build.VERSION_CODES.LOLLIPOP_MR1; - -public class SettingsActivity extends AppCompatActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.settings_activity); - setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); - getSupportFragmentManager().beginTransaction() - .replace(R.id.content_wrapper, new MyPreferenceFragment()).commit(); - } - - private static boolean isUnifiedNlpAppRelease(Context context) { - int resId = context.getResources().getIdentifier("is_unifiednlp_app", "bool", context.getPackageName()); - return resId != 0 && context.getResources().getBoolean(resId); - } - - public static class MyPreferenceFragment extends AbstractSettingsFragment { - @Override - public void onCreatePreferencesFix(@Nullable Bundle savedInstanceState, String rootKey) { - if (isUnifiedNlpAppRelease(getContext())) { - addPreferencesFromResource(R.xml.nlp_setup_preferences); - - findPreference(getString(R.string.self_check_title)) - .setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - getFragmentManager().beginTransaction() - .addToBackStack("root") - .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) - .replace(R.id.content_wrapper, new MySelfCheckFragment()) - .commit(); - return true; - } - }); - } - addPreferencesFromResource(R.xml.nlp_preferences); - if (isUnifiedNlpAppRelease(getContext())) { - addPreferencesFromResource(R.xml.nlp_about_preferences); - - findPreference(getString(R.string.pref_about_title)) - .setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - getFragmentManager().beginTransaction() - .addToBackStack("root") - .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) - .replace(R.id.content_wrapper, new MyAboutFragment()) - .commit(); - return true; - } - }); - } - } - } - - public static class MySelfCheckFragment extends AbstractSelfCheckFragment { - - @Override - protected void prepareSelfCheckList(List checks) { - if (SDK_INT > LOLLIPOP_MR1) { - checks.add(new PermissionCheckGroup(ACCESS_COARSE_LOCATION)); - } - checks.add(new NlpOsCompatChecks()); - checks.add(new NlpStatusChecks()); - } - } - - public static class MyAboutFragment extends AbstractAboutFragment { - - @Override - protected String getSummary() { - String packageName = getContext().getPackageName(); - if (packageName.equals("com.google.android.gms")) { - return getString(R.string.nlp_version_default); - } else if (packageName.equals("com.google.android.location")) { - return getString(R.string.nlp_version_legacy); - } else if (packageName.equals("org.microg.nlp")) { - return getString(R.string.nlp_version_custom); - } - return null; - } - - @Override - protected String getSelfVersion() { - return BuildConfig.VERSION_NAME; - } - - @Override - protected void collectLibraries(List libraries) { - libraries.add(new Library("org.microg.nlp.api", "microG UnifiedNlp Api", "Apache License 2.0 by microG Team")); - } - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/tools/selfcheck/NlpOsCompatChecks.java b/unifiednlp-base/src/main/java/org/microg/tools/selfcheck/NlpOsCompatChecks.java deleted file mode 100644 index acb0edd..0000000 --- a/unifiednlp-base/src/main/java/org/microg/tools/selfcheck/NlpOsCompatChecks.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.tools.selfcheck; - -import android.content.Context; - -import org.microg.nlp.R; - -import java.util.Arrays; - -import static android.os.Build.VERSION.SDK_INT; -import static android.os.Build.VERSION_CODES.JELLY_BEAN; -import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1; -import static android.os.Build.VERSION_CODES.KITKAT; -import static android.os.Build.VERSION_CODES.M; - -public class NlpOsCompatChecks implements SelfCheckGroup { - - public static final String CONFIG_NL_PROVIDER = "config_networkLocationProvider"; - public static final String CONFIG_NL_PROVIDER_PACKAGE_NAME = "config_networkLocationProviderPackageName"; - public static final String CONFIG_ENABLE_NL_OVERLAY = "config_enableNetworkLocationOverlay"; - public static final String CONFIG_NL_PROVIDER_PACKAGE_NAMES = "config_locationProviderPackageNames"; - - @Override - public String getGroupName(Context context) { - return context.getString(R.string.self_check_cat_nlpcompat); - } - - @Override - public void doChecks(Context context, ResultCollector collector) { - checkSystemIsSupported(context, collector); - checkSystemIsConfigured(context, collector); - } - - private boolean checkSystemIsSupported(Context context, ResultCollector collector) { - boolean isSupported = (SDK_INT >= KITKAT && SDK_INT <= M); - collector.addResult(context.getString(R.string.self_check_name_system_supported), - isSupported ? Result.Positive : Result.Unknown, context.getString(R.string.self_check_resolution_system_supported)); - return isSupported; - } - - private boolean checkSystemIsConfigured(Context context, ResultCollector collector) { - // 2.3+ com.android.internal.R.string.config_networkLocationProvider - // 4.1+ com.android.internal.R.string.config_networkLocationProviderPackageName - // 4.2+ com.android.internal.R.array.config_locationProviderPackageNames - // 4.3+ com.android.internal.R.array.config_locationProviderPackageNames / - // com.android.internal.R.string.config_networkLocationProviderPackageName / - // com.android.internal.R.bool.config_enableNetworkLocationOverlay - boolean systemMatchesPackage = false; - if (SDK_INT < JELLY_BEAN) { - systemMatchesPackage |= context.getPackageName().equals(getResourceString(context, CONFIG_NL_PROVIDER)); - } else { - boolean overlay = getResourceBool(context, CONFIG_ENABLE_NL_OVERLAY); - if (SDK_INT < JELLY_BEAN_MR1 || (SDK_INT > JELLY_BEAN_MR1 && !overlay)) { - systemMatchesPackage |= context.getPackageName().equals(getResourceString(context, CONFIG_NL_PROVIDER_PACKAGE_NAME)); - } - if (SDK_INT == JELLY_BEAN_MR1 || (SDK_INT > JELLY_BEAN_MR1 && overlay)) { - systemMatchesPackage |= Arrays.asList(getResourceArray(context, CONFIG_NL_PROVIDER_PACKAGE_NAMES)).contains(context.getPackageName()); - } - } - collector.addResult(context.getString(R.string.self_check_name_nlp_package_name), - systemMatchesPackage ? Result.Positive : Result.Negative, context.getString(R.string.self_check_resolution_nlp_package_name)); - return systemMatchesPackage; - } - - private String[] getResourceArray(Context context, String identifier) { - try { - int resId = context.getResources().getIdentifier(identifier, "array", "android"); - if (resId == 0) - resId = context.getResources().getIdentifier(identifier, "array", "com.android.internal"); - return context.getResources().getStringArray(resId); - } catch (Exception e) { - return new String[0]; - } - } - - private boolean getResourceBool(Context context, String identifier) { - try { - int resId = context.getResources().getIdentifier(identifier, "bool", "android"); - if (resId == 0) - resId = context.getResources().getIdentifier(identifier, "bool", "com.android.internal"); - return context.getResources().getBoolean(resId); - } catch (Exception e) { - return false; - } - } - - private String getResourceString(Context context, String identifier) { - try { - int resId = context.getResources().getIdentifier(identifier, "string", "android"); - if (resId == 0) - resId = context.getResources().getIdentifier(identifier, "string", "com.android.internal"); - return context.getString(resId); - } catch (Exception e) { - return null; - } - } -} diff --git a/unifiednlp-base/src/main/java/org/microg/tools/selfcheck/NlpStatusChecks.java b/unifiednlp-base/src/main/java/org/microg/tools/selfcheck/NlpStatusChecks.java deleted file mode 100644 index dbe5c2c..0000000 --- a/unifiednlp-base/src/main/java/org/microg/tools/selfcheck/NlpStatusChecks.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * 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 org.microg.tools.selfcheck; - -import android.content.Context; -import android.location.Geocoder; -import android.location.Location; -import android.location.LocationListener; -import android.location.LocationManager; -import android.os.Bundle; -import android.text.TextUtils; - -import org.microg.nlp.Preferences; -import org.microg.nlp.R; -import org.microg.nlp.location.AbstractLocationService; - -import java.io.IOException; -import java.util.Locale; -import java.util.concurrent.atomic.AtomicBoolean; - -import static android.content.Context.LOCATION_SERVICE; -import static android.location.LocationManager.NETWORK_PROVIDER; -import static org.microg.nlp.api.Constants.LOCATION_EXTRA_BACKEND_COMPONENT; -import static org.microg.tools.selfcheck.SelfCheckGroup.Result.Negative; -import static org.microg.tools.selfcheck.SelfCheckGroup.Result.Positive; -import static org.microg.tools.selfcheck.SelfCheckGroup.Result.Unknown; - -public class NlpStatusChecks implements SelfCheckGroup { - private Location mLastLocation; - - @Override - public String getGroupName(Context context) { - return context.getString(R.string.self_check_cat_nlp_status); - } - - @Override - public void doChecks(Context context, ResultCollector collector) { - providerWasBound(context, collector); - isLocationProviderSetUp(context, collector); - if (isNetworkLocationEnabled(context, collector)) { - isProvidingLastLocation(context, collector); - isProvidingLocation(context, collector); - isGeocoderProvideAddress(context, collector); - } - } - - private boolean providerWasBound(Context context, ResultCollector collector) { - collector.addResult(context.getString(R.string.self_check_name_nlp_bound), - AbstractLocationService.WAS_BOUND ? Positive : Negative, context.getString(R.string.self_check_resolution_nlp_bound)); - return AbstractLocationService.WAS_BOUND; - } - - private boolean isLocationProviderSetUp(Context context, ResultCollector collector) { - boolean setupLocationProvider = !TextUtils.isEmpty(new Preferences(context).getLocationBackends()); - collector.addResult(context.getString(R.string.self_check_name_nlp_setup), - setupLocationProvider ? Positive : Negative, context.getString(R.string.self_check_resolution_nlp_setup)); - return setupLocationProvider; - } - - private boolean isNetworkLocationEnabled(Context context, ResultCollector collector) { - LocationManager locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE); - boolean networkEnabled = locationManager.getProviders(true).contains(NETWORK_PROVIDER); - collector.addResult(context.getString(R.string.self_check_name_network_enabled), - networkEnabled ? Positive : Negative, context.getString(R.string.self_check_resolution_network_enabled)); - return networkEnabled; - } - - private boolean isProvidingLastLocation(Context context, ResultCollector collector) { - LocationManager locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE); - try { - Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); - boolean hasKnown = location != null && location.getExtras() != null && - location.getExtras().containsKey(LOCATION_EXTRA_BACKEND_COMPONENT); - collector.addResult(context.getString(R.string.self_check_name_last_location), - hasKnown ? Positive : Unknown, context.getString(R.string.self_check_resolution_last_location)); - - if (hasKnown) { - mLastLocation = location; - } - - return hasKnown; - } catch (SecurityException e) { - collector.addResult(context.getString(R.string.self_check_name_last_location), Unknown, context.getString(R.string.self_check_loc_perm_missing)); - return false; - } - } - - private void isProvidingLocation(final Context context, final ResultCollector collector) { - final AtomicBoolean result = new AtomicBoolean(false); - LocationManager locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE); - new Thread(new Runnable() { - @Override - public void run() { - synchronized (result) { - try { - result.wait(10000); - } catch (InterruptedException e) { - } - collector.addResult(context.getString(R.string.self_check_name_nlp_is_providing), - result.get() ? Positive : Unknown, - context.getString(R.string.self_check_resolution_nlp_is_providing)); - } - } - }).start(); - try { - locationManager.requestSingleUpdate(NETWORK_PROVIDER, new LocationListener() { - @Override - public void onLocationChanged(Location location) { - synchronized (result) { - result.set(location != null && location.getExtras() != null && - location.getExtras().containsKey(LOCATION_EXTRA_BACKEND_COMPONENT)); - result.notifyAll(); - mLastLocation = location; - } - } - - @Override - public void onStatusChanged(String provider, int status, Bundle extras) { - } - - @Override - public void onProviderEnabled(String provider) { - } - - @Override - public void onProviderDisabled(String provider) { - } - }, null); - } catch (SecurityException e) { - collector.addResult(context.getString(R.string.self_check_name_last_location), Unknown, context.getString(R.string.self_check_loc_perm_missing)); - } - } - - private void isGeocoderProvideAddress(final Context context, final ResultCollector collector) { - if (mLastLocation == null) { - collector.addResult( - context.getString(R.string.self_check_geocoder_no_location), - Negative, - context.getString(R.string.self_check_geocoder_verify_backend)); - return; - } - - final AtomicBoolean result = new AtomicBoolean(false); - final AtomicBoolean timeout = new AtomicBoolean(true); - - final Geocoder geocoder = new Geocoder(context, Locale.getDefault()); - - new Thread(new Runnable() { - @Override - public void run() { - synchronized (result) { - try { - result.wait(10000); - } catch (InterruptedException ignored) { - } - - if (timeout.get()) { - collector.addResult( - context.getString(R.string.self_check_name_nlp_geocoder_is_providing_addresses), - Unknown, - context.getString(R.string.self_check_resolution_nlp_geocoder_no_address_timeout)); - } else { - collector.addResult( - context.getString(R.string.self_check_name_nlp_geocoder_is_providing_addresses), - result.get() ? Positive : Negative, - context.getString(R.string.self_check_resolution_nlp_geocoder_no_address)); - } - } - } - }).start(); - - // Threaded Geocoder Request - new Thread(new Runnable() { - @Override - public void run() { - synchronized (result) { - try { - geocoder.getFromLocation( - mLastLocation.getLatitude(), - mLastLocation.getLongitude(), - 1); - result.set(true); - } catch (IOException e) { - result.set(false); - } - timeout.set(false); - result.notifyAll(); - } - } - }).start(); - } -} diff --git a/unifiednlp-base/src/main/res/drawable-hdpi/info.png b/unifiednlp-base/src/main/res/drawable-hdpi/info.png deleted file mode 100644 index 08073300b3b69de5ca440a4249ce8990157e047d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616 zcmV-u0+;=XP)vJvXMh(iz%{S|bOKF4wc;kA3rH&+ zY4ZY1`z(_WFk70_3t&Xmkx8wM0+*VPO~0UKG)LP&xeq@Tz^>+N%BzzBEln#x@i$Um z46F)&d7#hBZ8{UiyDnf7z>?yG3#fhJHv^QJ02&uYS3sqU{=CqichRi^ZiN0=A=G*y zCdGOIcna|I@dzx6^@Lj~^k_FKVh|(_Oe&5W-o7glr`<_;O(?Ege6rFaPRc1|%|hO{ z2uS*FlN)+U8ibrNbe<5m>p-y^oeDYTr1&h3()1(f<(A2h<-1MJDP_M-I-mz3*IJBQ zC**r4K&M~SQ_$4-RjulPj)dH65s>tK>;z~>Ysw-Pz?7=TyHLzefR2G%CD#K(761*4 z`n+*Fp**lG)^i4rs~4&QX2m+C+MGb!57W2Icl!~#1}&5=Y$%(2(=jNfYN1TY*2bVv z4vK|F={uXFw4dWEQEg{G(5li@qxP~t`Lp4lLP2jlap0Q(eY&dv0000wMkr;Jj~jRu!NntckYH8&>T3;%$?tS@0~N}oXe{HNA?Kah>x!X z(ANaev$|n6Vle^qscxXd379T^V?!0;HHo=>IEUdrb0OqLM&i6aS}qiC1Vd4NXQ zTQ-{zx=}*oR$_ezmvVE_SVXM7NRvVmf?sGISX zW6yS~0F6Y(4`v+MfymsB-1xa%P$mWq>IK}zx+0MV9@cp6--a(9wW}+T7?a)Q-U=0c zkkZk`nWAGGud%p3Efdg9e69gz4*SdAvWt-pu*#9lM*@5z=h_e9Wmwn>?dK@A<4M6E zN3XxZF>DE`;$0a3fvvf@Xg5xW#(b%rDgiSQNxa8H-?gkZT%wUXyWGD)DVxQYf@h}c u1S;Ba9v`cSHUX77dXQyYMqEL;{lBVzsJ&d zvpP%=Tw)s&7!IGr4yu8v)8;gW4;}z z4|j2r^){Gh*|KaSVz=nc0<0!#UgEc3`P7ot3=Jz>m@R1q$fmD;4#+G5(1+st`>pwSf@(}%%r$7 z+q8q$3M1D<-KzZn^TZj00000NkvXXu0mjfm8H1! diff --git a/unifiednlp-base/src/main/res/drawable-mdpi/settings.png b/unifiednlp-base/src/main/res/drawable-mdpi/settings.png deleted file mode 100644 index c07736c6ffc17f31898450cf0e24ca32748f6eb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 451 zcmV;!0X+VRP)Uq zK~zY`<<`$CMNt$6@ZY^|3h73904XL0lJEj3F_4KUz$ALGjcVkGKCp=n%;E^AC}at&1SB!yaC`>ei)rL#Jm(;+Hy)E+ftDJ94NPb3 z?hgC7L^rxpaGiL=c{nkT_moxbqOAtoj=dD@Ym&dH4dWpQxC_W@MeZZm!Fo4oEeP7m zz-|ZF)jV|&`o1#+zW!QQ1GoxSb^C`Ss$eXQdsxSS%sfYGEW}bm2n)tu5DUhEQ zpdUB^3<3v$o#HLHKHxSm1N?PtGsdBR`=8Sp~*`tscI&0e65uivP!#!U6s_fmR3^$6B`QX_x7fdeRrSl6Ia(mlVf=72i@S zDIclpjy}>70Jx?M-VPTBW5U5_pd&{D1>n7~A9dL_WgQNuC_x_r09Tat*OJ8Wm@xd2 zV)R2`3$P?|8Ptx!+MaCViK)T7@e_DjBR7>mzvw@UcwCpUk0v3oPxN0!B=A!7_a`x0 z5Ovp`GPv&|2Ivt!=93ux7Dk1L1loj;l_VvkB~rK02rP+yF=Bqj8o8+iW|dQ7EbOU~ zn@ZrF=pTwm;IQbwO+sKw^ve+mlxyUsVj$2_!gm+ajuJq+z8Of2r4c`lmcBNc(R3g$6C@V5cDs`gM+{A20-+;Xt?m7p}reVkY zl%jk$hODw7gst^EawTc;CT^OjL_2VcjHShOm7tQiI}KdKUEIAy<%f}=;;uatuJU@T zY0>3%8x8xwVWXj+m~2FUt diff --git a/unifiednlp-base/src/main/res/drawable-xhdpi/settings.png b/unifiednlp-base/src/main/res/drawable-xhdpi/settings.png deleted file mode 100644 index 008d7ec800293bc0d9c74e4f24bebaca95981923..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 725 zcmV;`0xJE9P)^Ykl9@d$0Z7O${~FkQe6Q z9x5?$p{N2@1dy-bb)H4*a?G_MaNcS(6j4A+f|@O}SwNE2`u_!lU>9CQ-DCSd#v5@G z-vSSD1w+_B$p>u5WxPa3R`T=ks;YQD4x%1=F`R&Sbv(vqEXFZBuNr@bQWgPSQxqS` zKzw41qCCa;;k4ve;d@Rbv&1JXOC#W70mzTXxuoRVFjgP|zp*Kar+H8y^5bzgRKT8$ zg+8M$xIOh9MS zgM6kys~ik4;CT$EYoMl7aY0^pWOb zH?CEElrq+2HB}waZFmVgC$S@)k^N1wE&8JW%hhPc2|SE!%#5Ks;oE58UZ)2V%pEME zfWc`JJEH=|X7dV^6YTBW1e9_<$Y*gNX3kL5VQQ$Mh8*x0sATl(fJm^<00000NkvXX Hu0mjfo>V|a diff --git a/unifiednlp-base/src/main/res/drawable-xxhdpi/info.png b/unifiednlp-base/src/main/res/drawable-xxhdpi/info.png deleted file mode 100644 index 53313c893bf65c1f425d81f921bda1cc5d0ec2a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1064 zcmV+@1lRkCP)O)5>nNEL#?2Whp^o{Q-wH4n^YKArQ-^Uj$$XWp3?JUl!+JUm>* zk~G-N2X+D5fi0@62MU1Y>Tf21ao_{+8t4aJ0)4<_Ha>`zKqJrti~+MT%P-&&a0IBx z24QM|PW9Ah4VOuvLybn~up8*LAc|Ca)WgVltO42*6lP&*11d9BoCCmc8pW9_pMZu; z5+(;Y4@^hs#0bz190&FT8-el#WuyA-gqmwcBD6mZoKxJ=iUOc3BUD77CS(i2yEr zigO~!1?~nAdaEMkq_6`R4B*t2)SPrFfXF>yMH*bb0_YClcEL7@LjeS?rFrGZ0h%=Y zW`Kh>gFxLmI30!t~v?=>Y(ou&hq4cV|I5Wp2p`$k4lhtT+t!RXkg zKxLYUyFJy$*8+cp#*Z0vVVeS>Qk})x{|&58rQxHR#IwX9fy#hyf{jKSlXH`UyPVfe zPu7K+B(TOofuzM|JZ?hWAT&6fArW&_ELBnTVtuOD{gZ@hp}yDf{E!r8H11R#N1)9@ zeIM>Z;=akGK>ZF2Byq3OZGK5uC)5vEAU>yq}RoH zmPU}xKyeQF$ouD!N03K=KtF`~Vu$-HxzhJI0{s-~%N-V|JmO%`3N#coW^e!!_m6P| zdJ{EfZ~#?NV>_KduY~$N4hvLkGWbn0SxsV@kCm)u%63N*0>#?y(7D(c@Lc%qu!HU; zaek&miUq&r8h{Foo1Jz@pfeixN;$5}=GQ)VOc>aP{Mz}d0|GT8zkc3oYKTe)0bG9d zeBa~>uv24b5cdu*Ok?2$+zqnl_)Cioqm^XO0jgEDjMuAqM>5_{8qXyw+npMIQ@}pk zB>W-H0Qh6TA&>_=Ao#vSt4)9B-_ey;O`JAYy4A#;DEw7~5b&2-LJ~J|9cumvDtpteE>3@ z0A&0J&_zR8ybhohxG$pK9ua-#X#U=i2uYr}XGp5l;uUoqF zL}MMMUPzehefPR<88Wj3ya_ONDsL;J6FA?*Ithqvk z9!g!#eTz&b&9+IJ>(Jogour4ICUesHlJ#F`03`d&5|e=PB4S*`9z%Wm^18#A#%$6$jQ0{WiRiGPA8Ihx% zbPW^-fCIYV?7{g=EM2x5Vc;f_vpXdUdicfS1&kpNUUEb-O@)_!@uPcEHqh+jbjKgy zvX>0Q!)cH(3j=4|0_w&8Dc3M?$SKd`q+`H&1EE6)@LbFb5V^HciJ2>RAH~E!;&y^= z$G^uuVPLmc!qq;8)2gZ)w)havn9AtBL`-GP~p>INx-nUqj--egLHHmRVhr z2F4Aqe#1a_l6AY$cuz41yutadVC|&+R*guF>V$KPe^=@@iQseCp}zK;t~GIbOSAYq z-ffYkz!eRXd@qr^*YSegToL5Po_w^KN}5G4lAn?|;aICET$likBsok1z;@u8fMfjs zX0qCWnoCc{Wct4vT~p*4Qx?!CB9{lesMF7YqJLMgJxJpV`W{fH1*Go<2Qhd6n2tT@ zt!cA?6aWeUhk-4U?S@49w+kyPD=RB2t0eRn_C6Vrs;uxL00000NkvXXu0mjfFKF~^ diff --git a/unifiednlp-base/src/main/res/drawable-xxxhdpi/info.png b/unifiednlp-base/src/main/res/drawable-xxxhdpi/info.png deleted file mode 100644 index 3c4f84f1aef57f67e5a02a51b7057454bcfec8b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1526 zcmV&ehT077RECeo=1~4UU5;y@I298J@ z0L}yfbXWjf3v>dTfb~F)<=>nE4geoZ`wTc6=H9u3U^DO2h_XxK_qZ>Hpk>lsLUxZ`fumafUvE%2reL!1L zoPV=~ft8%KGr~Q$VQ3BTIPfq~ZSi+b0iOcjNnAe+j7i-8xBRA7a)PD6<&rb31~vlC z7JbhGyMZ1FXLEyvzuOD~-SYtUzs(`h?gTPl7eD?n<>GK|qz?T^lK8WkK)_ zoxgzS?U89ZZg9vU3jvTN#o|Rp-|zjDIwR|3O&_0I*BJ;c6Ehzn~cX4J8m@nPL_^ zpLD0Sz^I|qr&9`pvlam0IRl5&Nr$92Dhyvkd2pq|A6?ocLxU}b=l${zx-9q>_}bEE zu>>%s*>6%lm~6g2sg9Ns9mzP~bX!|O0oECOG9$jTMi=Jo*fO3nt^$5F_-0EIOVCQg z^UqU^K72w&Y`5{9N`MZ-^FhjsK}+AM1ZX!rA1<)~!?rU(vvX(K+c}cK)HkioY2mQp zc}o&Apx*HObcttx$@WD_2w?gn6D1a4!d3tc{xXDGwJ96z!(PxF>I_`|Oezz$S(5`S z1xRI@saaU0`%r`c5T)Dbrn5 zVgXFHC$dem$q?&~CKS%*Ef1(6x-NS@E}cnqAS>s+LMFbm*WL#I>N6~@Sm0Bx8r z@IB+A-|N|r(VqJ78kuV~+K za$2-+4h=+af#THR>;o>#kaGvoS2f~r9w40y=@*1hxYYxM(#0Mi6z`5f&}B&Hs(k$@ z(YuGa&r>ayb-9U9zWzVh7&F4~r5%?chu8g8;_;rTL$;Z3C7_?7u{QHzs+(n1qkH`J8P)KtMo1KtMo1 cKtTEM58s|*7+b-c0ssI207*qoM6N<$f~HEh-2eap diff --git a/unifiednlp-base/src/main/res/drawable-xxxhdpi/settings.png b/unifiednlp-base/src/main/res/drawable-xxxhdpi/settings.png deleted file mode 100644 index 7f4788a0615786c0c0a1f43ddd5124f0fde754a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1419 zcmV;61$6p}P)ZCfAwNfuubt9TcHxEVj`MGQ)7H2h*6^r(HO-?!h*OUQEOajOx$21 zTi<9jB)SlzI|N@FD2nkBAtIMxP_Pw&BGh+_m0A~buBnap-tYV7+3WcyXZg)NbN**$ z&YUwd7ZeJGLZMJ76bgkR9rOZ&z=Wmj1TIl?=0gei(Sh+R@=~fDJt0xO<^gRE+iOz- z@?oLl_AXQc^5J~P?R5b&lz?~yGy~@<0r3a`xIhVrOTa=UARA@@b9Ds7!vdg5M?hmu zKRN;uFw~jAsg0UCm=C-RYyj>DS_`(b7})MG1u<2g0A?4|Z4U6D^zjYZTO@%wz|fSA z{tB!C7G-Rs2l&*Z;U~*MagyeYx?Kgl3XD!^XRD{RDmR|2)8T$#8E|5ii03I_Jdp7x z%UmaGr8yuF$X04K*JU_*fp{|S5$ z$?I!POXY&!J{HUPy$KmGri=icp^ZNi*rUe(M_vm}z(Z>Ef5~66rUk+2xGfhpihLew zWBZ&MyQ(brZTv;RaW!;R*$s$*df)6Z4>Xs+=m0)++>wm|^nTZ| z&TD0#6a_PZ=N)$D(f~U5IMQ_-c$7p6^Dd^O9Rc+%Tk1LtT<<~=SE15+*(=z#5el}y zwFP)TB?54;2yF^TfbDNNi*{TR&~Ewt{(uAwT7G{UuoI5ny{j zX@cp4(G&?7bFi-ng>x*wKbRr`M~-2UHE5fi}cM7(t~OB8UK*xDRGZ`U=A!&JX#;0^7-$7niw^4ZWe z6uTIxKHjhbIEI!a>+O>EDh#t%;BE9t#&00?Dk*Ftj`K@v^aWf{RTuCd>6Io0eM-wZVfy*R9 za)Pz!q1!xR=@qUSJq!3*jhji<<%w>x;&(~jEkRKWBQg#C;-m4CfPL!WHD#4=hHqCR zSCv7@k$FeI8avJ{$qKqj>#c_rTBBk`D)VO-@FwO7vs&I>53^-R`>a+iw^;i+Wv9DQ9Ht@B=8=Fs zsdYBRmveu@RKk4VD`_)aSf#-AhMy903~30V1b7SXgI}=raA)lVIIC{c<)b@ zfN|g(C7`h)AtfLu`W?14hIynTIW#3qKnb`9bHK^QQARQU39wCL8-+rlP$(1%g+h@6 Z{sx+X@531YGSUD5002ovPDHLkV1nRAgeU+2 diff --git a/unifiednlp-base/src/main/res/drawable/location_marker.xml b/unifiednlp-base/src/main/res/drawable/location_marker.xml deleted file mode 100644 index 3910266..0000000 --- a/unifiednlp-base/src/main/res/drawable/location_marker.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - \ No newline at end of file diff --git a/unifiednlp-base/src/main/res/layout/backend_list_entry.xml b/unifiednlp-base/src/main/res/layout/backend_list_entry.xml deleted file mode 100644 index 154e864..0000000 --- a/unifiednlp-base/src/main/res/layout/backend_list_entry.xml +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/unifiednlp-base/src/main/res/mipmap-hdpi/ic_nlp_app.png b/unifiednlp-base/src/main/res/mipmap-hdpi/ic_nlp_app.png deleted file mode 100644 index 86a29e735f8672ce144216443b5b98eb9f350f3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2585 zcmV+!3g-2RP)ip3>Ubt8*aHckLMOx!;sfI&b!rpafI*jKXn5T%rr)AjAAG*>%F2%&PV zk_AL5(G5F)r;=5o2dW4GJer69!x#Bz=ppFGc(0hmK6?Ml8W+O0td zF}Pf=lXknE-FQCI=g3wk0;DH|1bjZ<5~I<0v>T2=yY436GLGZAyk4)NuCDIU+}zy1 zQA!1$qb*4R3VJ-A*UV<~i#*Q<2qF69o1y6%fnYGGZ)j-v_1LjvpQDuOk_E(HyLN3y zdV2asO6eU3i21}+bMfNEwmd5 zQi^01gx1#99S( zhRtZ~&m<-&NRxm9{B<;6*^LhON%#Y;Y`7+Xc6giYh}uwl{zu<28#Ds2IB`6_U!`2_@d zS3)Hu0wh*=aQFzk>70Z6vhGQRnzRF`!*d*UEw6%7>1SR!K#a<$G&}x0>mkg%cXVGN zX#vlw1-Lnu{tc|4$oVHi6gW60!e*90p5iRjVmO>D$+xxfLNVb!$;yT za~9&R4E8MDt4n=AmztkPhv$^y)+Ymq87-VN9Z!wV$Kb((75_#=L3IK7{Ehg$X%(Ar zQQY`s0cDykD1Z1dIE<#=KvEY_{a3Hx>WxxGa5!RyNuPt0Z4+^@(T;z&U4}QHYS^^&H`Ml2nqqfX+26Mj+TB3&>`gk0It&(2=1+SvHx~alCkph2>Ax(lcW$RB9I`NnU9$jr*7nZAik>yHpx69~Z(FBX`a&z!)4x@t*> zZ3ZJQd}}rAhMNOOg^<(()b2Wh#>+pKbWF$DF(Q2jI1;+!k#NL{SGxR|R(udwJAIP2 zK3KQ{Qye!H$O_x-b~z=f2k6TyJ8}8y0m%khjWaRS`eH&jBCsb;{R>CFsFSp{Z}vl2 zlJ&J1$TE=B19YwSRowV;zob)!jFm9l{ajq-M5^iUM~~yX z4f?h-(me?w@J-kPU(RMw&U8}&T|w}>k0G%87+bNDw87m!3dVg;%fg8RNnJoVG7D%{ z_8i8ik4D$4d%ly0fR%U9ZJF~s*Dg~)z#H|oKB~D>tf#WLRijiRivV1 z02!ZM0^Pd#y@ewvh%G%=RaL1A2%cu}hi8GiQ7;QgDIjiCCQJvn05(%^lp{hFm!4Gy z#B$Nu9k8Abja8&BrGSh-TM6BAXJ6oibCCK95}M*g@bH7swM+MCN&x9{vtio*44{wQ zQyT9PBl?C!lo1qEQ&Y2N%9JVU@1+8cu#-dV#WVv5?G>OUOF`UCaUn?o;_e;{ z^ShgY%$_ray-<#ryEF)h?ZLh94s0KqS0kP2f)%T&BpVtFyAK-+Ow5CE#^v-{5 z9gMYmVpNm}km0czF#Pz@RKn3VAh;XA7e4~->gPS2jt7VvI|AmtPXg(o`5t!lQ8}WS z@IX;JIVb{$yP*uW(xrf(ZF~=1(SV4}2-EIO;PRwr3njYpxInuhhX;z91jHKIdFC~k zK6xb}Amj7PpkFI&@K2?3dL(H!P}D3S1UeD;@Vn4|@y{3q=@;a}RP+R>E_P8dUYPYF z^uoPZK|z7~1I3t(EQVEkBP_?3fxCJ>9Aez~kubfr5yTOiXirhjiMA8YL7E06aKZyc7GjzQ#6Wl(O2Pl82*DNG!QFpvf5Tz+!%6zK z0K{7Cy8J)D78)t{qjJP(zx@CSkX)`?0q6Eqka%m|?wezyUQDGbRiKch*|JYxLhN@A zhl3sTxaFsP7^HrL6Hd~Vm6d-gC@5g(QF?V&W2eL6U}J<^4v5LX*ny#mzI((?MSVZ)wL^FW;lDV1=#sS5|{Dk>`eFk{AyCwm3x)TvXCPn|k- zuebsbPx6TdfT{f4>-9=1DcN3+!QeP9;C8$9#l^*&)~s2xtF*Kf^XAP{e4vgU>Saf$ zht}8E7iVQetP3a8WgFn|_HDIf2T2IP)~+m|j~ zn!jz^wl}l0v+uK7t&Dt9j-|4&&lkI$CfU$qH<`h%t*t$`b?eq=i;IiT78Vv>FDxvK zdyqu(&jA)KT4X9IDal~Rw~C627UksRh8a?V7-DMIq^FsWg>yb zD<2311e-k16OQAk_$vMmd)4W5LYZJNNZ9-CR|bIddcB=BH8r1Y*|Mbsz*l3&jA^f} zt?f*7Bjx@*flQx1-CSN?&bFemtzc}gtz4Z{il#qoF?fCe*R!&+t~WI`F-AbGrG~DqF7;w81-J|b1IsmC7K_DGR#p~!sxRs{6ak8;lWh4ExYREu6!$iF vio^XvQ5Zh-o8>#i@Bkp08#w?-2GIWjZwi&Nd}n3w00000NkvXXu0mjfQqbfr diff --git a/unifiednlp-base/src/main/res/mipmap-hdpi/ic_nlp_settings.png b/unifiednlp-base/src/main/res/mipmap-hdpi/ic_nlp_settings.png deleted file mode 100644 index c08d3f65f432c63598184b839b7d707db39201fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4324 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 SRGK0H0000XZM&hbe7$n+3gl~T9~(;{btVp zcfQLxb3TG6{31`denbUej0r$=n-Q1*MhNjm8b=p^F-G|Vgb@D-2pn>VXnHgN+*lRP z7#jz`3V;nciZKRUpF{}h;ja(YrVbYZpc*j75&`UFj4c5m8lx@dx5|vMBb3q&gb-Ia zgf4(A%eyG0m5hzn#B1UD`}_B%rKNFABsjDK06bxNvhc9+`F!UIAsLJ@4R$N@%rD|33RApt1iG&c@;c(b&HrokGX&L~Y{k#&5=H(-V2u`Q7 zuerH-c3D}OL)EGa(AwH+%g@h0PAN@)+yELI8)ui7m&XL~$R4=oxrPC62Y$Pijp^ev z@oXxekB7Pf9xxn0a-YM^o^RoFp95naC36bwZ$Y3GQ&Yxb?3hICcx4_6Gbap(WF!C> zuH5Hj5SNJIkQ57ZRT!_r*aP!Pre40tZ%{I&O^E)&rJ(#>OV?2UJkWl2O@ z8n4>AmvI0WZ?1-O;Ee95ga|MRlTpz+7iar=;PdP63pY&5NA(LY@r@%=Q&aWcWfTCz z-yN?3kTrvvMH|K^u7gOQR)k%++lP;jx8U@D-5T4xlr*%JF5^2jOoUV%y0u|06D~*^j z2{Vvs-5MfZ1zFruk3Vi**F00dpbRf(W(V$b`{d+g^|vtq?4MomA6u&tBWKKoRB|Xp zjQXR0?Ou4=IyBFu?^}a}8M(^+V6P2A7z2QtzXLzLu1&fGEBY4w1^<|wP%qrR3-6LI z!6dgfXX-bBOdO}{wWOpZg8=+K_zye->bjxzLgs8p#e3klWZj?D9w+2ae}KQeQ=2o{ z=`c5L0qBE#3HAct;wL2~DZA0Q?}gm<3Yf1P)GedTlnObs1b6D@!{6Qk+#S%h6BZZ1 z^!YN~kQ)S1Jir)>KLF0`1X?%hFF%8KZ-4PY)c?)A;dkv0ql1B?3F85#`k+bI`s{#Cq9Wd z%h3Q#TbDv8E7VQipo*k~kYNCjCHM~)fZn;F3lRx`=1qX*@OmKO!J$Xk%m>y19zv2N z8RG#yigacltgV&90x)f_fcWODXvwSQh2jB20pRyS{&7CU+s8BzdL9r8@?iOH4cK7m zj4<1^gm`YER3YvGLjm|m z_u6;Bab0nEM6b1S5<(3P4MSI< zwzjq@GiT0hjpy+?hZsiL4EIzZgqoU~N|rBQelF7Sy3*jNtE-z>T3UKq6vc6Vzdvpb z4wuXIFd@VfM-~LZ)Z5$Jvw#2o!s_bk&f3~qp}f3Y>0Iiym`s;0UHX2~q)Fuo2?@Nh z7BYL9&CW1x3=BN@DvQM<>Q=+!@xbA594Ra;Trt=+3Y?PZ0g$4iqA4{sHQRD?bLWVn z$Uo>*`Luh;AA?Ckurs;X*pdwcu&K`r_K`~`zuKr?`>g$ox> z&dJHK%Ca1IfV0E{B+@$wA%T7zA%u2ybxC%+ou3Bq-k3YQcO9|OU0GQv?Af!&^f>g$ zR;^m)*}Z!=FQ=LV)~K_|lO-b~!_XNY%A4KY-AqkbJ=;+gHOo002ovPDHLkV1h?XE2{ti diff --git a/unifiednlp-base/src/main/res/mipmap-mdpi/ic_nlp_settings.png b/unifiednlp-base/src/main/res/mipmap-mdpi/ic_nlp_settings.png deleted file mode 100644 index 6d3adc6fda936dd55229ac563e92b2f1c24ab942..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2462 zcmV;P31Rk$P)`NO-$t(IfjbiH2fl6<+u9`)->G_~ig`+%XWj zjGA-x4QGueJb)(AFz4zU&H~hE?pDewR}fn#Hcq@e?H{8(CpJ#J9I(p4xEw(&fK}mC z&7wqatZ=Gk5dsh>^;hw$Yyc9Lb7oMYED6gwlMw*NwTc3Wd{h{5HBF>3V~k1rKVW04 ziKTN@6C>VAM05r%;`kLyy#=#SM9^x!_qX@jHI)m+i0ionD_8#g<@+jck-RG2j@(R}e`ixN&vvk~L?1If0Pi|<(s z1cgAv0!VB2{MobX&u{wiem~=g!hjAw>g(?OWp(X@dCmznEx|D+LrZ~sbYS^l-@zAZ z8%|k)vd+;NUS$ikzp<&YeZz(x!rGB1Y#{&&aBlp~?{=6(<+*XpjVPp88qcL$Bx4q% zC0_EwCmy)#2Y?$_H}cYG+I8k$*D_O_c;SI~hQ?rw!Dx-vnji=Wf&i^GMr({Q`M?U% zO7A(9=gz&ZWhP+7)s46y79deSW%^5cEUsY;+8A`;6Zk%kZ85DejO%^-58(O%mTjXf z8zmIANaoT8>ZeS9378B7LO5V0wn|5Sn!Q}GvK+oDRHY?>WrQpc^ zj>rG{r^j9+Cx|n}G=xz;^!yV`m+suL?J8S}tH=OG8%~?jnDu>Me?O}?ZpPK%YFNE- zGkyL2S!cd;>SO}n#q+$P!rP+t&K=vXdVa;yr9hIfYUcxpB3lDPz~Qay*KA$0e9279 zOZBAFccG`Uq9TiF&%s0Zfks3S5&S^YbMR2snW~BkjDf)S@mw#KuH~hA)+}E#bL;vw zTYR8cs*F~b@)13gKgk4{LmG%7@)2DL!}oPX}wS-%-dCi$wP3p>MdI`HuUJCO+KhH~~tPoCxr z0*F8u5eWbvh*T2;LBgyeO89iomz;OjnZsL_rI7Rw@bm9%YposMuq801-5dy@ESr7Zy=-fLzu>vo-+G6AT?eo%tE4_o2RxB=5+#hx>Sb{U$6s zL70|HY^OsIBx+7*z2fFOE+xmE^19J#<(y}Z<+4Bor4)m%&*RU$NDu_WTYeDm=&I)! zOnE3PefwDY(m~i$RV(MbT$ytL$WzM}t+2%CQZK2p!$DAXg1!5Dd3N2a!$hB1`!Zj2 zbfat=M8-_l0E$3AwQSLfT=cnhKm%UyzI|=urcS%R;EpqChhjN7WGe+Q8q|K6|ASm8BF5Ly$cB`3JARa_!Lr-@IT^f+9t*949Y;ZBZl- z9az0{$Cml{sXbPXk(9F7wC;s@z(6EZUhovX*aB+j-FW-m<0du!${6E)+q?h8zpQ#< z8H0m^5kb45p`q^5Yg(SPYpTDeO>wIjWANP+g2ANRPhWj*<$~_+?n8uDPf%T5J?EP1 zZ>_DHI9G&3e^1Zy7yr0yG2tu_d$CpYYLPIYPXubB&n}@UQ-pJa1ylpI*DqZ9UZ7NE zQ3MeP@!aH-i|?5c2{xEPt0Lm*5c>K6VLLrUfvd%0?X+fOgd2>u0z%EFFPK#H8SSTf zaH>un4SGiep# zS4_roydyI}@XZ%{Umf*iw4$?l_ngPF$_8Nj#Ikz|g7_-$5oVP`guz;H)-9QTIbU=Gm4vAPx#07*qoM6N<$f-11G3IG5A diff --git a/unifiednlp-base/src/main/res/mipmap-xhdpi/ic_nlp_app.png b/unifiednlp-base/src/main/res/mipmap-xhdpi/ic_nlp_app.png deleted file mode 100644 index cd30228416d101a0fad468a44d8f3d9e515929c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3496 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 Vtu9q*8Up|T002ovPDHLkV1jmvRl)!O diff --git a/unifiednlp-base/src/main/res/mipmap-xxhdpi/ic_nlp_app.png b/unifiednlp-base/src/main/res/mipmap-xxhdpi/ic_nlp_app.png deleted file mode 100644 index 7296a1c3e80a98ab06ad2f2d55ca277ffc797297..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5531 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 OFD1EmvehzXq5lI?5*zmb diff --git a/unifiednlp-base/src/main/res/values-de/strings.xml b/unifiednlp-base/src/main/res/values-de/strings.xml deleted file mode 100644 index 7a0b3a2..0000000 --- a/unifiednlp-base/src/main/res/values-de/strings.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - UnifiedNlp - UnifiedNlp Einstellungen - Dienst hinzufügen - Ortungsdienste konfigurieren - Adressauflösungsdienste konfigurieren - Funknetz-basierte Ortung - Adressauflösung - Dienste konfigurieren - Aktiviere, deaktiviere und konfiguriere Dienste zur Funknetz-basierten Ortung. - Aktiviere, deaktiviere und konfiguriere Dienste zur Adressauflösung. - Funknetz-basierte Ortung erzwingen - Erzwinge ein bestimmtes Ergebnis bei der Funknetz-basierten Ortung - - Unterstützung für Funknetz-basierte Ortung - Android-Version unterstützt: - Deine Android-Version wird nicht offiziell unterstützt. Das heißt jedoch nicht, dass etwas nicht funktioniert. - System unterstützt Ortungsdienste: - Dein System unterstützt diese Version von UnifiedNlp nicht. Installiere eine andere Version oder nutze ein Xposed-Modul zur Kompatibilität. - - UnifiedNlp Status - UnifiedNlp ist im system registriert: - Das Betriebssystem hat sich nicht mit UnifiedNlp verbunden. Wenn du UnifiedNlp gerade erst installiert hast, probiere dein Gerät neuzustarten. - Ortungsdienst(e) eingerichtet: - Installiere und konfiguriere ein UnifiedNlp Ortungsdienst um Funknetz-basierte Ortung zu nutzen. - UnifiedNlp Ortung erfolgreich: - UnifiedNlp konnte bisher keine Ortung durchführen. Einige Anwendungen könnten dadurch Probleme haben. - UnifiedNlp erneuert die Ortung: - UnifiedNlp hat in den letzten 10 Sekunden keine Ortung durchführen können. - Funknetz-basierte Ortung aktiv: - Entweder ist die Funknetz-basierte Ortung (in den System-Einstellungen) deaktiviert oder dein System unterstützt dies nicht. - Die Berechtigung zum Zugriff auf den Ort wurde nicht gestattet. - - Infos - Über microG UnifiedNlp - Versionsinformationen und genutzte Bibliotheken - - für Systeme ohne Google Apps - für alte Systeme ohne Google Apps - für angepasste Systeme - - UnifiedNlp konnte keine Ortung durchführen um die Adressauflösung zu testen. - Bitte prüfe deinen Ortungsdienst - - Adressauflösung an aktuellem Ort möglich: - Der Adressauflösungsdienst hat zur aktuellen Position keine Adressdaten bereitgestellt. Bitte installiere und konfiguriere einen Adressauflösungsdienst. - Der Adressauflösungsdienst hat binnen 10 Sekunden kein Ergebnis geliefert. - diff --git a/unifiednlp-base/src/main/res/values-eo/strings.xml b/unifiednlp-base/src/main/res/values-eo/strings.xml deleted file mode 100644 index 43dcc07..0000000 --- a/unifiednlp-base/src/main/res/values-eo/strings.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - UnifiedNlp - Agordoj de UnifiedNlp - Aldoni subservon - Agordi pozici-trovajn subservojn - Agordi adres-trovajn subservojn - Ret-bazita pozici-trovado - Adres-elserĉado - Agordi subservojn - -Aktivigu, malaktivigu kaj agordu subservojn por ret-bazita pozici-trovado. - -Aktivigu, malaktivigu kaj agordu subservojn por elserĉado de adresoj. - devigi proksimuman pozicion - Devigas al ret-bazita liverilo de pozicio raporti certan pozicion - - Subteno por ret-bazita liverilo de pozicio - Androida versio subtenata: - Versio de via Androida sistemo ne estas oficiale subtenata. Tio ĉi eĉ ne gravas. - Sistemo subtenas liverilon de pozicio: - Via sistemo ne subtenas tiun ĉi UnifieldNlp pakaĵon. Aŭ instalu kongruan pakaĵon, aŭ kongruigan modulon Xposed. - - Stato de UnifiedNlp - UnifiedNlp estas registrita en sistemo: - La sistemo ne kuniĝis kun servo UnifieldNlp. Se vi ĵus instalis servon UnifieldNlp, provu restartigi la aparaton. - Pozici-trova(j) subservo(j) agordita(j): - Instalu kaj agordu UnifieldNlp pozici-trovan subservon por uzi ret-bazitan pozici-trovadon. - UnifiedNlp trovis pozicion: - UnifiedNlp ne trovis lastatempe pozicion. Tio ĉi kaŭzos problemojn kun iuj programoj. - UnifiedNlp liveras aktualigojn de pozicio: - Neniu UnifieldNlp pozicio estas liverita de sistemo dum lastaj 10 sekundoj. - Ret-bazita pozicio aktiva: - Vi aŭ malaktivigis ret-bazitan pozici-travadon (per sistemaj agordoj), aŭ la sistemo ne estas subtenata. - Pozici-permeso ne estas jam akirita - - Pri - Pri microG UnifiedNlp - Informoj pri versio kaj uzataj bibliotekoj - - por normaj sistemoj sen GAPPS - por malnovaj sistemoj sen GAPPS - por tajloritaj sistemoj - - UnifiedNlp ne konas pozicion por testi adres-trovan subservon - Bonvolu kontroli vian pozici-trovan subservon - - Adres-trova servo liveras adreson el la pozicio: - Ne povas trovi adreson. Bonvolu instali kaj agordi adres-trovan subservon. - Adres-trova subservo ne liveris adreson dum 10 sekundoj. - diff --git a/unifiednlp-base/src/main/res/values-es/strings.xml b/unifiednlp-base/src/main/res/values-es/strings.xml deleted file mode 100644 index 56ac178..0000000 --- a/unifiednlp-base/src/main/res/values-es/strings.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - diff --git a/unifiednlp-base/src/main/res/values-fr/strings.xml b/unifiednlp-base/src/main/res/values-fr/strings.xml deleted file mode 100644 index e0d35b9..0000000 --- a/unifiednlp-base/src/main/res/values-fr/strings.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - UnifiedNlp - Paramètres UnifiedNlp - Ajouter un fournisseur - Configurer les fournisseurs de géolocalisation - Configurer les fournisseurs de géocodage - Géolocalisation réseau - Géocodage - Configurer les fournisseurs - - Activer, désactiver et configurer les fournisseurs de géolocalisation réseau. - - - Activer, désactiver et configurer les fournisseurs de géocodage. - - Forcer une localisation approximative - Forcer la géolocalisation réseau à présenter une certaine position - - Support de la géolocalisation réseau - Version d’Android supportée : - Votre version d’Android n’est pas officiellement supportée. Cela n’a pas forcément d’importance. - Support système de la géolocalisation réseau : - Votre système ne supporte pas ce paquet UnifiedNlp. Installez un paquet adéquat ou un module Xposed de compatibilité. - - Status d’UnifiedNlp - UnifiedNlp est enregistré auprès du système : - Le système n’a pas établi de liaison avec le service UnifiedNlp. Si vous venez juste d’installer UnifiedNlp, vous devriez redémarrer votre terminal. - Fournisseur(s) de localisation configuré(s) : - Installez et configurez un fournisseur de localisation UnifiedNlp afin d’utiliser la géolocalisation réseau. - UnifiedNlp connaît la position : - UnifiedNlp n’a pas de dernière position connue. Cela entraînera un échec de fonctionnement de certaines applications. - UnifiedNlp fournit des mises à jour de la position : - UnifiedNlp n’a pas fourni de position au système dans un intervalle de 10 secondes. - Géolocalisation réseau activée : - Vous avez désactivé la géolocalisation réseau (dans les paramètres systèmes) ou bien votre système n’est pas supporté. - L’autorisation d’accès à la position n’a pas (encore) été accordée. - - À propos - À propos de microG UnifiedNlp - Informations de version et librairies utilisées - - pour systèmes standards sans GAPPS - pour anciens systèmes sans GAPPS - pour systèmes personnalisés - - UnifiedNlp n’a pas de position pour tester le géocodeur. - Veuillez vérifier votre fournisseur de géolocalisation. - - Le géocodeur fournit une résolution d’adresse à partir de la position : - Le géocodeur n’a pas fournit de résolution d’adresse. Veuillez installer et configurer un fournisseur de géocodage. - Le géocodeur n’a pas fournit de résolution d’adresse dans un intervalle de 10 secondes. - diff --git a/unifiednlp-base/src/main/res/values-pl/strings.xml b/unifiednlp-base/src/main/res/values-pl/strings.xml deleted file mode 100644 index 7f3e0eb..0000000 --- a/unifiednlp-base/src/main/res/values-pl/strings.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - UnifiedNlp - Ustawienia UnifiedNlp - Dodaj usługę - Konfiguruj usługi lokalizacyjne - Konfiguruj usługi wyszukiwania adresów - Geolokalizacja oparta o sieć - Wyszukiwanie adresów - Konfiguruj usługi - -Włącz, wyłącz i skonfiguruj usługi geolokalizacji opartej o sieć. - -Włącz, wyłącz i skonfiguruj usługi wyszukiwania adresów. - wymuś przybliżoną lokalizację - Wymuś raportowanie przez dostawcę lokalizacji opartej o sieć - - Wsparcie dla dostawcy lokalizacji opartej o sieć - Wspierana wersja Androida: - Twoja wersja systemu Android nie jest oficjalnie wspierana. W gruncie rzeczy nie ma to znaczenia. - System wspiera dostawcę lokalizacji: - Twój system nie wspiera tej paczki UnifieldNlp. Albo zainstaluj odpowiednią paczkę, albo moduł kompatybilności Xposed. - - Stan UnifiedNlp - UnifiedNlp jest zarejestrowany w systemie: - Usługa UnifieldNlp nie została powiązana z systemem. Jeżeli dopiero co zainstalowałeś UnifildNlp, powinieneś spróbować zrestartować urządzenie. - Usługa lokalizacji skonfigurowana: - Zainstaluj i skonfiguruj usługę dostawcy lokalizacji UnifieldNlp, aby móc korzystać z lokalizacji opartej na sieć. - UnifiedNlp określił lokalizację: - UnifiedNlp nie określił ostatnio lokalizacji. To sprawi problemy w niektórych aplikacjach. - UnifiedNlp dostarcza aktualizacje lokalizacji: - Nie została dostarczona żadna lokalizacja UnifieldNlp przez system w ciągu ostatnich 10 sekund. - Lokalizacja oparta o sieć włączona: - Albo wyłączyłeś lokalizację opartą o sieć (w ustawieniach systemu), albo Twój system nie jest wspierany. - Uprawnienie lokalizacji nie zostało jeszcze przydzielone - - O programie - O microG UnifiedNlp - Informacje o wersji i użytych bibliotekach - - dla nowszych systemów bez GAPPS - dla starszych systemów bez GAPPS - dla dostosowanych systemów - - UnifiedNlp nie dysponuje pozycją, aby sprawdzić usługę wyszukiwania adresów - Proszę skontrolować usługę geolokalizacji - - Usługa wyszukiwania adresów znalazła adres: - Nie można odczytać adresu. Prosimy zainstalować i skonfigurować usługę wyszukiwania adresów. - Usługa wyszukiwania adresów nie dostarczyła adresu w ciągu 10 sekund. - diff --git a/unifiednlp-base/src/main/res/values-ro/strings.xml b/unifiednlp-base/src/main/res/values-ro/strings.xml deleted file mode 100644 index 672930d..0000000 --- a/unifiednlp-base/src/main/res/values-ro/strings.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - Nlp Unificat - Setări Nlp Unificat - Adăugaţi un motor - Configuraţi motoarele de localizare - Configuraţi motoarele de căutare a adreselor - Localizare geografică bazată pe rețea - Căutare adrese - Configuraţi motoarele - - Activaţi, dezactivaţi şi configuraţi motoarele pentru localizare geografică bazată pe rețea. - - - Activaţi, dezactivaţi şi configuraţi motoarele pentru căutarea adreselor. - - impunere locație aproximativă - Se impune furnizorului de locaţie bazată pe reţea să raporteze o anumită locație - - diff --git a/unifiednlp-base/src/main/res/values-ru/strings.xml b/unifiednlp-base/src/main/res/values-ru/strings.xml deleted file mode 100644 index e7afe6b..0000000 --- a/unifiednlp-base/src/main/res/values-ru/strings.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - UnifiedNlp - Настройки UnifiedNlp - Добавить backend-программу - Backend-программы определения местоположения - Backend-программы поиска адреса - Местоположение по сети - Поиск адреса - Настроить backend-программы - - Включить, отключить и настроить программы для определения местоположениея по сети. - - - Включить, отключить и настроить программы для поиска адреса. - - определение приблизительного местоположения - Принудительно использовать сеть для определения местоположения - - Поддержка провайдеров местонахождения по сети - Версия Android поддерживается: - Ваша версия Android официально не поддерживается. Это не обязательно должно что-то значить. - Система поддерживает провайдеров местонахождения: - Ваша система не поддерживает этот UnifiedNlp. Установите совместимый или модуль Xposed. - - Статус UnifiedNlp - UnifiedNlp зарегистрирован в системе: - Не запускаються сервисы UnifiedNlp. Если вы только что установили UnifiedNlp, то перезагрузите устройство. - Backend-программы для местоположения настроены: - Установите и настройте UnifiedNlp backend-программу для использования местоположения по сети. - UnifiedNlp знает ваше местоположение: - UnifiedNlp не знает вашего местоположения. Это может вызвать ошибки в некоторых приложениях. - UnifiedNlp обеспечивает обновление местоположения: - Местоположение не было предоставлено системой в течение 10 секунд. - Местоположение по сети включено: - Отключено нахождение местоположение по сети (в настройках системы) или система не поддерживается. - Разрешение на доступ к местоположению еще не предоставлено. - - О программе - О microG UnifiedNlp - Информация о версии и используемые библиотеки - - для прошивок по умолчанию без GAPPS - для устаревших прошивок без GAPPS - для кастомных прошивок - - UnifiedNlp не имеет местоположения для тестирования геокодера - Пожалуйста, проверьте backend-программы определения местоположения - - Геокодер предоставляет анализ адреса из местоположения: - Геокодер не предоставляет анализ адреса. Пожалуйста, установите и настройте программу-backend для поиска адреса. - >Геокодер не предоставляет анализ адреса в течении 10 секунд. - - diff --git a/unifiednlp-base/src/main/res/values-sr/strings.xml b/unifiednlp-base/src/main/res/values-sr/strings.xml deleted file mode 100644 index ab8f97f..0000000 --- a/unifiednlp-base/src/main/res/values-sr/strings.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - Обједињени МПЛ - Поставке Обједињеног МПЛ - Додај мотор - Поставке мотора за локацију - Поставке мотора за потрагу адреса - Мрежна геолокација - Потрага адресе - Подеси моторе - - Укључење, искључење и подешавање мотора за мрежну геолокацију. - - - Укључење, искључење и подешавање мотора за мрежну потрагу адресе. - - присиљавање приближне локације - Присиљавање мотора за мрежну локацију да пријави одређену локацију - - Подршка за Мрежне Провајдере Локације - Издање Андроида подржано: - Ваше издање Андроида није службено подржано. Ово нужно не мора да значи ништа. - Систем подржава провајдере локације: - Ваш систем не подржава овај пакет Обједињеног МПЛ. Или инсталирајте одговарајући пакет или Xposed модул за компатибилност. - - Стање Обједињеног МПЛ-а - Обједињени МПЛ је регистрован у систему: - Систем се није повезао са услугом Обједињеног МПЛ-а. Ако сте инсталирали Обједињени МПЛ покушајте са рестартом уређаја. - Мотори локације подешени: - Инсталирајте и подесите мотор за Обједињени МПЛ да бисте користили мрежну геолокацију, - Обједињени МПЛ има познату локацију: - Обједињени МПЛ нема последњу познату локацију. Неке апликације ће краховати због овога. - Обједињени МПЛ пружа освежавања локације: - Систем није пружио ниједну локацију Обједињеног МПЛ-а у последњих 10 секунди. - Мрежна локација укључена: - Или сте искључили мрежну локацију (у поставкама система) или систем није подржан. - Дозвола за локацију још није одобрена - - О програму - О микроГ Обједињеном МПЛ-у - Подаци о издању и коришћеним библиотекама - - за преподешене системе без Гуглових апликација - за застареле системе без Гуглових апликација - за прилагођене системе - diff --git a/unifiednlp-base/src/main/res/values-uk/strings.xml b/unifiednlp-base/src/main/res/values-uk/strings.xml deleted file mode 100644 index b33770f..0000000 --- a/unifiednlp-base/src/main/res/values-uk/strings.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - UnifiedNlp - Налаштування UnifiedNlp - Додати сервер - Сконфігурувати сервер позиціювання - Сконфігурувати сервер пошуку адрес - Географічне позиціювання на основі мереж - Пошук адрес - Конфігурація серверів - -Вмикання, вимикання чи конфігурування серверів позиціювання на основі мережі. - -Вмикання, вимикання чи конфігурування серверів для пошуку адрес. - визначення приблизного позиціювання - Примусово використовувати сервер позиціювання на основі мереж для визначення місцеперебування - - Підтримка постачальників позиціювання на основі мереж - Підтримка версії Android: - Ваша версія Android не підтримується офіційно. Проте це ще нічого не означає. - Підтримка постачальників позиціювання системою: - Ваша система не підтримує поточний додаток UnifiedNlp. Встановіть сумісну версію, або ж відповідний Xposed модуль. - - Стан UnifiedNlp - Реєстрація UnifiedNlp в системі: - Система не визначає сервіс UnifiedNlp. Якщо ви щойно встановили UnifiedNlp, спробуйте перезавантажити пристрій. - Налаштування серверу(ів) позиціювання: - Встановіть та сконфігуруйте UnifiedNlp сервери позиціювання для визначення місцеперебування на основі мереж. - Визначення UnifiedNlp місцеперебування: - UnifiedNlp не визначив місцеперебування. Це може викликати проблеми в деяких додатках. - Забезпечення оновленням позиціювання UnifiedNlp: - На протязі 10 секунд не було отримано місцеперебування від системи. - Стан позиціювання на основі мереж: - Вимкнено позиціювання на основі мереж (в системних налаштуваннях) або система не підтримується. - Дозвіл на отримання позиціювання ще не надано - - Про - Про microG UnifiedNlp - Версія та використані бібліотеки - - для типових систем без GAPPS - для застарілих систем без GAPPS - для нетипових систем - - UnifiedNlp не отримав місцеперебування для тестування геокодування - Будь ласка, перевірте сервер позиціювання - - Пошук адреси геокодером з місцеперебування: - Геокодер не визначив адресу. Будь ласка, встановіть та налаштуйте сервер пошуку адрес. - На протязі 10 секунд геокодер не надав визначеної адреси. - diff --git a/unifiednlp-base/src/main/res/values-zh-rTW/strings.xml b/unifiednlp-base/src/main/res/values-zh-rTW/strings.xml deleted file mode 100644 index 5ffcf8c..0000000 --- a/unifiednlp-base/src/main/res/values-zh-rTW/strings.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - UnifiedNlp - UnifiedNlp設定 - 新增背景伺服器 - 設定地點背景伺服器 - 設定地址查閱背景伺服器 - 基於網路的地理位置定位 - 地址查閱 - 設定背景伺服器 - - 為基於網路的地理位置定位啟用,停用或設定背景伺服器。 - - - 為地址查閱啟用,停用或設定背景伺服器。 - - 強制啟用精準位置 - 強制基於網路的地點供應者回報一個精確的地點 - - 是否支援網路的地點供應者 - 支援的Android版本: - 您的Android版本並不被正式支援。這並不一定代表什麼。 - 系統支援地點供應者: - 您的系統並不支援這個UnifiedNlp程式。安裝正確的程式或相容的Xposed模組。 - - UnifiedNlp狀態 - UnifiedNlp已註冊到系統: - 系統尚未綁定UnifiedNlp服務。 如果您剛剛安裝UnifiedNlp,您應該試著重啟設備。 - 地點背景伺服器設定: - 安裝或設定一個UnifiedNlp地點背景伺服器以使用基於網路的地理位置定位。 - UnifiedNlp有已知地點: - UnifiedNlp無最後已知地點。這可能導致某些程式無法運作。 - UnifiedNlp提供地點更新: - 這10秒內並沒有系統提供的UnifiedNlp位置。 - 啟用基於網路的位置定位: - 您不是在系統設定中停用了基於網路的位置定位就是系統不支援。 - 尚未允許定位權限 - - 關於 - 關於microG UnifiedNlp - 版本資訊和使用的程式庫 - - 給沒有GAPPS的支援系統 - 給沒有GAPPS的舊系統 - 給第三方系統 - diff --git a/unifiednlp-base/src/main/res/values/strings.xml b/unifiednlp-base/src/main/res/values/strings.xml deleted file mode 100644 index 113b316..0000000 --- a/unifiednlp-base/src/main/res/values/strings.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - UnifiedNlp - UnifiedNlp Settings - Add backend - Configure location backends - Configure address lookup backends - Network-based Geolocation - Address lookup - Configure backends - - Enable, disable and configure backends for network based geolocation. - - - Enable, disable and configure backends for address lookup. - - enforce approximate location - Force the network-based location provider to report a certain location - - location_backends - geocoder_backends - - Network location provider support - Android version supported: - Your Android version is not officially supported. This does not necessarily mean anything. - System supports location provider: - Your system does not support this UnifiedNlp package. Either install a matching package or a compatibility Xposed module. - - UnifiedNlp status - UnifiedNlp is registered in system: - The system did not bind the UnifiedNlp service. If you just installed UnifiedNlp you should try to reboot this device. - Location backend(s) set up: - Install and configure a UnifiedNlp location backend to use network-based geolocation. - UnifiedNlp has known location: - UnifiedNlp has no last known location. This will cause some apps to fail. - UnifiedNlp provides location updates: - No UnifiedNlp location was provided by the system within 10 seconds. - Network-based location enabled: - You either disabled network-based location (in system settings) or the system is not supported. - Location permission not yet granted - - About - About microG UnifiedNlp - Version information and used libraries - - for default systems without GAPPS - for legacy systems without GAPPS - for custom systems - - UnifiedNlp do not have Location to test Geocoder - Please verify your location Backend - - Geocoder provides address resolution from location: - Geocoder did not provide address resolution. Please install and configure an address lookup Backend. - Geocoder did not provide address resolution within 10 seconds. - diff --git a/unifiednlp-base/src/main/res/xml/nlp_about_preferences.xml b/unifiednlp-base/src/main/res/xml/nlp_about_preferences.xml deleted file mode 100644 index 3cff002..0000000 --- a/unifiednlp-base/src/main/res/xml/nlp_about_preferences.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/unifiednlp-base/src/main/res/xml/nlp_injected_setting.xml b/unifiednlp-base/src/main/res/xml/nlp_injected_setting.xml deleted file mode 100644 index 87db7ac..0000000 --- a/unifiednlp-base/src/main/res/xml/nlp_injected_setting.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - \ No newline at end of file diff --git a/unifiednlp-base/src/main/res/xml/nlp_preferences.xml b/unifiednlp-base/src/main/res/xml/nlp_preferences.xml deleted file mode 100644 index c082007..0000000 --- a/unifiednlp-base/src/main/res/xml/nlp_preferences.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - diff --git a/unifiednlp-base/src/main/res/xml/nlp_setup_preferences.xml b/unifiednlp-base/src/main/res/xml/nlp_setup_preferences.xml deleted file mode 100644 index 0a48d50..0000000 --- a/unifiednlp-base/src/main/res/xml/nlp_setup_preferences.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - \ No newline at end of file