Major changes to core and settings ui
|
@ -73,7 +73,7 @@ public class ForegroundServiceContext extends ContextWrapper {
|
||||||
return new Notification.Builder(context, channel.getId())
|
return new Notification.Builder(context, channel.getId())
|
||||||
.setOngoing(true)
|
.setOngoing(true)
|
||||||
.setContentTitle("Running in background")
|
.setContentTitle("Running in background")
|
||||||
//.setSmallIcon(R.drawable.gcm_bell)
|
//.setSmallIcon(R.drawable.ic_cloud_bell)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
|
apply plugin: 'kotlin-android'
|
||||||
|
apply plugin: 'kotlin-android-extensions'
|
||||||
|
|
||||||
configurations {
|
configurations {
|
||||||
mapboxImplementation
|
mapboxImplementation
|
||||||
|
@ -58,6 +60,8 @@ dependencies {
|
||||||
implementation "androidx.navigation:navigation-ui:$navigationVersion"
|
implementation "androidx.navigation:navigation-ui:$navigationVersion"
|
||||||
implementation "androidx.navigation:navigation-fragment-ktx:$navigationVersion"
|
implementation "androidx.navigation:navigation-fragment-ktx:$navigationVersion"
|
||||||
implementation "androidx.navigation:navigation-ui-ktx:$navigationVersion"
|
implementation "androidx.navigation:navigation-ui-ktx:$navigationVersion"
|
||||||
|
|
||||||
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
|
@ -87,6 +91,7 @@ android {
|
||||||
sourceSets {
|
sourceSets {
|
||||||
main {
|
main {
|
||||||
java.srcDirs += 'src/main/protos-java'
|
java.srcDirs += 'src/main/protos-java'
|
||||||
|
java.srcDirs += 'src/main/kotlin'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,24 +29,22 @@ public abstract class SwitchBarResourceSettingsFragment extends ResourceSettings
|
||||||
public void onActivityCreated(Bundle savedInstanceState) {
|
public void onActivityCreated(Bundle savedInstanceState) {
|
||||||
super.onActivityCreated(savedInstanceState);
|
super.onActivityCreated(savedInstanceState);
|
||||||
|
|
||||||
AbstractSettingsActivity activity = (AbstractSettingsActivity) getActivity();
|
// switchBar = activity.getSwitchBar();
|
||||||
|
// switchBar.show();
|
||||||
switchBar = activity.getSwitchBar();
|
// switchCompat = switchBar.getSwitch();
|
||||||
switchBar.show();
|
|
||||||
switchCompat = switchBar.getSwitch();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroyView() {
|
public void onDestroyView() {
|
||||||
super.onDestroyView();
|
super.onDestroyView();
|
||||||
switchBar.hide();
|
// switchBar.hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onResume() {
|
public void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
if (!listenerSetup) {
|
if (!listenerSetup) {
|
||||||
switchBar.addOnSwitchChangeListener(this);
|
// switchBar.addOnSwitchChangeListener(this);
|
||||||
listenerSetup = true;
|
listenerSetup = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,7 +52,7 @@ public abstract class SwitchBarResourceSettingsFragment extends ResourceSettings
|
||||||
@Override
|
@Override
|
||||||
public void onPause() {
|
public void onPause() {
|
||||||
if (listenerSetup) {
|
if (listenerSetup) {
|
||||||
switchBar.removeOnSwitchChangeListener(this);
|
// switchBar.removeOnSwitchChangeListener(this);
|
||||||
listenerSetup = false;
|
listenerSetup = false;
|
||||||
}
|
}
|
||||||
super.onPause();
|
super.onPause();
|
||||||
|
|
|
@ -16,12 +16,13 @@
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:viewportWidth="24"
|
android:tint="?attr/colorAccent"
|
||||||
android:viewportHeight="24">
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
|
||||||
<path
|
<path
|
||||||
android:fillColor="#ffffff"
|
android:fillColor="#FF000000"
|
||||||
android:pathData="M14,10H2V12H14V10M14,6H2V8H14V6M2,16H10V14H2V16M21.5,11.5L23,13L16,20L11.5,15.5L13,14L16,17L21.5,11.5Z" />
|
android:pathData="M14,10H2V12H14V10M14,6H2V8H14V6M2,16H10V14H2V16M21.5,11.5L23,13L16,20L11.5,15.5L13,14L16,17L21.5,11.5Z" />
|
||||||
</vector>
|
</vector>
|
||||||
|
|
|
@ -106,15 +106,15 @@
|
||||||
android:allowBackup="false"
|
android:allowBackup="false"
|
||||||
android:extractNativeLibs="false"
|
android:extractNativeLibs="false"
|
||||||
android:icon="@mipmap/ic_core_service_app"
|
android:icon="@mipmap/ic_core_service_app"
|
||||||
android:label="@string/gms_app_name">
|
android:label="@string/gms_app_name"
|
||||||
|
android:theme="@style/Theme.AppCompat.DayNight">
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="fake-signature"
|
android:name="fake-signature"
|
||||||
android:value="@string/fake_signature" />
|
android:value="@string/fake_signature" />
|
||||||
|
|
||||||
<!-- Location -->
|
<!-- Location -->
|
||||||
|
|
||||||
<activity android:name="org.microg.nlp.ui.BackendSettingsActivity"
|
<activity android:name="org.microg.nlp.ui.BackendSettingsActivity" />
|
||||||
android:theme="@style/Theme.AppCompat.DayNight" />
|
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="org.microg.gms.ui.PlacePickerActivity"
|
android:name="org.microg.gms.ui.PlacePickerActivity"
|
||||||
|
@ -261,6 +261,7 @@
|
||||||
<service android:name="org.microg.gms.droidguard.DroidGuardService">
|
<service android:name="org.microg.gms.droidguard.DroidGuardService">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="com.google.android.gms.droidguard.service.START" />
|
<action android:name="com.google.android.gms.droidguard.service.START" />
|
||||||
|
<action android:name="com.google.android.gms.droidguard.service.PING" />
|
||||||
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
@ -410,8 +411,7 @@
|
||||||
android:name="org.microg.gms.ui.SettingsActivity"
|
android:name="org.microg.gms.ui.SettingsActivity"
|
||||||
android:icon="@mipmap/ic_microg_settings"
|
android:icon="@mipmap/ic_microg_settings"
|
||||||
android:label="@string/gms_settings_name"
|
android:label="@string/gms_settings_name"
|
||||||
android:roundIcon="@mipmap/ic_microg_settings"
|
android:roundIcon="@mipmap/ic_microg_settings">
|
||||||
android:theme="@style/Theme.AppCompat.DayNight">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
@ -423,13 +423,18 @@
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name="org.microg.gms.ui.SettingsDashboardActivity"
|
||||||
|
android:icon="@mipmap/ic_microg_settings"
|
||||||
|
android:label="Legacy microG Settings"
|
||||||
|
android:roundIcon="@mipmap/ic_microg_settings" />
|
||||||
|
|
||||||
<!-- microG Settings embedded in System Settings on SDK 23 and newer -->
|
<!-- microG Settings embedded in System Settings on SDK 23 and newer -->
|
||||||
<activity-alias
|
<activity-alias
|
||||||
android:name="org.microg.gms.ui.SettingsActivityLink"
|
android:name="org.microg.gms.ui.SettingsActivityLink"
|
||||||
android:icon="@drawable/microg_light_color_24"
|
android:icon="@drawable/microg_light_color_24"
|
||||||
android:label="@string/gms_settings_name"
|
android:label="@string/gms_settings_name"
|
||||||
android:targetActivity="org.microg.gms.ui.SettingsActivity"
|
android:targetActivity="org.microg.gms.ui.SettingsActivity">
|
||||||
android:theme="@style/Theme.AppCompat.DayNight">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="com.android.settings.action.EXTRA_SETTINGS" />
|
<action android:name="com.android.settings.action.EXTRA_SETTINGS" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
@ -452,52 +457,25 @@
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="org.microg.gms.ui.AboutFragment$AsActivity"
|
android:name="org.microg.gms.ui.AboutFragment$AsActivity"
|
||||||
android:label="@string/pref_about_title"
|
android:label="@string/pref_about_title" />
|
||||||
android:theme="@style/Theme.AppCompat.DayNight" />
|
|
||||||
|
|
||||||
<activity
|
|
||||||
android:name="org.microg.gms.ui.CheckinFragment$AsActivity"
|
|
||||||
android:label="@string/service_name_checkin"
|
|
||||||
android:theme="@style/Theme.AppCompat.DayNight" />
|
|
||||||
|
|
||||||
<activity
|
|
||||||
android:name="org.microg.gms.ui.GcmFragment$AsActivity"
|
|
||||||
android:label="@string/service_name_mcs"
|
|
||||||
android:theme="@style/Theme.AppCompat.DayNight" />
|
|
||||||
|
|
||||||
<activity
|
|
||||||
android:name="org.microg.gms.ui.GcmAdvancedFragment$AsActivity"
|
|
||||||
android:label="@string/service_name_mcs"
|
|
||||||
android:theme="@style/Theme.AppCompat.DayNight" />
|
|
||||||
|
|
||||||
<activity
|
|
||||||
android:name="org.microg.gms.ui.GcmAppFragment$AsActivity"
|
|
||||||
android:label="@string/service_name_mcs"
|
|
||||||
android:theme="@style/Theme.AppCompat.DayNight" />
|
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="org.microg.gms.ui.GoogleMoreFragment$AsActivity"
|
android:name="org.microg.gms.ui.GoogleMoreFragment$AsActivity"
|
||||||
android:label="@string/gms_settings_name"
|
android:label="@string/gms_settings_name" />
|
||||||
android:theme="@style/Theme.AppCompat.DayNight" />
|
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="org.microg.gms.ui.SafetyNetFragment$AsActivity"
|
android:name="org.microg.gms.ui.SafetyNetFragment$AsActivity"
|
||||||
android:label="@string/service_name_snet"
|
android:label="@string/service_name_snet" />
|
||||||
android:theme="@style/Theme.AppCompat.DayNight" />
|
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="org.microg.gms.ui.SafetyNetAdvancedFragment$AsActivity"
|
android:name="org.microg.gms.ui.SafetyNetAdvancedFragment$AsActivity"
|
||||||
android:label="@string/service_name_snet"
|
android:label="@string/service_name_snet" />
|
||||||
android:theme="@style/Theme.AppCompat.DayNight" />
|
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="org.microg.gms.ui.SelfCheckFragment$AsActivity"
|
android:name="org.microg.gms.ui.SelfCheckFragment$AsActivity"
|
||||||
android:label="@string/self_check_title"
|
android:label="@string/self_check_title" />
|
||||||
android:theme="@style/Theme.AppCompat.DayNight" />
|
|
||||||
|
|
||||||
<activity
|
<activity android:name="org.microg.gms.ui.AccountSettingsActivity">
|
||||||
android:name="org.microg.gms.ui.AccountSettingsActivity"
|
|
||||||
android:theme="@style/Theme.AppCompat.DayNight">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="com.google.android.gms.accountsettings.ACCOUNT_PREFERENCES_SETTINGS" />
|
<action android:name="com.google.android.gms.accountsettings.ACCOUNT_PREFERENCES_SETTINGS" />
|
||||||
<action android:name="com.google.android.gms.accountsettings.PRIVACY_SETTINGS" />
|
<action android:name="com.google.android.gms.accountsettings.PRIVACY_SETTINGS" />
|
||||||
|
@ -507,9 +485,7 @@
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity
|
<activity android:name="org.microg.gms.ui.LocationSettingsActivity">
|
||||||
android:name="org.microg.gms.ui.LocationSettingsActivity"
|
|
||||||
android:theme="@style/Theme.AppCompat.DayNight">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="com.google.android.gms.location.settings.LOCATION_HISTORY" />
|
<action android:name="com.google.android.gms.location.settings.LOCATION_HISTORY" />
|
||||||
<action android:name="com.google.android.location.settings.LOCATION_REPORTING_SETTINGS" />
|
<action android:name="com.google.android.location.settings.LOCATION_REPORTING_SETTINGS" />
|
||||||
|
|
|
@ -33,8 +33,6 @@ import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.microg.gms.checkin.TriggerReceiver.PREF_ENABLE_CHECKIN;
|
|
||||||
|
|
||||||
public class CheckinManager {
|
public class CheckinManager {
|
||||||
private static final long MIN_CHECKIN_INTERVAL = 3 * 60 * 60 * 1000; // 3 hours
|
private static final long MIN_CHECKIN_INTERVAL = 3 * 60 * 60 * 1000; // 3 hours
|
||||||
|
|
||||||
|
@ -43,7 +41,7 @@ public class CheckinManager {
|
||||||
LastCheckinInfo info = LastCheckinInfo.read(context);
|
LastCheckinInfo info = LastCheckinInfo.read(context);
|
||||||
if (!force && info.lastCheckin > System.currentTimeMillis() - MIN_CHECKIN_INTERVAL)
|
if (!force && info.lastCheckin > System.currentTimeMillis() - MIN_CHECKIN_INTERVAL)
|
||||||
return null;
|
return null;
|
||||||
if (!PreferenceManager.getDefaultSharedPreferences(context).getBoolean(PREF_ENABLE_CHECKIN, false))
|
if (!CheckinPrefs.get(context).isEnabled())
|
||||||
return null;
|
return null;
|
||||||
List<CheckinClient.Account> accounts = new ArrayList<CheckinClient.Account>();
|
List<CheckinClient.Account> accounts = new ArrayList<CheckinClient.Account>();
|
||||||
AccountManager accountManager = AccountManager.get(context);
|
AccountManager accountManager = AccountManager.get(context);
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.microg.gms.checkin;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
|
||||||
|
public class CheckinPrefs implements SharedPreferences.OnSharedPreferenceChangeListener {
|
||||||
|
public static final String PREF_ENABLE_CHECKIN = "checkin_enable_service";
|
||||||
|
private static CheckinPrefs INSTANCE;
|
||||||
|
|
||||||
|
public static CheckinPrefs get(Context context) {
|
||||||
|
if (INSTANCE == null) {
|
||||||
|
if (context == null) return new CheckinPrefs(null);
|
||||||
|
INSTANCE = new CheckinPrefs(context.getApplicationContext());
|
||||||
|
}
|
||||||
|
return INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
private SharedPreferences preferences;
|
||||||
|
private boolean checkinEnabled = false;
|
||||||
|
|
||||||
|
private CheckinPrefs(Context context) {
|
||||||
|
if (context != null) {
|
||||||
|
preferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
preferences.registerOnSharedPreferenceChangeListener(this);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void update() {
|
||||||
|
checkinEnabled = preferences.getBoolean(PREF_ENABLE_CHECKIN, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return checkinEnabled;
|
||||||
|
}
|
||||||
|
}
|
|
@ -34,8 +34,6 @@ import org.microg.gms.common.ForegroundServiceContext;
|
||||||
import org.microg.gms.gcm.McsService;
|
import org.microg.gms.gcm.McsService;
|
||||||
import org.microg.gms.people.PeopleManager;
|
import org.microg.gms.people.PeopleManager;
|
||||||
|
|
||||||
import static org.microg.gms.checkin.TriggerReceiver.PREF_ENABLE_CHECKIN;
|
|
||||||
|
|
||||||
public class CheckinService extends IntentService {
|
public class CheckinService extends IntentService {
|
||||||
private static final String TAG = "GmsCheckinSvc";
|
private static final String TAG = "GmsCheckinSvc";
|
||||||
public static final String BIND_ACTION = "com.google.android.gms.checkin.BIND_TO_SERVICE";
|
public static final String BIND_ACTION = "com.google.android.gms.checkin.BIND_TO_SERVICE";
|
||||||
|
@ -58,7 +56,7 @@ public class CheckinService extends IntentService {
|
||||||
protected void onHandleIntent(Intent intent) {
|
protected void onHandleIntent(Intent intent) {
|
||||||
try {
|
try {
|
||||||
ForegroundServiceContext.completeForegroundService(this, intent, TAG);
|
ForegroundServiceContext.completeForegroundService(this, intent, TAG);
|
||||||
if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(PREF_ENABLE_CHECKIN, false)) {
|
if (CheckinPrefs.get(this).isEnabled()) {
|
||||||
LastCheckinInfo info = CheckinManager.checkin(this, intent.getBooleanExtra(EXTRA_FORCE_CHECKIN, false));
|
LastCheckinInfo info = CheckinManager.checkin(this, intent.getBooleanExtra(EXTRA_FORCE_CHECKIN, false));
|
||||||
if (info != null) {
|
if (info != null) {
|
||||||
Log.d(TAG, "Checked in as " + Long.toHexString(info.androidId));
|
Log.d(TAG, "Checked in as " + Long.toHexString(info.androidId));
|
||||||
|
|
|
@ -31,7 +31,6 @@ import static org.microg.gms.checkin.CheckinService.EXTRA_FORCE_CHECKIN;
|
||||||
|
|
||||||
public class TriggerReceiver extends WakefulBroadcastReceiver {
|
public class TriggerReceiver extends WakefulBroadcastReceiver {
|
||||||
private static final String TAG = "GmsCheckinTrigger";
|
private static final String TAG = "GmsCheckinTrigger";
|
||||||
public static final String PREF_ENABLE_CHECKIN = "checkin_enable_service";
|
|
||||||
private static final long REGULAR_CHECKIN_INTERVAL = 12 * 60 * 60 * 1000; // 12 hours
|
private static final long REGULAR_CHECKIN_INTERVAL = 12 * 60 * 60 * 1000; // 12 hours
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -40,7 +39,7 @@ public class TriggerReceiver extends WakefulBroadcastReceiver {
|
||||||
boolean force = "android.provider.Telephony.SECRET_CODE".equals(intent.getAction());
|
boolean force = "android.provider.Telephony.SECRET_CODE".equals(intent.getAction());
|
||||||
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
|
|
||||||
if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean(PREF_ENABLE_CHECKIN, false) || force) {
|
if (CheckinPrefs.get(context).isEnabled() || force) {
|
||||||
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction()) &&
|
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction()) &&
|
||||||
LastCheckinInfo.read(context).lastCheckin > System.currentTimeMillis() - REGULAR_CHECKIN_INTERVAL) {
|
LastCheckinInfo.read(context).lastCheckin > System.currentTimeMillis() - REGULAR_CHECKIN_INTERVAL) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -80,6 +80,7 @@ public class SafetyNetClientServiceImpl extends ISafetyNetService.Stub {
|
||||||
bundle.putString("contentBinding", attestation.getPayloadHashBase64());
|
bundle.putString("contentBinding", attestation.getPayloadHashBase64());
|
||||||
RemoteDroidGuardConnector.Result dg = conn.guard("attest", Long.toString(LastCheckinInfo.read(context).androidId), bundle);
|
RemoteDroidGuardConnector.Result dg = conn.guard("attest", Long.toString(LastCheckinInfo.read(context).androidId), bundle);
|
||||||
if (!SafetyNetPrefs.get(context).isOfficial() || dg != null && dg.getStatusCode() == 0 && dg.getResult() != null) {
|
if (!SafetyNetPrefs.get(context).isOfficial() || dg != null && dg.getStatusCode() == 0 && dg.getResult() != null) {
|
||||||
|
Log.d(TAG, dg == null ? "No dg result" : ("Status: " + dg.getStatusCode() + ", error:" + dg.getErrorMsg()));
|
||||||
if (dg != null && dg.getStatusCode() == 0 && dg.getResult() != null) {
|
if (dg != null && dg.getStatusCode() == 0 && dg.getResult() != null) {
|
||||||
attestation.setDroidGaurdResult(Base64.encodeToString(dg.getResult(), Base64.NO_WRAP + Base64.NO_PADDING + Base64.URL_SAFE));
|
attestation.setDroidGaurdResult(Base64.encodeToString(dg.getResult(), Base64.NO_WRAP + Base64.NO_PADDING + Base64.URL_SAFE));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,60 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 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.gms.ui;
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
|
|
||||||
import com.google.android.gms.R;
|
|
||||||
|
|
||||||
import org.microg.tools.ui.AbstractSettingsActivity;
|
|
||||||
import org.microg.tools.ui.SwitchBarResourceSettingsFragment;
|
|
||||||
|
|
||||||
import static org.microg.gms.checkin.TriggerReceiver.PREF_ENABLE_CHECKIN;
|
|
||||||
|
|
||||||
public class CheckinFragment extends SwitchBarResourceSettingsFragment {
|
|
||||||
|
|
||||||
public CheckinFragment() {
|
|
||||||
preferencesResource = R.xml.preferences_checkin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onActivityCreated(Bundle savedInstanceState) {
|
|
||||||
super.onActivityCreated(savedInstanceState);
|
|
||||||
|
|
||||||
switchBar.setChecked(PreferenceManager.getDefaultSharedPreferences(getContext()).getBoolean(PREF_ENABLE_CHECKIN, false));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSwitchBarChanged(boolean isChecked) {
|
|
||||||
PreferenceManager.getDefaultSharedPreferences(getContext()).edit().putBoolean(PREF_ENABLE_CHECKIN, isChecked).apply();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static class AsActivity extends AbstractSettingsActivity {
|
|
||||||
public AsActivity() {
|
|
||||||
showHomeAsUp = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Fragment getFragment() {
|
|
||||||
return new CheckinFragment();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -94,15 +94,4 @@ public class GcmAdvancedFragment extends ResourceSettingsFragment {
|
||||||
}
|
}
|
||||||
return (heartbeatMs / 60000) + " minutes";
|
return (heartbeatMs / 60000) + " minutes";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class AsActivity extends AbstractSettingsActivity {
|
|
||||||
public AsActivity() {
|
|
||||||
showHomeAsUp = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Fragment getFragment() {
|
|
||||||
return new GcmAdvancedFragment();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,224 +0,0 @@
|
||||||
package org.microg.gms.ui;
|
|
||||||
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.pm.ApplicationInfo;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.provider.Settings;
|
|
||||||
import android.text.format.DateUtils;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
import androidx.preference.Preference;
|
|
||||||
import androidx.preference.PreferenceScreen;
|
|
||||||
import androidx.preference.SwitchPreference;
|
|
||||||
|
|
||||||
import com.google.android.gms.R;
|
|
||||||
|
|
||||||
import org.microg.gms.gcm.GcmDatabase;
|
|
||||||
import org.microg.gms.gcm.PushRegisterManager;
|
|
||||||
import org.microg.tools.ui.AbstractSettingsActivity;
|
|
||||||
import org.microg.tools.ui.ResourceSettingsFragment;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static android.text.format.DateUtils.FORMAT_SHOW_TIME;
|
|
||||||
import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
|
|
||||||
import static android.text.format.DateUtils.WEEK_IN_MILLIS;
|
|
||||||
|
|
||||||
public class GcmAppFragment extends ResourceSettingsFragment {
|
|
||||||
public static final String EXTRA_PACKAGE_NAME = "package_name";
|
|
||||||
|
|
||||||
public static final String PREF_WAKE_FOR_DELIVERY = "gcm_app_wake_for_delivery";
|
|
||||||
public static final String PREF_ALLOW_REGISTER = "gcm_app_allow_register";
|
|
||||||
public static final String PREF_REGISTER_DETAILS = "gcm_app_register_details";
|
|
||||||
public static final String PREF_MESSAGE_DETAILS = "gcm_app_message_details";
|
|
||||||
|
|
||||||
protected String packageName;
|
|
||||||
private String appName;
|
|
||||||
private GcmDatabase database;
|
|
||||||
|
|
||||||
public GcmAppFragment() {
|
|
||||||
preferencesResource = R.xml.preferences_gcm_app_detail;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onActivityCreated(Bundle savedInstanceState) {
|
|
||||||
super.onActivityCreated(savedInstanceState);
|
|
||||||
packageName = getArguments().getString(EXTRA_PACKAGE_NAME);
|
|
||||||
|
|
||||||
AbstractSettingsActivity activity = (AbstractSettingsActivity) getActivity();
|
|
||||||
|
|
||||||
if (packageName != null && activity != null) {
|
|
||||||
activity.setCustomBarLayout(R.layout.app_bar);
|
|
||||||
try {
|
|
||||||
PackageManager pm = activity.getPackageManager();
|
|
||||||
ApplicationInfo info = pm.getApplicationInfo(packageName, 0);
|
|
||||||
((ImageView) activity.findViewById(R.id.app_icon)).setImageDrawable(pm.getApplicationIcon(info));
|
|
||||||
appName = pm.getApplicationLabel(info).toString();
|
|
||||||
((TextView) activity.findViewById(R.id.app_name)).setText(appName);
|
|
||||||
View view = activity.findViewById(R.id.app_bar);
|
|
||||||
view.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
Intent intent = new Intent();
|
|
||||||
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
|
|
||||||
Uri uri = Uri.fromParts("package", packageName, null);
|
|
||||||
intent.setData(uri);
|
|
||||||
getContext().startActivity(intent);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
view.setClickable(true);
|
|
||||||
} catch (Exception e) {
|
|
||||||
appName = packageName;
|
|
||||||
((TextView) activity.findViewById(R.id.app_name)).setText(packageName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
database = new GcmDatabase(getContext());
|
|
||||||
updateAppDetails();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPause() {
|
|
||||||
super.onPause();
|
|
||||||
database.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
if (database != null) {
|
|
||||||
updateAppDetails();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateAppDetails() {
|
|
||||||
GcmDatabase.App app = database.getApp(packageName);
|
|
||||||
if (app == null) {
|
|
||||||
getActivity().finish();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
PreferenceScreen root = getPreferenceScreen();
|
|
||||||
|
|
||||||
SwitchPreference wakeForDelivery = (SwitchPreference) root.findPreference(PREF_WAKE_FOR_DELIVERY);
|
|
||||||
wakeForDelivery.setChecked(app.wakeForDelivery);
|
|
||||||
wakeForDelivery.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
|
||||||
if (newValue instanceof Boolean) {
|
|
||||||
database.setAppWakeForDelivery(packageName, (Boolean) newValue);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
SwitchPreference allowRegister = (SwitchPreference) root.findPreference(PREF_ALLOW_REGISTER);
|
|
||||||
allowRegister.setChecked(app.allowRegister);
|
|
||||||
allowRegister.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
|
||||||
if (newValue instanceof Boolean) {
|
|
||||||
if (!(boolean) newValue) {
|
|
||||||
final List<GcmDatabase.Registration> registrations = database.getRegistrationsByApp(packageName);
|
|
||||||
if (!registrations.isEmpty()) {
|
|
||||||
showUnregisterConfirm(registrations, getString(R.string.gcm_unregister_after_deny_message));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
database.setAppAllowRegister(packageName, (Boolean) newValue);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Preference registerDetails = root.findPreference(PREF_REGISTER_DETAILS);
|
|
||||||
final List<GcmDatabase.Registration> registrations = database.getRegistrationsByApp(packageName);
|
|
||||||
if (registrations.isEmpty()) {
|
|
||||||
registerDetails.setTitle("");
|
|
||||||
registerDetails.setSelectable(false);
|
|
||||||
registerDetails.setSummary(R.string.gcm_not_registered);
|
|
||||||
} else {
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
for (GcmDatabase.Registration registration : registrations) {
|
|
||||||
if (sb.length() != 0) sb.append("\n");
|
|
||||||
if (registration.timestamp == 0) {
|
|
||||||
sb.append(getString(R.string.gcm_registered));
|
|
||||||
} else {
|
|
||||||
sb.append(getString(R.string.gcm_registered_since, DateUtils.getRelativeDateTimeString(getContext(), registration.timestamp, MINUTE_IN_MILLIS, WEEK_IN_MILLIS, FORMAT_SHOW_TIME)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
registerDetails.setTitle(R.string.gcm_unregister_app);
|
|
||||||
registerDetails.setSummary(sb.toString());
|
|
||||||
registerDetails.setSelectable(true);
|
|
||||||
registerDetails.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceClick(Preference preference) {
|
|
||||||
showUnregisterConfirm(registrations, getString(R.string.gcm_unregister_confirm_message));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
Preference messageDetails = root.findPreference(PREF_MESSAGE_DETAILS);
|
|
||||||
if (app.totalMessageCount == 0) {
|
|
||||||
messageDetails.setSummary(R.string.gcm_no_message_yet);
|
|
||||||
} else {
|
|
||||||
String s = getString(R.string.gcm_messages_counter, app.totalMessageCount, app.totalMessageBytes);
|
|
||||||
if (app.lastMessageTimestamp != 0) {
|
|
||||||
s += "\n" + getString(R.string.gcm_last_message_at, DateUtils.getRelativeDateTimeString(getContext(), app.lastMessageTimestamp, MINUTE_IN_MILLIS, WEEK_IN_MILLIS, FORMAT_SHOW_TIME));
|
|
||||||
}
|
|
||||||
messageDetails.setSummary(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void showUnregisterConfirm(final List<GcmDatabase.Registration> registrations, String unregisterConfirmDesc) {
|
|
||||||
new AlertDialog.Builder(getContext())
|
|
||||||
.setTitle(getString(R.string.gcm_unregister_confirm_title, appName))
|
|
||||||
.setMessage(unregisterConfirmDesc)
|
|
||||||
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
new Thread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
for (GcmDatabase.Registration registration : registrations) {
|
|
||||||
PushRegisterManager.unregister(getContext(), registration.packageName, registration.signature, null, null);
|
|
||||||
}
|
|
||||||
getActivity().runOnUiThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
updateAppDetails();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}).start();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
// Do nothing
|
|
||||||
}
|
|
||||||
}).show();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class AsActivity extends AbstractSettingsActivity {
|
|
||||||
public AsActivity() {
|
|
||||||
showHomeAsUp = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Fragment getFragment() {
|
|
||||||
GcmAppFragment fragment = new GcmAppFragment();
|
|
||||||
fragment.setArguments(getIntent().getExtras());
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,240 +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.gms.ui;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.pm.ApplicationInfo;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.text.format.DateUtils;
|
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
import androidx.preference.Preference;
|
|
||||||
import androidx.preference.PreferenceCategory;
|
|
||||||
import androidx.preference.PreferenceGroup;
|
|
||||||
import androidx.preference.PreferenceScreen;
|
|
||||||
import androidx.preference.PreferenceViewHolder;
|
|
||||||
|
|
||||||
import com.google.android.gms.R;
|
|
||||||
|
|
||||||
import org.microg.gms.gcm.GcmDatabase;
|
|
||||||
import org.microg.gms.gcm.GcmPrefs;
|
|
||||||
import org.microg.gms.gcm.McsConstants;
|
|
||||||
import org.microg.gms.gcm.McsService;
|
|
||||||
import org.microg.gms.gcm.TriggerReceiver;
|
|
||||||
import org.microg.tools.ui.AbstractSettingsActivity;
|
|
||||||
import org.microg.tools.ui.DimmableIconPreference;
|
|
||||||
import org.microg.tools.ui.SwitchBarResourceSettingsFragment;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static android.text.format.DateUtils.FORMAT_SHOW_TIME;
|
|
||||||
import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
|
|
||||||
import static android.text.format.DateUtils.WEEK_IN_MILLIS;
|
|
||||||
|
|
||||||
public class GcmFragment extends SwitchBarResourceSettingsFragment {
|
|
||||||
|
|
||||||
public static final String PREF_GCM_STATUS = "pref_gcm_status";
|
|
||||||
public static final String PREF_GCM_APPS = "gcm_apps";
|
|
||||||
|
|
||||||
private GcmDatabase database;
|
|
||||||
|
|
||||||
private final int MENU_ADVANCED = Menu.FIRST;
|
|
||||||
|
|
||||||
public GcmFragment() {
|
|
||||||
preferencesResource = R.xml.preferences_gcm;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
|
|
||||||
super.onActivityCreated(savedInstanceState);
|
|
||||||
|
|
||||||
setHasOptionsMenu(true);
|
|
||||||
switchBar.setChecked(GcmPrefs.get(getContext()).isEnabled());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreatePreferences(@Nullable Bundle savedInstanceState, String rootKey) {
|
|
||||||
super.onCreatePreferences(savedInstanceState, rootKey);
|
|
||||||
|
|
||||||
database = new GcmDatabase(getContext());
|
|
||||||
|
|
||||||
updateContent();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
updateContent();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPause() {
|
|
||||||
super.onPause();
|
|
||||||
database.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
|
||||||
menu.add(0, MENU_ADVANCED, 0, R.string.menu_advanced);
|
|
||||||
super.onCreateOptionsMenu(menu, inflater);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
|
||||||
switch (item.getItemId()) {
|
|
||||||
case MENU_ADVANCED:
|
|
||||||
Intent intent = new Intent(getContext(), GcmAdvancedFragment.AsActivity.class);
|
|
||||||
startActivity(intent);
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSwitchBarChanged(boolean isChecked) {
|
|
||||||
getPreferenceManager().getSharedPreferences().edit().putBoolean(GcmPrefs.PREF_ENABLE_GCM, isChecked).apply();
|
|
||||||
if (!isChecked) {
|
|
||||||
McsService.stop(getContext());
|
|
||||||
} else {
|
|
||||||
getContext().sendBroadcast(new Intent(TriggerReceiver.FORCE_TRY_RECONNECT, null, getContext(), TriggerReceiver.class));
|
|
||||||
}
|
|
||||||
updateContent();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void addPreferencesSorted(List<Preference> prefs, PreferenceGroup container) {
|
|
||||||
// If there's some items to display, sort the items and add them to the container.
|
|
||||||
Collections.sort(prefs, new Comparator<Preference>() {
|
|
||||||
@Override
|
|
||||||
public int compare(Preference lhs, Preference rhs) {
|
|
||||||
return lhs.getTitle().toString().toLowerCase().compareTo(rhs.getTitle().toString().toLowerCase());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
for (Preference entry : prefs) {
|
|
||||||
container.addPreference(entry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateContent() {
|
|
||||||
PreferenceScreen root = getPreferenceScreen();
|
|
||||||
|
|
||||||
if (McsService.isConnected()) {
|
|
||||||
root.findPreference(PREF_GCM_STATUS).setSummary(getString(R.string.gcm_state_connected, DateUtils.getRelativeTimeSpanString(McsService.getStartTimestamp(), System.currentTimeMillis(), 0)));
|
|
||||||
} else {
|
|
||||||
root.findPreference(PREF_GCM_STATUS).setSummary(getString(R.string.gcm_state_disconnected));
|
|
||||||
}
|
|
||||||
|
|
||||||
PreferenceCategory appList = (PreferenceCategory) root.findPreference(PREF_GCM_APPS);
|
|
||||||
appList.removeAll();
|
|
||||||
List<GcmDatabase.App> list = database.getAppList();
|
|
||||||
if (!list.isEmpty()) {
|
|
||||||
List<Preference> appListPrefs = new ArrayList<>();
|
|
||||||
PackageManager pm = getContext().getPackageManager();
|
|
||||||
for (GcmDatabase.App app : list) {
|
|
||||||
try {
|
|
||||||
pm.getApplicationInfo(app.packageName, 0);
|
|
||||||
appListPrefs.add(new GcmAppPreference(getPreferenceManager().getContext(), app));
|
|
||||||
} catch (PackageManager.NameNotFoundException e) {
|
|
||||||
final List<GcmDatabase.Registration> registrations = database.getRegistrationsByApp(app.packageName);
|
|
||||||
if (registrations.isEmpty()) {
|
|
||||||
database.removeApp(app.packageName);
|
|
||||||
} else {
|
|
||||||
appListPrefs.add(new GcmAppPreference(getPreferenceManager().getContext(), app));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
addPreferencesSorted(appListPrefs, appList);
|
|
||||||
} else {
|
|
||||||
// If there's no item to display, add a "None" item.
|
|
||||||
Preference banner = new Preference(getPreferenceManager().getContext());
|
|
||||||
banner.setLayoutResource(R.layout.list_no_item);
|
|
||||||
banner.setTitle(R.string.list_no_item_none);
|
|
||||||
banner.setSelectable(false);
|
|
||||||
appList.addPreference(banner);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class GcmAppPreference extends DimmableIconPreference implements Preference.OnPreferenceClickListener {
|
|
||||||
|
|
||||||
private GcmDatabase database;
|
|
||||||
private GcmDatabase.App app;
|
|
||||||
|
|
||||||
public GcmAppPreference(Context context, GcmDatabase.App app) {
|
|
||||||
super(context);
|
|
||||||
this.app = app;
|
|
||||||
this.database = new GcmDatabase(context);
|
|
||||||
setKey(app.packageName);
|
|
||||||
|
|
||||||
PackageManager packageManager = context.getPackageManager();
|
|
||||||
try {
|
|
||||||
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(app.packageName, 0);
|
|
||||||
setTitle(packageManager.getApplicationLabel(applicationInfo));
|
|
||||||
setIcon(packageManager.getApplicationIcon(applicationInfo));
|
|
||||||
} catch (PackageManager.NameNotFoundException e) {
|
|
||||||
setTitle(app.packageName);
|
|
||||||
setIcon(android.R.drawable.sym_def_app_icon);
|
|
||||||
}
|
|
||||||
setOnPreferenceClickListener(this);
|
|
||||||
updateViewDetails();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateViewDetails() {
|
|
||||||
if (database.getRegistrationsByApp(app.packageName).isEmpty()) {
|
|
||||||
setSummary(R.string.gcm_not_registered);
|
|
||||||
} else if (app.lastMessageTimestamp > 0) {
|
|
||||||
setSummary(getContext().getString(R.string.gcm_last_message_at, DateUtils.getRelativeDateTimeString(getContext(), app.lastMessageTimestamp, MINUTE_IN_MILLIS, WEEK_IN_MILLIS, FORMAT_SHOW_TIME)));
|
|
||||||
} else {
|
|
||||||
setSummary(R.string.gcm_no_message_yet);
|
|
||||||
}
|
|
||||||
database.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(PreferenceViewHolder view) {
|
|
||||||
updateViewDetails();
|
|
||||||
super.onBindViewHolder(view);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceClick(Preference preference) {
|
|
||||||
Intent intent = new Intent(getContext(), GcmAppFragment.AsActivity.class);
|
|
||||||
intent.putExtra(GcmAppFragment.EXTRA_PACKAGE_NAME, app.packageName);
|
|
||||||
getContext().startActivity(intent);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class AsActivity extends AbstractSettingsActivity {
|
|
||||||
public AsActivity() {
|
|
||||||
showHomeAsUp = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Fragment getFragment() {
|
|
||||||
return new GcmFragment();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,82 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 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.gms.ui;
|
|
||||||
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
|
|
||||||
import com.google.android.gms.R;
|
|
||||||
|
|
||||||
import org.microg.gms.snet.SafetyNetPrefs;
|
|
||||||
import org.microg.tools.ui.AbstractSettingsActivity;
|
|
||||||
import org.microg.tools.ui.SwitchBarResourceSettingsFragment;
|
|
||||||
|
|
||||||
public class SafetyNetFragment extends SwitchBarResourceSettingsFragment {
|
|
||||||
private final int MENU_ADVANCED = Menu.FIRST;
|
|
||||||
|
|
||||||
public SafetyNetFragment() {
|
|
||||||
preferencesResource = R.xml.preferences_snet;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
|
|
||||||
super.onActivityCreated(savedInstanceState);
|
|
||||||
|
|
||||||
setHasOptionsMenu(true);
|
|
||||||
switchBar.setChecked(SafetyNetPrefs.get(getContext()).isEnabled());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
|
||||||
menu.add(0, MENU_ADVANCED, 0, R.string.menu_advanced);
|
|
||||||
super.onCreateOptionsMenu(menu, inflater);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
|
||||||
switch (item.getItemId()) {
|
|
||||||
case MENU_ADVANCED:
|
|
||||||
Intent intent = new Intent(getContext(), SafetyNetAdvancedFragment.AsActivity.class);
|
|
||||||
startActivity(intent);
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSwitchBarChanged(boolean isChecked) {
|
|
||||||
SafetyNetPrefs.get(getContext()).setEnabled(isChecked);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class AsActivity extends AbstractSettingsActivity {
|
|
||||||
public AsActivity() {
|
|
||||||
showHomeAsUp = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Fragment getFragment() {
|
|
||||||
return new SafetyNetFragment();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,112 +1,34 @@
|
||||||
/*
|
|
||||||
* 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.gms.ui;
|
package org.microg.gms.ui;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.navigation.NavController;
|
||||||
|
import androidx.navigation.fragment.NavHostFragment;
|
||||||
|
import androidx.navigation.ui.AppBarConfiguration;
|
||||||
|
import androidx.navigation.ui.NavigationUI;
|
||||||
|
|
||||||
import com.google.android.gms.R;
|
import com.google.android.gms.R;
|
||||||
|
|
||||||
import org.microg.gms.gcm.GcmDatabase;
|
public class SettingsActivity extends AppCompatActivity {
|
||||||
import org.microg.gms.gcm.GcmPrefs;
|
private AppBarConfiguration appBarConfiguration;
|
||||||
import org.microg.gms.snet.SafetyNetPrefs;
|
|
||||||
//import org.microg.nlp.Preferences;
|
|
||||||
import org.microg.tools.ui.AbstractDashboardActivity;
|
|
||||||
import org.microg.tools.ui.ResourceSettingsFragment;
|
|
||||||
|
|
||||||
import static org.microg.gms.checkin.TriggerReceiver.PREF_ENABLE_CHECKIN;
|
private NavController getNavController() {
|
||||||
|
return ((NavHostFragment)getSupportFragmentManager().findFragmentById(R.id.navhost)).getNavController();
|
||||||
public class SettingsActivity extends AbstractDashboardActivity {
|
|
||||||
|
|
||||||
public SettingsActivity() {
|
|
||||||
preferencesResource = R.xml.preferences_start;
|
|
||||||
addCondition(Conditions.GCM_BATTERY_OPTIMIZATIONS);
|
|
||||||
addCondition(Conditions.PERMISSIONS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Fragment getFragment() {
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
return new FragmentImpl();
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.settings_root_activity);
|
||||||
|
|
||||||
|
appBarConfiguration = new AppBarConfiguration.Builder(getNavController().getGraph()).build();
|
||||||
|
NavigationUI.setupActionBarWithNavController(this, getNavController(), appBarConfiguration);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class FragmentImpl extends ResourceSettingsFragment {
|
@Override
|
||||||
|
public boolean onSupportNavigateUp() {
|
||||||
public static final String PREF_ABOUT = "pref_about";
|
return NavigationUI.navigateUp(getNavController(), appBarConfiguration) || super.onSupportNavigateUp();
|
||||||
public static final String PREF_GCM = "pref_gcm";
|
|
||||||
public static final String PREF_SNET = "pref_snet";
|
|
||||||
// public static final String PREF_UNIFIEDNLP = "pref_unifiednlp";
|
|
||||||
public static final String PREF_CHECKIN = "pref_checkin";
|
|
||||||
|
|
||||||
public FragmentImpl() {
|
|
||||||
preferencesResource = R.xml.preferences_start;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreatePreferences(@Nullable Bundle savedInstanceState, String rootKey) {
|
|
||||||
super.onCreatePreferences(savedInstanceState, rootKey);
|
|
||||||
updateDetails();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
updateDetails();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateDetails() {
|
|
||||||
findPreference(PREF_ABOUT).setSummary(getString(R.string.about_version_str, AboutFragment.getSelfVersion(getContext())));
|
|
||||||
if (GcmPrefs.get(getContext()).isEnabled()) {
|
|
||||||
GcmDatabase database = new GcmDatabase(getContext());
|
|
||||||
int regCount = database.getRegistrationList().size();
|
|
||||||
database.close();
|
|
||||||
findPreference(PREF_GCM).setSummary(getString(R.string.abc_capital_on) + " / " + getResources().getQuantityString(R.plurals.gcm_registered_apps_counter, regCount, regCount));
|
|
||||||
} else {
|
|
||||||
findPreference(PREF_GCM).setSummary(R.string.abc_capital_off);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SafetyNetPrefs.get(getContext()).isEnabled()) {
|
|
||||||
String snet_info = "";
|
|
||||||
|
|
||||||
if (SafetyNetPrefs.get(getContext()).isOfficial()) {
|
|
||||||
snet_info = getString(R.string.pref_snet_status_official_info);
|
|
||||||
} else if (SafetyNetPrefs.get(getContext()).isSelfSigned()) {
|
|
||||||
snet_info = getString(R.string.pref_snet_status_self_signed_info);
|
|
||||||
} else if (SafetyNetPrefs.get(getContext()).isThirdParty()) {
|
|
||||||
snet_info = getString(R.string.pref_snet_status_third_party_info);
|
|
||||||
}
|
|
||||||
|
|
||||||
findPreference(PREF_SNET).setSummary(getString(R.string.service_status_enabled) + " / " + snet_info);
|
|
||||||
} else {
|
|
||||||
findPreference(PREF_SNET).setSummary(R.string.service_status_disabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Preferences unifiedNlPrefs = new Preferences(getContext());
|
|
||||||
// int backendCount = TextUtils.isEmpty(unifiedNlPrefs.getLocationBackends()) ? 0 :
|
|
||||||
// Preferences.splitBackendString(unifiedNlPrefs.getLocationBackends()).length;
|
|
||||||
// backendCount += TextUtils.isEmpty(unifiedNlPrefs.getGeocoderBackends()) ? 0 :
|
|
||||||
// Preferences.splitBackendString(unifiedNlPrefs.getGeocoderBackends()).length;
|
|
||||||
// findPreference(PREF_UNIFIEDNLP).setSummary(getResources().getQuantityString(R.plurals.pref_unifiednlp_summary, backendCount, backendCount));
|
|
||||||
|
|
||||||
boolean checkinEnabled = PreferenceManager.getDefaultSharedPreferences(getContext()).getBoolean(PREF_ENABLE_CHECKIN, false);
|
|
||||||
findPreference(PREF_CHECKIN).setSummary(checkinEnabled ? R.string.service_status_enabled : R.string.service_status_disabled);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* 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.gms.ui;
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
|
import com.google.android.gms.R;
|
||||||
|
|
||||||
|
//import org.microg.nlp.Preferences;
|
||||||
|
import org.microg.tools.ui.AbstractDashboardActivity;
|
||||||
|
|
||||||
|
public class SettingsDashboardActivity extends AbstractDashboardActivity {
|
||||||
|
|
||||||
|
public SettingsDashboardActivity() {
|
||||||
|
preferencesResource = R.xml.preferences_start;
|
||||||
|
addCondition(Conditions.GCM_BATTERY_OPTIMIZATIONS);
|
||||||
|
addCondition(Conditions.PERMISSIONS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Fragment getFragment() {
|
||||||
|
return new SettingsFragment();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,97 @@
|
||||||
|
package org.microg.gms.ui;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.navigation.fragment.NavHostFragment;
|
||||||
|
|
||||||
|
import com.google.android.gms.R;
|
||||||
|
|
||||||
|
import org.microg.gms.checkin.CheckinPrefs;
|
||||||
|
import org.microg.gms.gcm.GcmDatabase;
|
||||||
|
import org.microg.gms.gcm.GcmPrefs;
|
||||||
|
import org.microg.gms.snet.SafetyNetPrefs;
|
||||||
|
import org.microg.tools.ui.ResourceSettingsFragment;
|
||||||
|
|
||||||
|
public class SettingsFragment extends ResourceSettingsFragment {
|
||||||
|
|
||||||
|
public static final String PREF_ABOUT = "pref_about";
|
||||||
|
public static final String PREF_GCM = "pref_gcm";
|
||||||
|
public static final String PREF_SNET = "pref_snet";
|
||||||
|
public static final String PREF_UNIFIEDNLP = "pref_unifiednlp";
|
||||||
|
public static final String PREF_CHECKIN = "pref_checkin";
|
||||||
|
|
||||||
|
public SettingsFragment() {
|
||||||
|
preferencesResource = R.xml.preferences_start;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreatePreferences(@Nullable Bundle savedInstanceState, String rootKey) {
|
||||||
|
super.onCreatePreferences(savedInstanceState, rootKey);
|
||||||
|
updateDetails();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
updateDetails();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateDetails() {
|
||||||
|
findPreference(PREF_ABOUT).setSummary(getString(R.string.about_version_str, AboutFragment.getSelfVersion(getContext())));
|
||||||
|
findPreference(PREF_ABOUT).setOnPreferenceClickListener(preference -> {
|
||||||
|
NavHostFragment.findNavController(SettingsFragment.this).navigate(R.id.openAbout);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
if (GcmPrefs.get(getContext()).isEnabled()) {
|
||||||
|
GcmDatabase database = new GcmDatabase(getContext());
|
||||||
|
int regCount = database.getRegistrationList().size();
|
||||||
|
database.close();
|
||||||
|
findPreference(PREF_GCM).setSummary(getString(R.string.service_status_enabled_short) + " - " + getResources().getQuantityString(R.plurals.gcm_registered_apps_counter, regCount, regCount));
|
||||||
|
} else {
|
||||||
|
findPreference(PREF_GCM).setSummary(R.string.service_status_disabled_short);
|
||||||
|
}
|
||||||
|
findPreference(PREF_GCM).setOnPreferenceClickListener(preference -> {
|
||||||
|
NavHostFragment.findNavController(SettingsFragment.this).navigate(R.id.openGcmSettings);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (SafetyNetPrefs.get(getContext()).isEnabled()) {
|
||||||
|
String snet_info = "";
|
||||||
|
|
||||||
|
if (SafetyNetPrefs.get(getContext()).isOfficial()) {
|
||||||
|
snet_info = getString(R.string.pref_snet_status_official_info);
|
||||||
|
} else if (SafetyNetPrefs.get(getContext()).isSelfSigned()) {
|
||||||
|
snet_info = getString(R.string.pref_snet_status_self_signed_info);
|
||||||
|
} else if (SafetyNetPrefs.get(getContext()).isThirdParty()) {
|
||||||
|
snet_info = getString(R.string.pref_snet_status_third_party_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
findPreference(PREF_SNET).setSummary(getString(R.string.service_status_enabled_short));
|
||||||
|
} else {
|
||||||
|
findPreference(PREF_SNET).setSummary(R.string.service_status_disabled_short);
|
||||||
|
}
|
||||||
|
findPreference(PREF_SNET).setOnPreferenceClickListener(preference -> {
|
||||||
|
NavHostFragment.findNavController(SettingsFragment.this).navigate(R.id.openSafetyNetSettings);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Preferences unifiedNlPrefs = new Preferences(getContext());
|
||||||
|
// int backendCount = TextUtils.isEmpty(unifiedNlPrefs.getLocationBackends()) ? 0 :
|
||||||
|
// Preferences.splitBackendString(unifiedNlPrefs.getLocationBackends()).length;
|
||||||
|
// backendCount += TextUtils.isEmpty(unifiedNlPrefs.getGeocoderBackends()) ? 0 :
|
||||||
|
// Preferences.splitBackendString(unifiedNlPrefs.getGeocoderBackends()).length;
|
||||||
|
// findPreference(PREF_UNIFIEDNLP).setSummary(getResources().getQuantityString(R.plurals.pref_unifiednlp_summary, backendCount, backendCount));
|
||||||
|
findPreference(PREF_UNIFIEDNLP).setOnPreferenceClickListener(preference -> {
|
||||||
|
NavHostFragment.findNavController(SettingsFragment.this).navigate(R.id.openUnifiedNlpSettings);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
boolean checkinEnabled = CheckinPrefs.get(getContext()).isEnabled();
|
||||||
|
findPreference(PREF_CHECKIN).setSummary(checkinEnabled ? R.string.service_status_enabled_short : R.string.service_status_disabled_short);
|
||||||
|
findPreference(PREF_CHECKIN).setOnPreferenceClickListener(preference -> {
|
||||||
|
NavHostFragment.findNavController(SettingsFragment.this).navigate(R.id.openCheckinSettings);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,18 +0,0 @@
|
||||||
package org.microg.gms.ui;
|
|
||||||
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
|
|
||||||
import org.microg.nlp.ui.BackendDetailsFragment;
|
|
||||||
import org.microg.nlp.ui.BackendListFragment;
|
|
||||||
import org.microg.tools.ui.AbstractSettingsActivity;
|
|
||||||
|
|
||||||
public class UnifiedBackendDetailsActivity extends AbstractSettingsActivity {
|
|
||||||
public UnifiedBackendDetailsActivity() {
|
|
||||||
showHomeAsUp = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Fragment getFragment() {
|
|
||||||
return new BackendDetailsFragment();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,32 +0,0 @@
|
||||||
package org.microg.gms.ui;
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
import androidx.fragment.app.FragmentActivity;
|
|
||||||
|
|
||||||
import org.microg.nlp.ui.BackendListFragment;
|
|
||||||
import org.microg.tools.ui.AbstractSettingsActivity;
|
|
||||||
|
|
||||||
public class UnifiedBackendListActivity extends AppCompatActivity {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
try {
|
|
||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
|
||||||
} catch (Exception e) {
|
|
||||||
Log.w("GmsCoreSettingUi", e);
|
|
||||||
}
|
|
||||||
getSupportFragmentManager().beginTransaction().add(new BackendListFragment(), null).commit();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBackPressed() {
|
|
||||||
super.onBackPressed();
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.microg.gms.ui
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.DisplayMetrics
|
||||||
|
import android.widget.ImageView
|
||||||
|
import androidx.preference.Preference
|
||||||
|
import androidx.preference.PreferenceViewHolder
|
||||||
|
|
||||||
|
class AppIconPreference(context: Context) : Preference(context) {
|
||||||
|
override fun onBindViewHolder(holder: PreferenceViewHolder?) {
|
||||||
|
super.onBindViewHolder(holder)
|
||||||
|
val icon = holder?.findViewById(android.R.id.icon)
|
||||||
|
if (icon is ImageView) {
|
||||||
|
icon.adjustViewBounds = true
|
||||||
|
icon.scaleType = ImageView.ScaleType.CENTER_INSIDE
|
||||||
|
icon.maxHeight = (32.0 * context.resources.displayMetrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT).toInt()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.microg.gms.ui
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.lifecycle.lifecycleScope
|
||||||
|
import androidx.preference.PreferenceManager
|
||||||
|
import com.google.android.gms.R
|
||||||
|
import com.google.android.gms.databinding.DeviceRegistrationFragmentBinding
|
||||||
|
import org.microg.gms.checkin.CheckinPrefs
|
||||||
|
import org.microg.gms.checkin.CheckinPrefs.PREF_ENABLE_CHECKIN
|
||||||
|
import org.microg.gms.checkin.TriggerReceiver
|
||||||
|
|
||||||
|
class DeviceRegistrationFragment : Fragment(R.layout.device_registration_fragment) {
|
||||||
|
private lateinit var binding: DeviceRegistrationFragmentBinding
|
||||||
|
|
||||||
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||||
|
binding = DeviceRegistrationFragmentBinding.inflate(inflater, container, false)
|
||||||
|
binding.switchBarCallback = object : PreferenceSwitchBarCallback {
|
||||||
|
override fun onChecked(newStatus: Boolean) {
|
||||||
|
PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(PREF_ENABLE_CHECKIN, newStatus).commit()
|
||||||
|
if (newStatus) {
|
||||||
|
requireContext().sendOrderedBroadcast(Intent(requireContext(), TriggerReceiver::class.java), null)
|
||||||
|
}
|
||||||
|
binding.checkinEnabled = newStatus
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return binding.root
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
lifecycleScope.launchWhenResumed {
|
||||||
|
binding.checkinEnabled = CheckinPrefs.get(context).isEnabled
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.microg.gms.ui
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.os.Handler
|
||||||
|
import android.text.format.DateUtils
|
||||||
|
import androidx.preference.Preference
|
||||||
|
import androidx.preference.PreferenceCategory
|
||||||
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
|
import com.google.android.gms.R
|
||||||
|
import org.microg.gms.checkin.CheckinPrefs
|
||||||
|
import org.microg.gms.checkin.LastCheckinInfo
|
||||||
|
|
||||||
|
class DeviceRegistrationPreferencesFragment : PreferenceFragmentCompat() {
|
||||||
|
private lateinit var statusCategory: PreferenceCategory
|
||||||
|
private lateinit var status: Preference
|
||||||
|
private val handler = Handler()
|
||||||
|
private val updateRunnable = Runnable { updateStatus() }
|
||||||
|
|
||||||
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||||
|
addPreferencesFromResource(R.xml.preferences_device_registration)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindPreferences() {
|
||||||
|
statusCategory = preferenceScreen.findPreference("prefcat_device_registration_status") ?: statusCategory
|
||||||
|
status = preferenceScreen.findPreference("pref_device_registration_status") ?: status
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
updateStatus()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPause() {
|
||||||
|
super.onPause()
|
||||||
|
handler.removeCallbacks(updateRunnable)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateStatus() {
|
||||||
|
handler.postDelayed(updateRunnable, UPDATE_INTERVAL)
|
||||||
|
statusCategory.isVisible = CheckinPrefs.get(context).isEnabled
|
||||||
|
val checkinInfo = LastCheckinInfo.read(requireContext())
|
||||||
|
status.summary = if (checkinInfo.lastCheckin > 0) {
|
||||||
|
"Last registration: " + DateUtils.getRelativeTimeSpanString(checkinInfo.lastCheckin, System.currentTimeMillis(), 0)
|
||||||
|
} else {
|
||||||
|
"Not registered"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val UPDATE_INTERVAL = 1000L
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.microg.gms.ui
|
||||||
|
|
||||||
|
interface PreferenceSwitchBarCallback {
|
||||||
|
fun onChecked(newStatus: Boolean)
|
||||||
|
}
|
|
@ -0,0 +1,115 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.microg.gms.ui
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.text.format.DateUtils
|
||||||
|
import androidx.appcompat.content.res.AppCompatResources
|
||||||
|
import androidx.core.os.bundleOf
|
||||||
|
import androidx.lifecycle.lifecycleScope
|
||||||
|
import androidx.navigation.fragment.findNavController
|
||||||
|
import androidx.preference.Preference
|
||||||
|
import androidx.preference.PreferenceCategory
|
||||||
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
|
import com.google.android.gms.R
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
import org.microg.gms.gcm.GcmDatabase
|
||||||
|
|
||||||
|
class PushNotificationAllAppsFragment : PreferenceFragmentCompat() {
|
||||||
|
private lateinit var database: GcmDatabase
|
||||||
|
private lateinit var registered: PreferenceCategory
|
||||||
|
private lateinit var unregistered: PreferenceCategory
|
||||||
|
private lateinit var registeredNone: Preference
|
||||||
|
private lateinit var unregisteredNone: Preference
|
||||||
|
private lateinit var progress: Preference
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
database = GcmDatabase(context)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
updateContent()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPause() {
|
||||||
|
super.onPause()
|
||||||
|
database.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||||
|
addPreferencesFromResource(R.xml.preferences_push_notifications_all_apps)
|
||||||
|
registered = preferenceScreen.findPreference("prefcat_push_apps_registered") ?: registered
|
||||||
|
unregistered = preferenceScreen.findPreference("prefcat_push_apps_unregistered") ?: unregistered
|
||||||
|
registeredNone = preferenceScreen.findPreference("pref_push_apps_registered_none") ?: registeredNone
|
||||||
|
unregisteredNone = preferenceScreen.findPreference("pref_push_apps_unregistered_none") ?: unregisteredNone
|
||||||
|
progress = preferenceScreen.findPreference("pref_push_apps_all_progress") ?: progress
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateContent() {
|
||||||
|
lifecycleScope.launchWhenResumed {
|
||||||
|
val context = requireContext()
|
||||||
|
val apps = withContext(Dispatchers.IO) {
|
||||||
|
val res = database.appList.map { app ->
|
||||||
|
try {
|
||||||
|
app to context.packageManager.getApplicationInfo(app.packageName, 0)
|
||||||
|
} catch (ignored: Exception) {
|
||||||
|
app to null
|
||||||
|
}
|
||||||
|
}.map { (app, applicationInfo) ->
|
||||||
|
val pref = AppIconPreference(context)
|
||||||
|
pref.title = applicationInfo?.loadLabel(context.packageManager) ?: app.packageName
|
||||||
|
pref.summary = when {
|
||||||
|
app.lastMessageTimestamp > 0 -> getString(R.string.gcm_last_message_at, DateUtils.getRelativeTimeSpanString(app.lastMessageTimestamp))
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
pref.icon = applicationInfo?.loadIcon(context.packageManager)
|
||||||
|
?: AppCompatResources.getDrawable(context, android.R.mipmap.sym_def_app_icon)
|
||||||
|
pref.onPreferenceClickListener = Preference.OnPreferenceClickListener {
|
||||||
|
findNavController().navigate(R.id.openGcmAppDetailsFromAll, bundleOf(
|
||||||
|
"package" to app.packageName
|
||||||
|
))
|
||||||
|
true
|
||||||
|
}
|
||||||
|
pref.key = "pref_push_app_" + app.packageName
|
||||||
|
pref to (database.getRegistrationsByApp(app.packageName))
|
||||||
|
}.sortedBy {
|
||||||
|
it.first.title.toString().toLowerCase()
|
||||||
|
}.mapIndexed { idx, pair ->
|
||||||
|
pair.first.order = idx
|
||||||
|
pair
|
||||||
|
}
|
||||||
|
database.close()
|
||||||
|
res
|
||||||
|
}
|
||||||
|
registered.removeAll()
|
||||||
|
registered.isVisible = true
|
||||||
|
unregistered.removeAll()
|
||||||
|
unregistered.isVisible = true
|
||||||
|
|
||||||
|
var hadRegistered = false
|
||||||
|
var hadUnregistered = false
|
||||||
|
|
||||||
|
for (pair in apps) {
|
||||||
|
if (pair.second.isEmpty()) {
|
||||||
|
unregistered.addPreference(pair.first)
|
||||||
|
hadUnregistered = true
|
||||||
|
} else {
|
||||||
|
registered.addPreference(pair.first)
|
||||||
|
hadRegistered = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
registeredNone.isVisible = !hadRegistered
|
||||||
|
unregisteredNone.isVisible = !hadUnregistered
|
||||||
|
if (!hadRegistered) registered.addPreference(registeredNone)
|
||||||
|
if (!hadUnregistered) unregistered.addPreference(unregisteredNone)
|
||||||
|
progress.isVisible = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.microg.gms.ui
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.provider.Settings
|
||||||
|
import android.util.Log
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.appcompat.content.res.AppCompatResources
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.fragment.app.findFragment
|
||||||
|
import androidx.lifecycle.lifecycleScope
|
||||||
|
import com.google.android.gms.R
|
||||||
|
import com.google.android.gms.databinding.PushNotificationAppFragmentBinding
|
||||||
|
|
||||||
|
|
||||||
|
class PushNotificationAppFragment : Fragment(R.layout.push_notification_fragment) {
|
||||||
|
lateinit var binding: PushNotificationAppFragmentBinding
|
||||||
|
val packageName: String?
|
||||||
|
get() = arguments?.getString("package")
|
||||||
|
|
||||||
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||||
|
binding = PushNotificationAppFragmentBinding.inflate(inflater, container, false)
|
||||||
|
binding.callbacks = object : PushNotificationAppFragmentCallbacks {
|
||||||
|
override fun onAppClicked() {
|
||||||
|
val intent = Intent()
|
||||||
|
intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
|
||||||
|
val uri: Uri = Uri.fromParts("package", packageName, null)
|
||||||
|
intent.data = uri
|
||||||
|
context!!.startActivity(intent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
childFragmentManager.findFragmentById(R.id.sub_preferences)?.arguments = arguments
|
||||||
|
return binding.root
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
lifecycleScope.launchWhenResumed {
|
||||||
|
val pm = requireContext().packageManager
|
||||||
|
val applicationInfo = packageName?.let { pm.getApplicationInfo(it, 0) }
|
||||||
|
binding.appName = applicationInfo?.loadLabel(pm)?.toString() ?: packageName
|
||||||
|
binding.appIcon = applicationInfo?.loadIcon(pm)
|
||||||
|
?: AppCompatResources.getDrawable(requireContext(), android.R.mipmap.sym_def_app_icon)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface PushNotificationAppFragmentCallbacks {
|
||||||
|
fun onAppClicked()
|
||||||
|
}
|
|
@ -0,0 +1,134 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.microg.gms.ui
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.text.format.DateUtils
|
||||||
|
import androidx.appcompat.app.AlertDialog
|
||||||
|
import androidx.lifecycle.lifecycleScope
|
||||||
|
import androidx.preference.Preference
|
||||||
|
import androidx.preference.PreferenceCategory
|
||||||
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
|
import androidx.preference.TwoStatePreference
|
||||||
|
import com.google.android.gms.R
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
import org.microg.gms.gcm.GcmDatabase
|
||||||
|
import org.microg.gms.gcm.PushRegisterManager
|
||||||
|
|
||||||
|
class PushNotificationAppPreferencesFragment : PreferenceFragmentCompat() {
|
||||||
|
private lateinit var wakeForDelivery: TwoStatePreference
|
||||||
|
private lateinit var allowRegister: TwoStatePreference
|
||||||
|
private lateinit var status: Preference
|
||||||
|
private lateinit var unregister: Preference
|
||||||
|
private lateinit var unregisterCat: PreferenceCategory
|
||||||
|
|
||||||
|
private lateinit var database: GcmDatabase
|
||||||
|
private val packageName: String?
|
||||||
|
get() = arguments?.getString("package")
|
||||||
|
|
||||||
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||||
|
addPreferencesFromResource(R.xml.preferences_push_notifications_app)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
database = GcmDatabase(context)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindPreferences() {
|
||||||
|
wakeForDelivery = preferenceScreen.findPreference("pref_push_app_wake_for_delivery") ?: wakeForDelivery
|
||||||
|
allowRegister = preferenceScreen.findPreference("pref_push_app_allow_register") ?: allowRegister
|
||||||
|
unregister = preferenceScreen.findPreference("pref_push_app_unregister") ?: unregister
|
||||||
|
unregisterCat = preferenceScreen.findPreference("prefcat_push_app_unregister") ?: unregisterCat
|
||||||
|
status = preferenceScreen.findPreference("pref_push_app_status") ?: status
|
||||||
|
wakeForDelivery.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
|
||||||
|
database.setAppWakeForDelivery(packageName, newValue as Boolean)
|
||||||
|
database.close()
|
||||||
|
true
|
||||||
|
}
|
||||||
|
allowRegister.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
|
||||||
|
val enabled = newValue as? Boolean ?: return@OnPreferenceChangeListener false
|
||||||
|
if (!enabled) {
|
||||||
|
val registrations = packageName?.let { database.getRegistrationsByApp(it) } ?: emptyList()
|
||||||
|
if (registrations.isNotEmpty()) {
|
||||||
|
showUnregisterConfirm(R.string.gcm_unregister_after_deny_message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
database.setAppAllowRegister(packageName, enabled)
|
||||||
|
database.close()
|
||||||
|
true
|
||||||
|
}
|
||||||
|
unregister.onPreferenceClickListener = Preference.OnPreferenceClickListener {
|
||||||
|
showUnregisterConfirm(R.string.gcm_unregister_confirm_message)
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun showUnregisterConfirm(unregisterConfirmDesc: Int) {
|
||||||
|
val pm = requireContext().packageManager
|
||||||
|
val applicationInfo = packageName?.let { pm.getApplicationInfo(it, 0) }
|
||||||
|
AlertDialog.Builder(requireContext())
|
||||||
|
.setTitle(getString(R.string.gcm_unregister_confirm_title, applicationInfo?.loadLabel(pm)
|
||||||
|
?: packageName))
|
||||||
|
.setMessage(unregisterConfirmDesc)
|
||||||
|
.setPositiveButton(android.R.string.yes) { _, _ -> unregister() }
|
||||||
|
.setNegativeButton(android.R.string.no) { _, _ -> }.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun unregister() {
|
||||||
|
lifecycleScope.launchWhenResumed {
|
||||||
|
withContext(Dispatchers.IO) {
|
||||||
|
for (registration in database.getRegistrationsByApp(packageName)) {
|
||||||
|
PushRegisterManager.unregister(context, registration.packageName, registration.signature, null, null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
updateDetails()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
updateDetails()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateDetails() {
|
||||||
|
lifecycleScope.launchWhenResumed {
|
||||||
|
val app = packageName?.let { database.getApp(it) }
|
||||||
|
wakeForDelivery.isChecked = app?.wakeForDelivery ?: true
|
||||||
|
allowRegister.isChecked = app?.allowRegister ?: true
|
||||||
|
val registrations = packageName?.let { database.getRegistrationsByApp(it) } ?: emptyList()
|
||||||
|
unregisterCat.isVisible = registrations.isNotEmpty()
|
||||||
|
|
||||||
|
val sb = StringBuilder()
|
||||||
|
if ((app?.totalMessageCount ?: 0L) == 0L) {
|
||||||
|
sb.append(getString(R.string.gcm_no_message_yet))
|
||||||
|
} else {
|
||||||
|
sb.append(getString(R.string.gcm_messages_counter, app?.totalMessageCount, app?.totalMessageBytes))
|
||||||
|
if (app?.lastMessageTimestamp != 0L) {
|
||||||
|
sb.append("\n").append(getString(R.string.gcm_last_message_at, DateUtils.getRelativeDateTimeString(context, app?.lastMessageTimestamp ?: 0L, DateUtils.MINUTE_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, DateUtils.FORMAT_SHOW_TIME)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (registration in registrations) {
|
||||||
|
sb.append("\n")
|
||||||
|
if (registration.timestamp == 0L) {
|
||||||
|
sb.append(getString(R.string.gcm_registered))
|
||||||
|
} else {
|
||||||
|
sb.append(getString(R.string.gcm_registered_since, DateUtils.getRelativeDateTimeString(context, registration.timestamp, DateUtils.MINUTE_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, DateUtils.FORMAT_SHOW_TIME)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
status.summary = sb.toString()
|
||||||
|
|
||||||
|
database.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPause() {
|
||||||
|
super.onPause()
|
||||||
|
database.close()
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
package org.microg.gms.ui
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.*
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.lifecycle.lifecycleScope
|
||||||
|
import androidx.navigation.fragment.findNavController
|
||||||
|
import androidx.preference.*
|
||||||
|
import com.google.android.gms.R
|
||||||
|
import com.google.android.gms.databinding.PushNotificationFragmentBinding
|
||||||
|
import org.microg.gms.checkin.CheckinPrefs
|
||||||
|
import org.microg.gms.gcm.GcmPrefs
|
||||||
|
import org.microg.gms.gcm.McsService
|
||||||
|
import org.microg.gms.gcm.TriggerReceiver
|
||||||
|
|
||||||
|
class PushNotificationFragment : Fragment(R.layout.push_notification_fragment) {
|
||||||
|
lateinit var binding: PushNotificationFragmentBinding
|
||||||
|
|
||||||
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||||
|
binding = PushNotificationFragmentBinding.inflate(inflater, container, false)
|
||||||
|
binding.switchBarCallback = object : PreferenceSwitchBarCallback {
|
||||||
|
override fun onChecked(newStatus: Boolean) {
|
||||||
|
PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(GcmPrefs.PREF_ENABLE_GCM, newStatus).apply()
|
||||||
|
if (!newStatus) {
|
||||||
|
McsService.stop(context)
|
||||||
|
} else {
|
||||||
|
requireContext().sendBroadcast(Intent(TriggerReceiver.FORCE_TRY_RECONNECT, null, context, TriggerReceiver::class.java))
|
||||||
|
}
|
||||||
|
binding.gcmEnabled = newStatus
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return binding.root
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
lifecycleScope.launchWhenResumed {
|
||||||
|
binding.gcmEnabled = GcmPrefs.get(context).isEnabled
|
||||||
|
binding.checkinEnabled = CheckinPrefs.get(context).isEnabled
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
||||||
|
super.onActivityCreated(savedInstanceState)
|
||||||
|
setHasOptionsMenu(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
||||||
|
menu.add(0, MENU_ADVANCED, 0, R.string.menu_advanced)
|
||||||
|
super.onCreateOptionsMenu(menu, inflater)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
|
return when (item.itemId) {
|
||||||
|
MENU_ADVANCED -> {
|
||||||
|
findNavController().navigate(R.id.openGcmAdvancedSettings)
|
||||||
|
true
|
||||||
|
}
|
||||||
|
else -> super.onOptionsItemSelected(item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val MENU_ADVANCED = Menu.FIRST
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,121 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.microg.gms.ui
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.os.Handler
|
||||||
|
import android.text.format.DateUtils
|
||||||
|
import androidx.core.os.bundleOf
|
||||||
|
import androidx.lifecycle.lifecycleScope
|
||||||
|
import androidx.navigation.fragment.findNavController
|
||||||
|
import androidx.preference.Preference
|
||||||
|
import androidx.preference.PreferenceCategory
|
||||||
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
|
import com.google.android.gms.R
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
import org.microg.gms.gcm.GcmDatabase
|
||||||
|
import org.microg.gms.gcm.GcmPrefs
|
||||||
|
import org.microg.gms.gcm.McsService
|
||||||
|
|
||||||
|
class PushNotificationPreferencesFragment : PreferenceFragmentCompat() {
|
||||||
|
private lateinit var pushStatusCategory: PreferenceCategory
|
||||||
|
private lateinit var pushStatus: Preference
|
||||||
|
private lateinit var pushApps: PreferenceCategory
|
||||||
|
private lateinit var pushAppsAll: Preference
|
||||||
|
private lateinit var pushAppsNone: Preference
|
||||||
|
private lateinit var database: GcmDatabase
|
||||||
|
private val handler = Handler()
|
||||||
|
private val updateRunnable = Runnable { updateStatus() }
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
database = GcmDatabase(context)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||||
|
addPreferencesFromResource(R.xml.preferences_push_notifications)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindPreferences() {
|
||||||
|
pushStatusCategory = preferenceScreen.findPreference("prefcat_push_status") ?: pushStatusCategory
|
||||||
|
pushStatus = preferenceScreen.findPreference("pref_push_status") ?: pushStatus
|
||||||
|
pushApps = preferenceScreen.findPreference("prefcat_push_apps") ?: pushApps
|
||||||
|
pushAppsAll = preferenceScreen.findPreference("pref_push_apps_all") ?: pushAppsAll
|
||||||
|
pushAppsNone = preferenceScreen.findPreference("pref_push_apps_none") ?: pushAppsNone
|
||||||
|
pushAppsAll.onPreferenceClickListener = Preference.OnPreferenceClickListener {
|
||||||
|
findNavController().navigate(R.id.openAllGcmApps)
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
updateStatus()
|
||||||
|
updateContent()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPause() {
|
||||||
|
super.onPause()
|
||||||
|
database.close()
|
||||||
|
handler.removeCallbacks(updateRunnable)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateStatus() {
|
||||||
|
handler.postDelayed(updateRunnable, UPDATE_INTERVAL)
|
||||||
|
pushStatusCategory.isVisible = GcmPrefs.get(context).isEnabled
|
||||||
|
pushStatus.summary = if (McsService.isConnected()) {
|
||||||
|
"Connected since: " + DateUtils.getRelativeTimeSpanString(McsService.getStartTimestamp(), System.currentTimeMillis(), 0)
|
||||||
|
} else {
|
||||||
|
"Disconnected"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateContent() {
|
||||||
|
lifecycleScope.launchWhenResumed {
|
||||||
|
val context = requireContext()
|
||||||
|
val (apps, showAll) = withContext(Dispatchers.IO) {
|
||||||
|
val apps = database.appList.sortedByDescending { it.lastMessageTimestamp }
|
||||||
|
val res = apps.map { app ->
|
||||||
|
try {
|
||||||
|
app to context.packageManager.getApplicationInfo(app.packageName, 0)
|
||||||
|
} catch (ignored: Exception) {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}.filterNotNull().take(3).mapIndexed { idx, (app, applicationInfo) ->
|
||||||
|
val pref = AppIconPreference(context)
|
||||||
|
pref.order = idx
|
||||||
|
pref.title = applicationInfo.loadLabel(context.packageManager)
|
||||||
|
pref.icon = applicationInfo.loadIcon(context.packageManager)
|
||||||
|
pref.onPreferenceClickListener = Preference.OnPreferenceClickListener {
|
||||||
|
findNavController().navigate(R.id.openGcmAppDetails, bundleOf(
|
||||||
|
"package" to app.packageName
|
||||||
|
))
|
||||||
|
true
|
||||||
|
}
|
||||||
|
pref.key = "pref_push_app_" + app.packageName
|
||||||
|
pref
|
||||||
|
}.let { it to (it.size < apps.size) }
|
||||||
|
database.close()
|
||||||
|
res
|
||||||
|
}
|
||||||
|
pushAppsAll.isVisible = showAll
|
||||||
|
pushApps.removeAll()
|
||||||
|
for (app in apps) {
|
||||||
|
pushApps.addPreference(app)
|
||||||
|
}
|
||||||
|
if (showAll) {
|
||||||
|
pushApps.addPreference(pushAppsAll)
|
||||||
|
} else if (apps.isEmpty()) {
|
||||||
|
pushApps.addPreference(pushAppsNone)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val UPDATE_INTERVAL = 1000L
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.microg.gms.ui
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.*
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.navigation.fragment.findNavController
|
||||||
|
import com.google.android.gms.R
|
||||||
|
import com.google.android.gms.databinding.SafetyNetFragmentBinding
|
||||||
|
import org.microg.gms.checkin.CheckinPrefs
|
||||||
|
import org.microg.gms.snet.SafetyNetPrefs
|
||||||
|
|
||||||
|
class SafetyNetFragment : Fragment(R.layout.safety_net_fragment) {
|
||||||
|
|
||||||
|
private lateinit var binding: SafetyNetFragmentBinding
|
||||||
|
|
||||||
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||||
|
binding = SafetyNetFragmentBinding.inflate(inflater, container, false)
|
||||||
|
binding.switchBarCallback = object : PreferenceSwitchBarCallback {
|
||||||
|
override fun onChecked(newStatus: Boolean) {
|
||||||
|
SafetyNetPrefs.get(requireContext()).isEnabled = newStatus
|
||||||
|
binding.safetynetEnabled = newStatus
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return binding.root
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
binding.checkinEnabled = CheckinPrefs.get(requireContext()).isEnabled
|
||||||
|
binding.safetynetEnabled = SafetyNetPrefs.get(requireContext()).isEnabled
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
||||||
|
super.onActivityCreated(savedInstanceState)
|
||||||
|
setHasOptionsMenu(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
||||||
|
menu.add(0, MENU_ADVANCED, 0, R.string.menu_advanced)
|
||||||
|
super.onCreateOptionsMenu(menu, inflater)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
|
return when (item.itemId) {
|
||||||
|
MENU_ADVANCED -> {
|
||||||
|
findNavController().navigate(R.id.openSafetyNetAdvancedSettings)
|
||||||
|
true
|
||||||
|
}
|
||||||
|
else -> super.onOptionsItemSelected(item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val MENU_ADVANCED = Menu.FIRST
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.microg.gms.ui
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
|
import com.google.android.gms.R
|
||||||
|
|
||||||
|
class SafetyNetPreferencesFragment : PreferenceFragmentCompat() {
|
||||||
|
|
||||||
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||||
|
addPreferencesFromResource(R.xml.preferences_safetynet)
|
||||||
|
}
|
||||||
|
}
|
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 169 B |
Before Width: | Height: | Size: 195 B |
Before Width: | Height: | Size: 791 B |
Before Width: | Height: | Size: 328 B |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 428 B |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 586 B |
Before Width: | Height: | Size: 3.2 KiB |
|
@ -1,13 +1,14 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:viewportWidth="24"
|
android:tint="?attr/colorControlNormal"
|
||||||
android:viewportHeight="24">
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
|
||||||
<path
|
<path
|
||||||
android:fillColor="#000000"
|
android:fillColor="#000000"
|
||||||
android:pathData="M16,12A2,2 0 0,1 18,10A2,2 0 0,1 20,12A2,2 0 0,1 18,14A2,2 0 0,1 16,12M10,12A2,2
|
android:pathData="M16,12A2,2 0 0,1 18,10A2,2 0 0,1 20,12A2,2 0 0,1 18,14A2,2 0 0,1 16,12M10,12A2,2
|
||||||
0 0,1 12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12M4,12A2,2 0 0,1
|
0 0,1 12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12M4,12A2,2 0 0,1
|
||||||
6,10A2,2 0 0,1 8,12A2,2 0 0,1 6,14A2,2 0 0,1 4,12Z" />
|
6,10A2,2 0 0,1 8,12A2,2 0 0,1 6,14A2,2 0 0,1 4,12Z" />
|
||||||
</vector>
|
</vector>
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorAccent"
|
||||||
android:viewportWidth="24"
|
android:viewportWidth="24"
|
||||||
android:viewportHeight="24">
|
android:viewportHeight="24">
|
||||||
|
|
||||||
|
@ -10,4 +11,4 @@
|
||||||
<path
|
<path
|
||||||
android:fillColor="#ff000000"
|
android:fillColor="#ff000000"
|
||||||
android:pathData="M15,12 C17.21,12,19,10.21,19,8 S17.21,4,15,4 S11,5.79,11,8 S12.79,12,15,12 Z M6,10 L6,7 L4,7 L4,10 L1,10 L1,12 L4,12 L4,15 L6,15 L6,12 L9,12 L9,10 L6,10 Z M15,14 C12.33,14,7,15.34,7,18 L7,20 L23,20 L23,18 C23,15.34,17.67,14,15,14 Z" />
|
android:pathData="M15,12 C17.21,12,19,10.21,19,8 S17.21,4,15,4 S11,5.79,11,8 S12.79,12,15,12 Z M6,10 L6,7 L4,7 L4,10 L1,10 L1,12 L4,12 L4,15 L6,15 L6,12 L9,12 L9,10 L6,10 Z M15,14 C12.33,14,7,15.34,7,18 L7,20 L23,20 L23,18 C23,15.34,17.67,14,15,14 Z" />
|
||||||
</vector>
|
</vector>
|
|
@ -1,13 +1,14 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:viewportWidth="24"
|
android:tint="?attr/colorAccent"
|
||||||
android:viewportHeight="24">
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
|
||||||
<path
|
<path
|
||||||
android:fillColor="#000000"
|
android:fillColor="#000000"
|
||||||
android:pathData="M4,3C2.89,3 2,3.89 2,5V15A2,2 0 0,0 4,17H12V22L15,19L18,22V17H20A2,2 0 0,0
|
android:pathData="M4,3C2.89,3 2,3.89 2,5V15A2,2 0 0,0 4,17H12V22L15,19L18,22V17H20A2,2 0 0,0
|
||||||
22,15V8L22,6V5A2,2 0 0,0
|
22,15V8L22,6V5A2,2 0 0,0
|
||||||
20,3H16V3H4M12,5L15,7L18,5V8.5L21,10L18,11.5V15L15,13L12,15V11.5L9,10L12,8.5V5M4,5H9V7H4V5M4,9H7V11H4V9M4,13H9V15H4V13Z" />
|
20,3H16V3H4M12,5L15,7L18,5V8.5L21,10L18,11.5V15L15,13L12,15V11.5L9,10L12,8.5V5M4,5H9V7H4V5M4,9H7V11H4V9M4,13H9V15H4V13Z" />
|
||||||
</vector>
|
</vector>
|
|
@ -1,11 +1,12 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:viewportHeight="24"
|
android:tint="?attr/colorAccent"
|
||||||
android:viewportWidth="24">
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
|
||||||
<path
|
<path
|
||||||
android:fillColor="#000000"
|
android:fillColor="#000000"
|
||||||
android:pathData="M 12 4 C 9.11 4 6.5996094 5.6392969 5.3496094 8.0292969 C 2.3396094 8.3592969 0 10.9 0 14 A 6 6 0 0 0 6 20 L 19 20 A 5 5 0 0 0 24 15 C 24 12.36 21.949609 10.219297 19.349609 10.029297 C 18.669609 6.5892969 15.64 4 12 4 z M 12 7.5 A 0.5 0.5 0 0 1 12.5 8 L 12.5 8.5390625 C 13.92 8.7790625 15 10.015 15 11.5 L 15 14.5 L 16.5 16 L 7.5 16 L 9 14.5 L 9 11.5 C 9 10.015 10.08 8.7790625 11.5 8.5390625 L 11.5 8 A 0.5 0.5 0 0 1 12 7.5 z M 11 16.5 L 13 16.5 A 1 1 0 0 1 12 17.5 A 1 1 0 0 1 11 16.5 z"/>
|
android:pathData="M 12 4 C 9.11 4 6.5996094 5.6392969 5.3496094 8.0292969 C 2.3396094 8.3592969 0 10.9 0 14 A 6 6 0 0 0 6 20 L 19 20 A 5 5 0 0 0 24 15 C 24 12.36 21.949609 10.219297 19.349609 10.029297 C 18.669609 6.5892969 15.64 4 12 4 z M 12 7.5 A 0.5 0.5 0 0 1 12.5 8 L 12.5 8.5390625 C 13.92 8.7790625 15 10.015 15 11.5 L 15 14.5 L 16.5 16 L 7.5 16 L 9 14.5 L 9 11.5 C 9 10.015 10.08 8.7790625 11.5 8.5390625 L 11.5 8 A 0.5 0.5 0 0 1 12 7.5 z M 11 16.5 L 13 16.5 A 1 1 0 0 1 12 17.5 A 1 1 0 0 1 11 16.5 z" />
|
||||||
</vector>
|
</vector>
|
|
@ -1,11 +1,12 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:viewportHeight="24"
|
android:tint="?attr/colorAccent"
|
||||||
android:viewportWidth="24">
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
|
||||||
<path
|
<path
|
||||||
android:fillColor="#000000"
|
android:fillColor="#000000"
|
||||||
android:pathData="M10,17.25V14H3V10H10V6.75L15.25,12L10,17.25M8,2H17A2,2 0 0,1 19,4V20A2,2 0 0,1 17,22H8A2,2 0 0,1 6,20V16H8V20H17V4H8V8H6V4A2,2 0 0,1 8,2Z"/>
|
android:pathData="M10,17.25V14H3V10H10V6.75L15.25,12L10,17.25M8,2H17A2,2 0 0,1 19,4V20A2,2 0 0,1 17,22H8A2,2 0 0,1 6,20V16H8V20H17V4H8V8H6V4A2,2 0 0,1 8,2Z" />
|
||||||
</vector>
|
</vector>
|
19
play-services-core/src/main/res/drawable/ic_expand_apps.xml
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ SPDX-FileCopyrightText: 2019, The Android Open Source Project
|
||||||
|
~ SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
~ SPDX-License-Identifier: Apache-2.0
|
||||||
|
-->
|
||||||
|
|
||||||
|
<vector
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:autoMirrored="true"
|
||||||
|
android:tint="?attr/colorAccent"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M9.71,18.71l-1.42,-1.42l5.3,-5.29l-5.3,-5.29l1.42,-1.42l6.7,6.71z" />
|
||||||
|
</vector>
|
17
play-services-core/src/main/res/drawable/ic_info_outline.xml
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ SPDX-FileCopyrightText: 2019, The Android Open Source Project
|
||||||
|
~ SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
~ SPDX-License-Identifier: Apache-2.0
|
||||||
|
-->
|
||||||
|
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorAccent"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M11,17h2v-6h-2v6zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2L13,7h-2v2z" />
|
||||||
|
</vector>
|
17
play-services-core/src/main/res/drawable/ic_map_marker.xml
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ SPDX-FileCopyrightText: 2019, The Android Open Source Project
|
||||||
|
~ SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
~ SPDX-License-Identifier: Apache-2.0
|
||||||
|
-->
|
||||||
|
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorAccent"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M12,11.5A2.5,2.5 0 0,1 9.5,9A2.5,2.5 0 0,1 12,6.5A2.5,2.5 0 0,1 14.5,9A2.5,2.5 0 0,1 12,11.5M12,2A7,7 0 0,0 5,9C5,14.25 12,22 12,22C12,22 19,14.25 19,9A7,7 0 0,0 12,2Z" />
|
||||||
|
</vector>
|
|
@ -48,7 +48,7 @@
|
||||||
android:layout_width="36dip"
|
android:layout_width="36dip"
|
||||||
android:layout_height="36dip"
|
android:layout_height="36dip"
|
||||||
android:scaleType="fitCenter"
|
android:scaleType="fitCenter"
|
||||||
android:src="@drawable/gcm_bell"
|
android:src="@drawable/ic_cloud_bell"
|
||||||
android:tint="?attr/colorAccent">
|
android:tint="?attr/colorAccent">
|
||||||
</ImageView>
|
</ImageView>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
~ SPDX-License-Identifier: Apache-2.0
|
||||||
|
-->
|
||||||
|
|
||||||
|
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<data>
|
||||||
|
|
||||||
|
<variable
|
||||||
|
name="checkinEnabled"
|
||||||
|
type="boolean" />
|
||||||
|
|
||||||
|
<variable
|
||||||
|
name="switchBarCallback"
|
||||||
|
type="org.microg.gms.ui.PreferenceSwitchBarCallback" />
|
||||||
|
</data>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<include
|
||||||
|
layout="@layout/preference_switch_bar"
|
||||||
|
app:callback="@{switchBarCallback}"
|
||||||
|
app:checked="@{checkinEnabled}"
|
||||||
|
app:description='@{"Register device"}'
|
||||||
|
app:enabled="@{true}" />
|
||||||
|
|
||||||
|
<androidx.fragment.app.FragmentContainerView
|
||||||
|
android:id="@+id/sub_preferences"
|
||||||
|
android:name="org.microg.gms.ui.DeviceRegistrationPreferencesFragment"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1"/>
|
||||||
|
</LinearLayout>
|
||||||
|
</layout>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
~ SPDX-License-Identifier: Apache-2.0
|
||||||
|
-->
|
||||||
|
|
||||||
|
<View xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp" />
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
~ SPDX-License-Identifier: Apache-2.0
|
||||||
|
-->
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:indeterminate="true" />
|
||||||
|
</LinearLayout>
|
|
@ -0,0 +1,73 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
~ SPDX-License-Identifier: Apache-2.0
|
||||||
|
-->
|
||||||
|
|
||||||
|
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<data>
|
||||||
|
|
||||||
|
<variable
|
||||||
|
name="checked"
|
||||||
|
type="boolean" />
|
||||||
|
|
||||||
|
<variable
|
||||||
|
name="enabled"
|
||||||
|
type="boolean" />
|
||||||
|
|
||||||
|
<variable
|
||||||
|
name="description"
|
||||||
|
type="String" />
|
||||||
|
|
||||||
|
<variable
|
||||||
|
name="callback"
|
||||||
|
type="org.microg.gms.ui.PreferenceSwitchBarCallback" />
|
||||||
|
</data>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:clickable="@{enabled}"
|
||||||
|
android:focusable="@{enabled}"
|
||||||
|
android:gravity="center"
|
||||||
|
android:onClick="@{(v) -> callback.onChecked(!Boolean.valueOf(checked))}"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingStart="?attr/listPreferredItemPaddingStart"
|
||||||
|
android:paddingLeft="?attr/listPreferredItemPaddingLeft"
|
||||||
|
android:paddingEnd="?attr/listPreferredItemPaddingEnd"
|
||||||
|
android:paddingRight="?attr/listPreferredItemPaddingRight"
|
||||||
|
app:backgroundColorAttr="@{checked ? androidx.appcompat.R.attr.colorControlActivated : (enabled ? androidx.appcompat.R.attr.colorButtonNormal : androidx.appcompat.R.attr.colorControlHighlight)}"
|
||||||
|
tools:background="?attr/colorControlActivated">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@android:id/title"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:maxLines="2"
|
||||||
|
android:paddingStart="56dp"
|
||||||
|
android:paddingLeft="56dp"
|
||||||
|
android:text="@{description}"
|
||||||
|
android:textAppearance="?attr/textAppearanceListItem"
|
||||||
|
android:textColor="?android:attr/textColorPrimaryInverse"
|
||||||
|
tools:text="Enabled" />
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.SwitchCompat
|
||||||
|
android:id="@+id/switch_widget"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:background="@null"
|
||||||
|
android:checked="@{checked}"
|
||||||
|
android:enabled="@{enabled}"
|
||||||
|
app:onCheckedChangeListener="@{(v, newStatus) -> callback.onChecked(newStatus)}"
|
||||||
|
app:thumbTint="?android:attr/textColorPrimaryInverse"
|
||||||
|
app:trackTint="?android:attr/textColorSecondaryInverse"
|
||||||
|
tools:checked="true" />
|
||||||
|
</LinearLayout>
|
||||||
|
</layout>
|
|
@ -0,0 +1,82 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
~ SPDX-License-Identifier: Apache-2.0
|
||||||
|
-->
|
||||||
|
|
||||||
|
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<data>
|
||||||
|
|
||||||
|
<variable
|
||||||
|
name="appName"
|
||||||
|
type="String" />
|
||||||
|
|
||||||
|
<variable
|
||||||
|
name="appIcon"
|
||||||
|
type="android.graphics.drawable.Drawable" />
|
||||||
|
|
||||||
|
<variable
|
||||||
|
name="callbacks"
|
||||||
|
type="org.microg.gms.ui.PushNotificationAppFragmentCallbacks" />
|
||||||
|
</data>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/colorPrimary"
|
||||||
|
android:paddingStart="?attr/listPreferredItemPaddingStart"
|
||||||
|
android:paddingLeft="?attr/listPreferredItemPaddingLeft"
|
||||||
|
android:paddingTop="24dp"
|
||||||
|
android:paddingEnd="?attr/listPreferredItemPaddingEnd"
|
||||||
|
android:paddingRight="?attr/listPreferredItemPaddingRight"
|
||||||
|
android:paddingBottom="16dp">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:gravity="center_horizontal"
|
||||||
|
android:onClick='@{() -> callbacks.onAppClicked()}'
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/icon"
|
||||||
|
android:layout_width="48dp"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:antialias="true"
|
||||||
|
android:scaleType="fitCenter"
|
||||||
|
android:src="@{appIcon}"
|
||||||
|
tools:src="@android:mipmap/sym_def_app_icon" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/title"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:ellipsize="marquee"
|
||||||
|
android:gravity="center"
|
||||||
|
android:singleLine="false"
|
||||||
|
android:text='@{appName}'
|
||||||
|
android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
|
||||||
|
android:textColor="?android:attr/textColorPrimary"
|
||||||
|
android:textSize="20sp"
|
||||||
|
tools:text="@tools:sample/lorem" />
|
||||||
|
</LinearLayout>
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
<androidx.fragment.app.FragmentContainerView
|
||||||
|
android:id="@+id/sub_preferences"
|
||||||
|
android:name="org.microg.gms.ui.PushNotificationAppPreferencesFragment"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1"/>
|
||||||
|
</LinearLayout>
|
||||||
|
</layout>
|
|
@ -0,0 +1,45 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
~ SPDX-License-Identifier: Apache-2.0
|
||||||
|
-->
|
||||||
|
|
||||||
|
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<data>
|
||||||
|
|
||||||
|
<variable
|
||||||
|
name="gcmEnabled"
|
||||||
|
type="boolean" />
|
||||||
|
|
||||||
|
<variable
|
||||||
|
name="checkinEnabled"
|
||||||
|
type="boolean" />
|
||||||
|
|
||||||
|
<variable
|
||||||
|
name="switchBarCallback"
|
||||||
|
type="org.microg.gms.ui.PreferenceSwitchBarCallback" />
|
||||||
|
</data>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<include
|
||||||
|
layout="@layout/preference_switch_bar"
|
||||||
|
app:callback="@{switchBarCallback}"
|
||||||
|
app:checked="@{gcmEnabled}"
|
||||||
|
app:description='@{"Receive push notifications"}'
|
||||||
|
app:enabled="@{checkinEnabled}" />
|
||||||
|
|
||||||
|
<androidx.fragment.app.FragmentContainerView
|
||||||
|
android:id="@+id/sub_preferences"
|
||||||
|
android:name="org.microg.gms.ui.PushNotificationPreferencesFragment"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1"/>
|
||||||
|
</LinearLayout>
|
||||||
|
</layout>
|
|
@ -0,0 +1,45 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
~ SPDX-License-Identifier: Apache-2.0
|
||||||
|
-->
|
||||||
|
|
||||||
|
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<data>
|
||||||
|
|
||||||
|
<variable
|
||||||
|
name="checkinEnabled"
|
||||||
|
type="boolean" />
|
||||||
|
|
||||||
|
<variable
|
||||||
|
name="safetynetEnabled"
|
||||||
|
type="boolean" />
|
||||||
|
|
||||||
|
<variable
|
||||||
|
name="switchBarCallback"
|
||||||
|
type="org.microg.gms.ui.PreferenceSwitchBarCallback" />
|
||||||
|
</data>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<include
|
||||||
|
layout="@layout/preference_switch_bar"
|
||||||
|
app:callback="@{switchBarCallback}"
|
||||||
|
app:checked="@{safetynetEnabled}"
|
||||||
|
app:description='@{"Allow device attestation"}'
|
||||||
|
app:enabled="@{checkinEnabled}" />
|
||||||
|
|
||||||
|
<androidx.fragment.app.FragmentContainerView
|
||||||
|
android:id="@+id/sub_preferences"
|
||||||
|
android:name="org.microg.gms.ui.SafetyNetPreferencesFragment"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1"/>
|
||||||
|
</LinearLayout>
|
||||||
|
</layout>
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
~ SPDX-License-Identifier: Apache-2.0
|
||||||
|
-->
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<androidx.fragment.app.FragmentContainerView
|
||||||
|
android:id="@+id/navhost"
|
||||||
|
android:name="androidx.navigation.fragment.NavHostFragment"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:defaultNavHost="true"
|
||||||
|
app:navGraph="@navigation/nav_settings" />
|
||||||
|
</LinearLayout>
|
152
play-services-core/src/main/res/navigation/nav_settings.xml
Normal file
|
@ -0,0 +1,152 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/nav_settings"
|
||||||
|
app:startDestination="@id/settingsFragment">
|
||||||
|
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/settingsFragment"
|
||||||
|
android:name="org.microg.gms.ui.SettingsFragment"
|
||||||
|
android:label="@string/gms_settings_name">
|
||||||
|
<action
|
||||||
|
android:id="@+id/openUnifiedNlpSettings"
|
||||||
|
app:destination="@id/nav_unlp"
|
||||||
|
app:enterAnim="@anim/fragment_open_enter"
|
||||||
|
app:exitAnim="@anim/fragment_open_exit"
|
||||||
|
app:popEnterAnim="@anim/fragment_close_enter"
|
||||||
|
app:popExitAnim="@anim/fragment_close_exit" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/openSelfcheck"
|
||||||
|
app:destination="@id/selfcheckFragment"
|
||||||
|
app:enterAnim="@anim/fragment_open_enter"
|
||||||
|
app:exitAnim="@anim/fragment_open_exit"
|
||||||
|
app:popEnterAnim="@anim/fragment_close_enter"
|
||||||
|
app:popExitAnim="@anim/fragment_close_exit" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/openCheckinSettings"
|
||||||
|
app:destination="@id/checkinFragment"
|
||||||
|
app:enterAnim="@anim/fragment_open_enter"
|
||||||
|
app:exitAnim="@anim/fragment_open_exit"
|
||||||
|
app:popEnterAnim="@anim/fragment_close_enter"
|
||||||
|
app:popExitAnim="@anim/fragment_close_exit" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/openGcmSettings"
|
||||||
|
app:destination="@id/gcmFragment"
|
||||||
|
app:enterAnim="@anim/fragment_open_enter"
|
||||||
|
app:exitAnim="@anim/fragment_open_exit"
|
||||||
|
app:popEnterAnim="@anim/fragment_close_enter"
|
||||||
|
app:popExitAnim="@anim/fragment_close_exit" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/openSafetyNetSettings"
|
||||||
|
app:destination="@id/safetyNetFragment"
|
||||||
|
app:enterAnim="@anim/fragment_open_enter"
|
||||||
|
app:exitAnim="@anim/fragment_open_exit"
|
||||||
|
app:popEnterAnim="@anim/fragment_close_enter"
|
||||||
|
app:popExitAnim="@anim/fragment_close_exit" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/openMoreGoogleSettings"
|
||||||
|
app:destination="@id/googleMoreFragment"
|
||||||
|
app:enterAnim="@anim/fragment_open_enter"
|
||||||
|
app:exitAnim="@anim/fragment_open_exit"
|
||||||
|
app:popEnterAnim="@anim/fragment_close_enter"
|
||||||
|
app:popExitAnim="@anim/fragment_close_exit" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/openAbout"
|
||||||
|
app:destination="@id/aboutFragment"
|
||||||
|
app:enterAnim="@anim/fragment_open_enter"
|
||||||
|
app:exitAnim="@anim/fragment_open_exit"
|
||||||
|
app:popEnterAnim="@anim/fragment_close_enter"
|
||||||
|
app:popExitAnim="@anim/fragment_close_exit" />
|
||||||
|
</fragment>
|
||||||
|
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/selfcheckFragment"
|
||||||
|
android:name="org.microg.gms.ui.SelfCheckFragment"
|
||||||
|
android:label="@string/self_check_title" />
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/checkinFragment"
|
||||||
|
android:name="org.microg.gms.ui.DeviceRegistrationFragment"
|
||||||
|
android:label="@string/service_name_checkin"
|
||||||
|
tools:layout="@layout/device_registration_fragment" />
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/gcmFragment"
|
||||||
|
android:name="org.microg.gms.ui.PushNotificationFragment"
|
||||||
|
android:label="@string/service_name_mcs"
|
||||||
|
tools:layout="@layout/push_notification_fragment">
|
||||||
|
<action
|
||||||
|
android:id="@+id/openGcmAppDetails"
|
||||||
|
app:destination="@id/gcmAppFragment"
|
||||||
|
app:enterAnim="@anim/fragment_open_enter"
|
||||||
|
app:exitAnim="@anim/fragment_open_exit"
|
||||||
|
app:popEnterAnim="@anim/fragment_close_enter"
|
||||||
|
app:popExitAnim="@anim/fragment_close_exit" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/openAllGcmApps"
|
||||||
|
app:destination="@id/gcmAllAppsFragment"
|
||||||
|
app:enterAnim="@anim/fragment_open_enter"
|
||||||
|
app:exitAnim="@anim/fragment_open_exit"
|
||||||
|
app:popEnterAnim="@anim/fragment_close_enter"
|
||||||
|
app:popExitAnim="@anim/fragment_close_exit" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/openGcmAdvancedSettings"
|
||||||
|
app:destination="@id/gcmAdvancedFragment"
|
||||||
|
app:enterAnim="@anim/fragment_open_enter"
|
||||||
|
app:exitAnim="@anim/fragment_open_exit"
|
||||||
|
app:popEnterAnim="@anim/fragment_close_enter"
|
||||||
|
app:popExitAnim="@anim/fragment_close_exit" />
|
||||||
|
</fragment>
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/gcmAllAppsFragment"
|
||||||
|
android:name="org.microg.gms.ui.PushNotificationAllAppsFragment"
|
||||||
|
android:label="Apps using push notifications">
|
||||||
|
<action
|
||||||
|
android:id="@+id/openGcmAppDetailsFromAll"
|
||||||
|
app:destination="@id/gcmAppFragment"
|
||||||
|
app:enterAnim="@anim/fragment_open_enter"
|
||||||
|
app:exitAnim="@anim/fragment_open_exit"
|
||||||
|
app:popEnterAnim="@anim/fragment_close_enter"
|
||||||
|
app:popExitAnim="@anim/fragment_close_exit" />
|
||||||
|
</fragment>
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/gcmAppFragment"
|
||||||
|
android:name="org.microg.gms.ui.PushNotificationAppFragment"
|
||||||
|
android:label="@string/service_name_mcs"
|
||||||
|
tools:layout="@layout/push_notification_app_fragment">
|
||||||
|
<argument
|
||||||
|
android:name="package"
|
||||||
|
app:argType="string" />
|
||||||
|
</fragment>
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/gcmAdvancedFragment"
|
||||||
|
android:name="org.microg.gms.ui.GcmAdvancedFragment"
|
||||||
|
android:label="@string/service_name_mcs" />
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/safetyNetFragment"
|
||||||
|
android:name="org.microg.gms.ui.SafetyNetFragment"
|
||||||
|
android:label="@string/service_name_snet">
|
||||||
|
<action
|
||||||
|
android:id="@+id/openSafetyNetAdvancedSettings"
|
||||||
|
app:destination="@id/safetyNetAdvancedFragment"
|
||||||
|
app:enterAnim="@anim/fragment_open_enter"
|
||||||
|
app:exitAnim="@anim/fragment_open_exit"
|
||||||
|
app:popEnterAnim="@anim/fragment_close_enter"
|
||||||
|
app:popExitAnim="@anim/fragment_close_exit" />
|
||||||
|
</fragment>
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/safetyNetAdvancedFragment"
|
||||||
|
android:name="org.microg.gms.ui.SafetyNetAdvancedFragment"
|
||||||
|
android:label="@string/service_name_snet" />
|
||||||
|
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/googleMoreFragment"
|
||||||
|
android:name="org.microg.gms.ui.GoogleMoreFragment"
|
||||||
|
android:label="@string/gms_settings_name" />
|
||||||
|
|
||||||
|
<include app:graph="@navigation/nav_unlp" />
|
||||||
|
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/aboutFragment"
|
||||||
|
android:name="org.microg.gms.ui.AboutFragment"
|
||||||
|
android:label="@string/prefcat_about" />
|
||||||
|
</navigation>
|
|
@ -61,6 +61,8 @@ This can take a couple of minutes."</string>
|
||||||
<string name="service_status_enabled">Enabled</string>
|
<string name="service_status_enabled">Enabled</string>
|
||||||
<string name="service_status_automatic">Automatic</string>
|
<string name="service_status_automatic">Automatic</string>
|
||||||
<string name="service_status_manual">Manual</string>
|
<string name="service_status_manual">Manual</string>
|
||||||
|
<string name="service_status_enabled_short">On</string>
|
||||||
|
<string name="service_status_disabled_short">Off</string>
|
||||||
|
|
||||||
<string name="menu_advanced">Advanced</string>
|
<string name="menu_advanced">Advanced</string>
|
||||||
<string name="list_no_item_none">None</string>
|
<string name="list_no_item_none">None</string>
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
~ Copyright (C) 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<Preference
|
|
||||||
android:selectable="false"
|
|
||||||
android:summary="@string/pref_checkin_enable_summary"/>
|
|
||||||
</PreferenceScreen>
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ SPDX-FileCopyrightText: 2017, microG Project Team
|
||||||
|
~ SPDX-License-Identifier: Apache-2.0
|
||||||
|
-->
|
||||||
|
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<PreferenceCategory
|
||||||
|
android:key="prefcat_device_registration_status"
|
||||||
|
android:layout="@layout/preference_category_no_label">
|
||||||
|
<Preference
|
||||||
|
android:key="pref_device_registration_status"
|
||||||
|
android:selectable="false"
|
||||||
|
android:title="Status"
|
||||||
|
tools:summary="Last registration: 13 hours ago" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
<PreferenceCategory android:layout="@layout/preference_category_no_label">
|
||||||
|
<Preference
|
||||||
|
android:icon="@drawable/ic_info_outline"
|
||||||
|
android:selectable="false"
|
||||||
|
android:summary="@string/pref_checkin_enable_summary" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
</PreferenceScreen>
|
|
@ -1,35 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
|
|
||||||
<PreferenceCategory
|
|
||||||
android:title="Messaging">
|
|
||||||
|
|
||||||
<SwitchPreference
|
|
||||||
android:defaultValue="true"
|
|
||||||
android:key="gcm_app_wake_for_delivery"
|
|
||||||
android:persistent="false"
|
|
||||||
android:summary="Start the app in background to receive the incoming push messages. Disabling this might delay message delivery up to the moment the app is started or cause complete message loss."
|
|
||||||
android:title="Start app on push message"/>
|
|
||||||
|
|
||||||
<Preference
|
|
||||||
android:selectable="false"
|
|
||||||
android:key="gcm_app_message_details"
|
|
||||||
android:summary="Messages: 1000 (37 MB)\nLast message: 22 min ago"/>
|
|
||||||
</PreferenceCategory>
|
|
||||||
|
|
||||||
<PreferenceCategory
|
|
||||||
android:title="Registration">
|
|
||||||
|
|
||||||
<SwitchPreference
|
|
||||||
android:defaultValue="true"
|
|
||||||
android:key="gcm_app_allow_register"
|
|
||||||
android:persistent="false"
|
|
||||||
android:summary="Allow the app to register for push notifications."
|
|
||||||
android:title="Allow registration"/>
|
|
||||||
|
|
||||||
<Preference
|
|
||||||
android:title="Unregister"
|
|
||||||
android:key="gcm_app_register_details"
|
|
||||||
android:summary="Registered since: 3 month ago"/>
|
|
||||||
</PreferenceCategory>
|
|
||||||
</PreferenceScreen>
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
~ SPDX-License-Identifier: Apache-2.0
|
||||||
|
-->
|
||||||
|
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:title="Push notifications">
|
||||||
|
<PreferenceCategory
|
||||||
|
android:key="prefcat_push_apps"
|
||||||
|
android:title="Apps using push notifications">
|
||||||
|
<Preference
|
||||||
|
android:enabled="false"
|
||||||
|
android:key="pref_push_apps_none"
|
||||||
|
android:title="No apps"
|
||||||
|
tools:isPreferenceVisible="true" />
|
||||||
|
<Preference
|
||||||
|
android:icon="@drawable/ic_expand_apps"
|
||||||
|
android:key="pref_push_apps_all"
|
||||||
|
android:order="5"
|
||||||
|
android:title="See all" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
<PreferenceCategory
|
||||||
|
android:key="prefcat_push_status"
|
||||||
|
android:layout="@layout/preference_category_no_label">
|
||||||
|
<Preference
|
||||||
|
android:key="pref_push_status"
|
||||||
|
android:selectable="false"
|
||||||
|
android:title="Status"
|
||||||
|
tools:summary="Connected since 15 minutes ago" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
<PreferenceCategory android:layout="@layout/preference_category_no_label">
|
||||||
|
<Preference
|
||||||
|
android:icon="@drawable/ic_info_outline"
|
||||||
|
android:selectable="false"
|
||||||
|
android:summary="@string/pref_gcm_enable_mcs_summary" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
</PreferenceScreen>
|
|
@ -0,0 +1,39 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
~ SPDX-License-Identifier: Apache-2.0
|
||||||
|
-->
|
||||||
|
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:title="Apps using push notifications">
|
||||||
|
<Preference
|
||||||
|
android:key="pref_push_apps_all_progress"
|
||||||
|
android:layout="@layout/preference_progress_bar"
|
||||||
|
app:allowDividerBelow="false" />
|
||||||
|
<PreferenceCategory
|
||||||
|
android:key="prefcat_push_apps_registered"
|
||||||
|
android:title="Registered apps"
|
||||||
|
app:isPreferenceVisible="false"
|
||||||
|
tools:isPreferenceVisible="true">
|
||||||
|
<Preference
|
||||||
|
android:enabled="false"
|
||||||
|
android:key="pref_push_apps_registered_none"
|
||||||
|
android:title="No apps"
|
||||||
|
app:isPreferenceVisible="false"
|
||||||
|
tools:isPreferenceVisible="true" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
<PreferenceCategory
|
||||||
|
android:key="prefcat_push_apps_unregistered"
|
||||||
|
android:title="Unregistered apps"
|
||||||
|
app:isPreferenceVisible="false"
|
||||||
|
tools:isPreferenceVisible="true">
|
||||||
|
<Preference
|
||||||
|
android:enabled="false"
|
||||||
|
android:key="pref_push_apps_unregistered_none"
|
||||||
|
android:title="No apps"
|
||||||
|
app:isPreferenceVisible="false"
|
||||||
|
tools:isPreferenceVisible="true" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
</PreferenceScreen>
|
|
@ -0,0 +1,43 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ SPDX-FileCopyrightText: 2020, microG Project Team
|
||||||
|
~ SPDX-License-Identifier: Apache-2.0
|
||||||
|
-->
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<PreferenceCategory
|
||||||
|
android:key="prefcat_push_app_settings"
|
||||||
|
android:layout="@layout/preference_category_no_label">
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:key="pref_push_app_allow_register"
|
||||||
|
android:persistent="false"
|
||||||
|
android:summary="Allow the app to register for push notifications."
|
||||||
|
android:title="Allow registration" />
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:key="pref_push_app_wake_for_delivery"
|
||||||
|
android:persistent="false"
|
||||||
|
android:summary="Start the app while in background to receive the incoming push messages."
|
||||||
|
android:title="Start app on push message" />
|
||||||
|
|
||||||
|
</PreferenceCategory>
|
||||||
|
|
||||||
|
<PreferenceCategory
|
||||||
|
android:key="prefcat_push_app_unregister"
|
||||||
|
android:layout="@layout/preference_category_no_label">
|
||||||
|
<Preference
|
||||||
|
android:key="pref_push_app_unregister"
|
||||||
|
android:title="Unregister" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
|
||||||
|
<PreferenceCategory android:layout="@layout/preference_category_no_label">
|
||||||
|
<Preference
|
||||||
|
android:key="pref_push_app_status"
|
||||||
|
android:selectable="false"
|
||||||
|
tools:summary="Messages: 1000 (37 MB)\nLast message: 22 min ago\nRegistered since: 3 month ago" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
</PreferenceScreen>
|
|
@ -16,16 +16,20 @@
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<PreferenceScreen
|
<PreferenceScreen
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
<org.microg.tools.ui.LongTextPreference
|
<org.microg.tools.ui.LongTextPreference
|
||||||
android:selectable="false"
|
android:icon="@drawable/ic_info_outline"
|
||||||
android:key="pref_snet_summary"
|
android:key="pref_snet_summary"
|
||||||
android:summary="@string/snet_intro"/>
|
android:selectable="false"
|
||||||
<PreferenceCategory android:title="@string/prefcat_test">
|
android:summary="@string/snet_intro" />
|
||||||
|
<PreferenceCategory
|
||||||
|
android:title="@string/prefcat_test"
|
||||||
|
app:isPreferenceVisible="false">
|
||||||
<Preference
|
<Preference
|
||||||
android:enabled="false"
|
android:enabled="false"
|
||||||
android:key="pref_snet_run_attest"
|
android:key="pref_snet_run_attest"
|
||||||
android:summary="Not yet available"
|
android:summary="Not yet available"
|
||||||
android:title="@string/pref_snet_testdrive_title"/>
|
android:title="@string/pref_snet_testdrive_title" />
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
|
@ -14,75 +14,59 @@
|
||||||
~ limitations under the License.
|
~ limitations under the License.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
<PreferenceCategory android:title="@string/prefcat_setup">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
<org.microg.tools.ui.TintIconPreference
|
<PreferenceCategory android:layout="@layout/preference_category_no_label">
|
||||||
|
<Preference
|
||||||
android:icon="@drawable/self_check"
|
android:icon="@drawable/self_check"
|
||||||
android:summary="@string/self_check_desc"
|
android:summary="@string/self_check_desc"
|
||||||
android:title="@string/self_check_title">
|
android:title="@string/self_check_title">
|
||||||
<intent
|
<intent
|
||||||
android:targetClass="org.microg.gms.ui.SelfCheckFragment$AsActivity"
|
android:targetClass="org.microg.gms.ui.SelfCheckFragment$AsActivity"
|
||||||
android:targetPackage="com.google.android.gms"/>
|
android:targetPackage="com.google.android.gms" />
|
||||||
</org.microg.tools.ui.TintIconPreference>
|
</Preference>
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
<PreferenceCategory android:title="@string/prefcat_google_services">
|
<PreferenceCategory android:title="@string/prefcat_google_services">
|
||||||
<org.microg.tools.ui.TintIconPreference
|
<Preference
|
||||||
android:icon="@drawable/add_account"
|
android:icon="@drawable/ic_add_account"
|
||||||
android:summary="@string/pref_add_account_summary"
|
android:summary="@string/pref_add_account_summary"
|
||||||
android:title="@string/pref_add_account_title">
|
android:title="@string/pref_add_account_title">
|
||||||
<intent
|
<intent
|
||||||
android:targetClass="org.microg.gms.auth.login.LoginActivity"
|
android:targetClass="org.microg.gms.auth.login.LoginActivity"
|
||||||
android:targetPackage="com.google.android.gms"/>
|
android:targetPackage="com.google.android.gms" />
|
||||||
</org.microg.tools.ui.TintIconPreference>
|
</Preference>
|
||||||
<org.microg.tools.ui.TintIconPreference
|
<Preference
|
||||||
android:icon="@drawable/device_login"
|
android:icon="@drawable/ic_device_login"
|
||||||
android:key="pref_checkin"
|
android:key="pref_checkin"
|
||||||
android:title="@string/service_name_checkin">
|
android:title="@string/service_name_checkin" />
|
||||||
<intent
|
<Preference
|
||||||
android:targetClass="org.microg.gms.ui.CheckinFragment$AsActivity"
|
android:icon="@drawable/ic_cloud_bell"
|
||||||
android:targetPackage="com.google.android.gms"/>
|
|
||||||
</org.microg.tools.ui.TintIconPreference>
|
|
||||||
<org.microg.tools.ui.TintIconPreference
|
|
||||||
android:icon="@drawable/gcm_bell"
|
|
||||||
android:key="pref_gcm"
|
android:key="pref_gcm"
|
||||||
android:title="@string/service_name_mcs">
|
android:title="@string/service_name_mcs" />
|
||||||
<intent
|
<Preference
|
||||||
android:targetClass="org.microg.gms.ui.GcmFragment$AsActivity"
|
android:icon="@drawable/ic_certificate"
|
||||||
android:targetPackage="com.google.android.gms"/>
|
|
||||||
</org.microg.tools.ui.TintIconPreference>
|
|
||||||
<org.microg.tools.ui.TintIconPreference
|
|
||||||
android:icon="@drawable/certificate"
|
|
||||||
android:key="pref_snet"
|
android:key="pref_snet"
|
||||||
android:title="@string/service_name_snet">
|
android:title="@string/service_name_snet" />
|
||||||
<intent
|
<Preference
|
||||||
android:targetClass="org.microg.gms.ui.SafetyNetFragment$AsActivity"
|
|
||||||
android:targetPackage="com.google.android.gms"/>
|
|
||||||
</org.microg.tools.ui.TintIconPreference>
|
|
||||||
<org.microg.tools.ui.TintIconPreference
|
|
||||||
android:icon="@drawable/dots_horizontal"
|
android:icon="@drawable/dots_horizontal"
|
||||||
android:key="pref_google_more"
|
android:key="pref_google_more"
|
||||||
android:title="@string/pref_more_settings">
|
android:title="@string/pref_more_settings"
|
||||||
|
app:isPreferenceVisible="false">
|
||||||
<intent
|
<intent
|
||||||
android:targetClass="org.microg.gms.ui.GoogleMoreFragment$AsActivity"
|
android:targetClass="org.microg.gms.ui.GoogleMoreFragment$AsActivity"
|
||||||
android:targetPackage="com.google.android.gms"/>
|
android:targetPackage="com.google.android.gms" />
|
||||||
</org.microg.tools.ui.TintIconPreference>
|
</Preference>
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
<PreferenceCategory android:title="@string/prefcat_configuration">
|
<PreferenceCategory android:layout="@layout/preference_category_no_label">
|
||||||
<org.microg.tools.ui.TintIconPreference
|
<Preference
|
||||||
|
android:icon="@drawable/ic_map_marker"
|
||||||
android:key="pref_unifiednlp"
|
android:key="pref_unifiednlp"
|
||||||
android:title="UnifiedNlp">
|
android:title="@string/nlp_backends_title" />
|
||||||
<intent
|
|
||||||
android:targetClass="org.microg.nlp.ui.BackendSettingsActivity"
|
|
||||||
android:targetPackage="com.google.android.gms"/>
|
|
||||||
</org.microg.tools.ui.TintIconPreference>
|
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
<PreferenceCategory android:title="@string/prefcat_about">
|
<PreferenceCategory android:layout="@layout/preference_category_no_label">
|
||||||
<org.microg.tools.ui.TintIconPreference
|
<Preference
|
||||||
|
android:icon="@drawable/ic_info_outline"
|
||||||
android:key="pref_about"
|
android:key="pref_about"
|
||||||
android:title="@string/pref_about_title">
|
android:title="@string/pref_about_title" />
|
||||||
<intent
|
|
||||||
android:targetClass="org.microg.gms.ui.AboutFragment$AsActivity"
|
|
||||||
android:targetPackage="com.google.android.gms"/>
|
|
||||||
</org.microg.tools.ui.TintIconPreference>
|
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
|