Debloat + Cleanup + Readme update

This commit is contained in:
Oizaro 2020-10-21 01:39:47 +02:00
parent 513464e91f
commit fdb3ee3b06
26 changed files with 41 additions and 671 deletions

View File

@ -16,13 +16,14 @@ This fork tweaks MicroG to be usable by applications that require Google authent
- Analytics - Analytics
- Car - Car
- Droidguard - Droidguard
- Exposure-notifications - Exposure-Notifications
- Feedback - Feedback
- Firebase - Firebase
- Games - Games
- Location - Location
- Maps - Maps
- Recovery - Recovery
- Registering app permissions
- SafetyNet - SafetyNet
- Self-Check - Self-Check
- Search - Search

View File

@ -1,271 +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.auth;
import android.accounts.Account;
import android.accounts.AccountAuthenticatorActivity;
import android.accounts.AccountManager;
import android.app.NotificationManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.mgoogle.android.gms.R;
import org.microg.gms.common.PackageUtils;
import org.microg.gms.people.PeopleManager;
import java.io.IOException;
import static android.accounts.AccountManager.KEY_ACCOUNT_NAME;
import static android.accounts.AccountManager.KEY_ACCOUNT_TYPE;
import static android.accounts.AccountManager.KEY_ANDROID_PACKAGE_NAME;
import static android.accounts.AccountManager.KEY_AUTHTOKEN;
import static android.accounts.AccountManager.KEY_CALLER_PID;
import static android.accounts.AccountManager.KEY_CALLER_UID;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
public class AskPermissionActivity extends AccountAuthenticatorActivity {
public static final String EXTRA_FROM_ACCOUNT_MANAGER = "from_account_manager";
public static final String EXTRA_CONSENT_DATA = "consent_data";
private static final String TAG = "GmsAuthAskPermission";
private Account account;
private String packageName;
private String service;
private AuthManager authManager;
private ConsentData consentData;
private boolean fromAccountManager = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ask_permission);
// This makes the dialog take up the full width
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(getWindow().getAttributes());
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
getWindow().setAttributes(lp);
account = new Account(getIntent().getStringExtra(KEY_ACCOUNT_NAME),
getIntent().getStringExtra(KEY_ACCOUNT_TYPE));
packageName = getIntent().getStringExtra(KEY_ANDROID_PACKAGE_NAME);
service = getIntent().getStringExtra(KEY_AUTHTOKEN);
if (getIntent().hasExtra(EXTRA_CONSENT_DATA)) {
try {
consentData = ConsentData.ADAPTER.decode(getIntent().getByteArrayExtra(EXTRA_CONSENT_DATA));
} catch (Exception e) {
Log.w(TAG, e);
}
} else {
Log.d(TAG, "No Consent details attached");
}
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.cancel(packageName.hashCode());
if (getIntent().hasExtra(EXTRA_FROM_ACCOUNT_MANAGER)) fromAccountManager = true;
int callerUid = getIntent().getIntExtra(KEY_CALLER_UID, 0);
packageName = PackageUtils.getAndCheckPackage(this, packageName, getIntent().getIntExtra(KEY_CALLER_UID, 0), getIntent().getIntExtra(KEY_CALLER_PID, 0));
authManager = new AuthManager(this, account.name, packageName, service);
// receive package info
PackageManager packageManager = getPackageManager();
ApplicationInfo applicationInfo;
try {
applicationInfo = packageManager.getApplicationInfo(packageName, 0);
} catch (PackageManager.NameNotFoundException e) {
Log.w(TAG, e);
finish();
return;
}
CharSequence appLabel = packageManager.getApplicationLabel(applicationInfo);
Drawable appIcon = packageManager.getApplicationIcon(applicationInfo);
Bitmap profileIcon = PeopleManager.getOwnerAvatarBitmap(this, account.name, false);
// receive profile icon
if (profileIcon != null) {
((ImageView) findViewById(R.id.account_photo)).setImageBitmap(profileIcon);
} else {
new Thread(() -> {
final Bitmap profileIcon1 = PeopleManager.getOwnerAvatarBitmap(AskPermissionActivity.this, account.name, true);
runOnUiThread(() -> ((ImageView) findViewById(R.id.account_photo)).setImageBitmap(profileIcon1));
}).start();
}
((ImageView) findViewById(R.id.app_icon)).setImageDrawable(appIcon);
if (isOAuth()) {
((TextView) findViewById(R.id.title)).setText(getString(R.string.ask_scope_permission_title, appLabel));
} else {
((TextView) findViewById(R.id.title)).setText(getString(R.string.ask_service_permission_title, appLabel));
}
findViewById(android.R.id.button1).setOnClickListener(v -> onAllow());
findViewById(android.R.id.button2).setOnClickListener(v -> onDeny());
((ListView) findViewById(R.id.permissions)).setAdapter(new PermissionAdapter());
}
public void onAllow() {
authManager.setPermitted(true);
findViewById(android.R.id.button1).setEnabled(false);
findViewById(android.R.id.button2).setEnabled(false);
findViewById(R.id.progress_bar).setVisibility(VISIBLE);
findViewById(R.id.no_progress_bar).setVisibility(GONE);
new Thread(() -> {
try {
AuthResponse response = authManager.requestAuth(fromAccountManager);
Bundle result = new Bundle();
result.putString(KEY_AUTHTOKEN, response.auth);
result.putString(KEY_ACCOUNT_NAME, account.name);
result.putString(KEY_ACCOUNT_TYPE, account.type);
result.putString(KEY_ANDROID_PACKAGE_NAME, packageName);
result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true);
setAccountAuthenticatorResult(result);
} catch (IOException e) {
Log.w(TAG, e);
}
finish();
}).start();
}
public void onDeny() {
authManager.setPermitted(false);
finish();
}
@Override
public void finish() {
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.cancel(packageName.hashCode());
super.finish();
}
private boolean isOAuth() {
return service.startsWith("oauth2:") || service.startsWith("oauth:");
}
private String getScopeLabel(String scope) {
if (consentData != null) {
for (ConsentData.ScopeDetails scopeDetails : consentData.scopes) {
if (scope.equals(scopeDetails.id)) {
return scopeDetails.title;
}
}
}
String labelResourceId = "permission_scope_";
String escapedScope = scope.replace("/", "_").replace("-", "_");
if (scope.startsWith("https://")) {
labelResourceId += escapedScope.substring(8);
} else {
labelResourceId += escapedScope;
}
int labelResource = getResources().getIdentifier(labelResourceId, "string", getPackageName());
if (labelResource != 0) {
return getString(labelResource);
}
return "unknown";
}
private String getScopeDescription(String scope) {
if (consentData != null) {
for (ConsentData.ScopeDetails scopeDetails : consentData.scopes) {
if (scope.equals(scopeDetails.id)) {
return scopeDetails.description;
}
}
}
return null;
}
private String getServiceLabel(String service) {
int labelResource = getResources().getIdentifier("permission_service_" + service + "_label", "string", getPackageName());
if (labelResource != 0) {
return getString(labelResource);
}
return "unknown";
}
private class PermissionAdapter extends BaseAdapter {
@Override
public int getCount() {
if (isOAuth()) {
return service.split(" ").length;
}
return 1;
}
@Override
public String getItem(int position) {
if (isOAuth()) {
String tokens = service.split(":", 2)[1];
return tokens.split(" ")[position];
}
return service;
}
@Override
public long getItemId(int position) {
return getItem(position).hashCode();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String item = getItem(position);
String label;
String description;
if (isOAuth()) {
label = getScopeLabel(item);
description = getScopeDescription(item);
} else {
label = getServiceLabel(item);
description = null;
}
View view = convertView;
if (view == null) {
view = LayoutInflater.from(AskPermissionActivity.this)
.inflate(R.layout.ask_permission_list_entry, parent, false);
}
((TextView) view.findViewById(android.R.id.text1)).setText(label);
TextView textView = (TextView) view.findViewById(android.R.id.text2);
if (description != null && !description.isEmpty()) {
textView.setText(Html.fromHtml(description.trim().replace("\n", "<br>")));
textView.setVisibility(VISIBLE);
} else {
textView.setVisibility(GONE);
}
return view;
}
}
}

View File

@ -49,7 +49,6 @@ import static android.accounts.AccountManager.KEY_ACCOUNT_NAME;
import static android.accounts.AccountManager.KEY_ACCOUNT_TYPE; import static android.accounts.AccountManager.KEY_ACCOUNT_TYPE;
import static android.accounts.AccountManager.KEY_AUTHTOKEN; import static android.accounts.AccountManager.KEY_AUTHTOKEN;
import static android.accounts.AccountManager.KEY_CALLER_PID; import static android.accounts.AccountManager.KEY_CALLER_PID;
import static org.microg.gms.auth.AskPermissionActivity.EXTRA_CONSENT_DATA;
public class AuthManagerServiceImpl extends IAuthManagerService.Stub { public class AuthManagerServiceImpl extends IAuthManagerService.Stub {
private static final String TAG = "GmsAuthManagerSvc"; private static final String TAG = "GmsAuthManagerSvc";
@ -103,30 +102,6 @@ public class AuthManagerServiceImpl extends IAuthManagerService.Stub {
details.putParcelable("TokenData", new TokenData(res.auth, res.expiry, scope.startsWith("oauth2:"), getScopes(scope))); details.putParcelable("TokenData", new TokenData(res.auth, res.expiry, scope.startsWith("oauth2:"), getScopes(scope)));
result.putBundle("tokenDetails", details); result.putBundle("tokenDetails", details);
result.putString(KEY_ERROR, "OK"); result.putString(KEY_ERROR, "OK");
} else {
result.putString(KEY_ERROR, "NeedPermission");
Intent i = new Intent(context, AskPermissionActivity.class);
i.putExtras(extras);
i.putExtra(KEY_ANDROID_PACKAGE_NAME, packageName);
i.putExtra(KEY_ACCOUNT_TYPE, authManager.getAccountType());
i.putExtra(KEY_ACCOUNT_NAME, accountName);
i.putExtra(KEY_AUTHTOKEN, scope);
try {
if (res.consentDataBase64 != null)
i.putExtra(EXTRA_CONSENT_DATA, Base64.decode(res.consentDataBase64, Base64.URL_SAFE));
} catch (Exception e) {
Log.w(TAG, "Can't decode consent data: ", e);
}
if (notify && NotificationManagerCompat.from(context.getApplicationContext()).areNotificationsEnabled()) {
NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(packageName.hashCode(), new NotificationCompat.Builder(context)
.setContentIntent(PendingIntent.getActivity(context, 0, i, 0))
.setContentTitle(context.getString(R.string.auth_notification_title))
.setContentText(context.getString(R.string.auth_notification_content, getPackageLabel(packageName, context.getPackageManager())))
.setSmallIcon(android.R.drawable.stat_notify_error)
.build());
}
result.putParcelable(KEY_USER_RECOVERY_INTENT, i);
} }
} catch (IOException e) { } catch (IOException e) {
Log.w(TAG, e); Log.w(TAG, e);

View File

@ -27,7 +27,6 @@ import android.os.Bundle;
import android.util.Base64; import android.util.Base64;
import android.util.Log; import android.util.Log;
import org.microg.gms.auth.AskPermissionActivity;
import org.microg.gms.auth.AuthConstants; import org.microg.gms.auth.AuthConstants;
import org.microg.gms.auth.AuthManager; import org.microg.gms.auth.AuthManager;
import org.microg.gms.auth.AuthResponse; import org.microg.gms.auth.AuthResponse;
@ -100,28 +99,12 @@ class AccountAuthenticator extends AbstractAccountAuthenticator {
result.putString(KEY_ACCOUNT_NAME, account.name); result.putString(KEY_ACCOUNT_NAME, account.name);
result.putString(KEY_AUTHTOKEN, res.auth); result.putString(KEY_AUTHTOKEN, res.auth);
return result; return result;
} else {
Bundle result = new Bundle();
Intent i = new Intent(context, AskPermissionActivity.class);
i.putExtras(options);
i.putExtra(KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
i.putExtra(KEY_ANDROID_PACKAGE_NAME, app);
i.putExtra(KEY_ACCOUNT_TYPE, account.type);
i.putExtra(KEY_ACCOUNT_NAME, account.name);
i.putExtra(KEY_AUTHTOKEN, authTokenType);
try {
if (res.consentDataBase64 != null)
i.putExtra(AskPermissionActivity.EXTRA_CONSENT_DATA, Base64.decode(res.consentDataBase64, Base64.URL_SAFE));
} catch (Exception e) {
Log.w(TAG, "Can't decode consent data: ", e);
}
result.putParcelable(KEY_INTENT, i);
return result;
} }
} catch (Exception e) { } catch (Exception e) {
Log.w(TAG, e); Log.w(TAG, e);
return null; return null;
} }
return null;
} }
@Override @Override

View File

@ -31,7 +31,6 @@ import static org.microg.gms.checkin.CheckinService.REGULAR_CHECKIN_INTERVAL;
public class TriggerReceiver extends WakefulBroadcastReceiver { public class TriggerReceiver extends WakefulBroadcastReceiver {
private static final String TAG = "GmsCheckinTrigger"; private static final String TAG = "GmsCheckinTrigger";
private static boolean registered = false;
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {

View File

@ -56,12 +56,9 @@ public class GServicesProvider extends ContentProvider {
@Override @Override
public boolean onCreate() { public boolean onCreate() {
databaseHelper = new DatabaseHelper(getContext()); databaseHelper = new DatabaseHelper(getContext());
if (CheckinPrefs.get(getContext()).isEnabled()) {
getContext().sendOrderedBroadcast(new Intent(getContext(), org.microg.gms.checkin.TriggerReceiver.class), null); getContext().sendOrderedBroadcast(new Intent(getContext(), org.microg.gms.checkin.TriggerReceiver.class), null);
} getContext().sendBroadcast(new Intent(org.microg.gms.gcm.TriggerReceiver.FORCE_TRY_RECONNECT, null, getContext(), org.microg.gms.gcm.TriggerReceiver.class));
if (GcmPrefs.get(getContext()).isEnabled()) {
getContext().sendBroadcast(new Intent(org.microg.gms.gcm.TriggerReceiver.FORCE_TRY_RECONNECT, null, getContext(), org.microg.gms.gcm.TriggerReceiver.class));
}
return true; return true;
} }

View File

@ -51,36 +51,6 @@ public class AskPushPermission extends FragmentActivity {
finish(); finish();
return; return;
} }
setContentView(R.layout.ask_gcm);
try {
PackageManager pm = getPackageManager();
final ApplicationInfo info = pm.getApplicationInfo(packageName, 0);
CharSequence label = pm.getApplicationLabel(info);
((TextView) findViewById(R.id.permission_message)).setText(Html.fromHtml("Allow <b>" + label + "</b> to register for push notifications?"));
findViewById(R.id.permission_allow_button).setOnClickListener(v -> {
if (answered) return;
database.noteAppKnown(packageName, true);
answered = true;
Bundle bundle = new Bundle();
bundle.putBoolean(EXTRA_EXPLICIT, true);
resultReceiver.send(Activity.RESULT_OK, bundle);
finish();
});
findViewById(R.id.permission_deny_button).setOnClickListener(v -> {
if (answered) return;
database.noteAppKnown(packageName, false);
answered = true;
Bundle bundle = new Bundle();
bundle.putBoolean(EXTRA_EXPLICIT, true);
resultReceiver.send(Activity.RESULT_CANCELED, bundle);
finish();
});
} catch (PackageManager.NameNotFoundException e) {
finish();
}
} }
@Override @Override

View File

@ -2,6 +2,8 @@
* SPDX-FileCopyrightText: 2020, microG Project Team * SPDX-FileCopyrightText: 2020, microG Project Team
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@file:Suppress("DEPRECATION")
package org.microg.gms.gcm package org.microg.gms.gcm
import android.app.Activity import android.app.Activity
@ -144,7 +146,7 @@ class PushRegisterService : LifecycleService() {
private suspend fun register(intent: Intent) { private suspend fun register(intent: Intent) {
val packageName = intent.appPackageName ?: throw RuntimeException("No package provided") val packageName = intent.appPackageName ?: throw RuntimeException("No package provided")
ensureAppRegistrationAllowed(this, database, packageName) ensureAppRegistrationAllowed(this, database, packageName)
Log.d(TAG, "register[req]: " + intent.toString() + " extras=" + intent!!.extras) Log.d(TAG, "register[req]: " + intent.toString() + " extras=" + intent.extras)
val bundle = completeRegisterRequest(this, database, val bundle = completeRegisterRequest(this, database,
RegisterRequest() RegisterRequest()
.build(Utils.getBuild(this)) .build(Utils.getBuild(this))
@ -236,7 +238,7 @@ internal class PushRegisterHandler(private val context: Context, private val dat
} }
} }
private fun sendReply(what: Int, id: Int, replyTo: Messenger, data: Bundle, oneWay: Boolean) { private fun sendReply(what: Int, id: Int, replyTo: Messenger, data: Bundle) {
if (what == 0) { if (what == 0) {
val outIntent = Intent(ACTION_C2DM_REGISTRATION) val outIntent = Intent(ACTION_C2DM_REGISTRATION)
outIntent.putExtras(data) outIntent.putExtras(data)
@ -248,51 +250,51 @@ internal class PushRegisterHandler(private val context: Context, private val dat
sendReplyViaMessage(what, id, replyTo, messageData) sendReplyViaMessage(what, id, replyTo, messageData)
} }
private fun replyError(what: Int, id: Int, replyTo: Messenger, errorMessage: String, oneWay: Boolean) { private fun replyError(what: Int, id: Int, replyTo: Messenger, errorMessage: String) {
val bundle = Bundle() val bundle = Bundle()
bundle.putString(EXTRA_ERROR, errorMessage) bundle.putString(EXTRA_ERROR, errorMessage)
sendReply(what, id, replyTo, bundle, oneWay) sendReply(what, id, replyTo, bundle)
} }
private fun replyNotAvailable(what: Int, id: Int, replyTo: Messenger) { private fun replyNotAvailable(what: Int, id: Int, replyTo: Messenger) {
replyError(what, id, replyTo, ERROR_SERVICE_NOT_AVAILABLE, false) replyError(what, id, replyTo, ERROR_SERVICE_NOT_AVAILABLE)
} }
private val selfAuthIntent: PendingIntent private val selfAuthIntent: PendingIntent
private get() { get() {
val intent = Intent() val intent = Intent()
intent.setPackage("com.google.example.invalidpackage") intent.setPackage("com.google.example.invalidpackage")
return PendingIntent.getBroadcast(context, 0, intent, 0) return PendingIntent.getBroadcast(context, 0, intent, 0)
} }
override fun handleMessage(msg: Message) { override fun handleMessage(msg: Message) {
var msg = msg var getmsg = msg
val obj = msg.obj val obj = getmsg.obj
if (msg.what == 0) { if (getmsg.what == 0) {
if (obj is Intent) { if (obj is Intent) {
val nuMsg = Message.obtain() val nuMsg = Message.obtain()
nuMsg.what = msg.what nuMsg.what = getmsg.what
nuMsg.arg1 = 0 nuMsg.arg1 = 0
nuMsg.replyTo = null nuMsg.replyTo = null
val packageName = obj.appPackageName val packageName = obj.appPackageName
val data = Bundle() val data = Bundle()
data.putBoolean("oneWay", false) data.putBoolean("oneWay", false)
data.putString("pkg", packageName) data.putString("pkg", packageName)
data.putBundle("data", msg.data) data.putBundle("data", getmsg.data)
nuMsg.data = data nuMsg.data = data
msg = nuMsg getmsg = nuMsg
} else { } else {
return return
} }
} }
val what = msg.what val what = getmsg.what
val id = msg.arg1 val id = getmsg.arg1
val replyTo = msg.replyTo val replyTo = getmsg.replyTo
if (replyTo == null) { if (replyTo == null) {
Log.w(TAG, "replyTo is null") Log.w(TAG, "replyTo is null")
return return
} }
val data = msg.data val data = getmsg.data
val packageName = data.getString("pkg") ?: return val packageName = data.getString("pkg") ?: return
val subdata = data.getBundle("data") val subdata = data.getBundle("data")
try { try {
@ -319,7 +321,7 @@ internal class PushRegisterHandler(private val context: Context, private val dat
.app(packageName) .app(packageName)
.delete(delete) .delete(delete)
.extraParams(subdata)) .extraParams(subdata))
sendReply(what, id, replyTo, bundle, oneWay) sendReply(what, id, replyTo, bundle)
} catch (e: Exception) { } catch (e: Exception) {
Log.w(TAG, e) Log.w(TAG, e)
replyNotAvailable(what, id, replyTo) replyNotAvailable(what, id, replyTo)

View File

@ -2,6 +2,7 @@
* SPDX-FileCopyrightText: 2020, microG Project Team * SPDX-FileCopyrightText: 2020, microG Project Team
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@file:Suppress("DEPRECATION")
package org.microg.gms.phenotype package org.microg.gms.phenotype

View File

@ -2,6 +2,7 @@
* SPDX-FileCopyrightText: 2020, microG Project Team * SPDX-FileCopyrightText: 2020, microG Project Team
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@file:Suppress("DEPRECATION")
package org.microg.gms.ui package org.microg.gms.ui

View File

@ -2,6 +2,7 @@
* SPDX-FileCopyrightText: 2020, microG Project Team * SPDX-FileCopyrightText: 2020, microG Project Team
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@file:Suppress("DEPRECATION")
package org.microg.gms.ui package org.microg.gms.ui

View File

@ -2,6 +2,7 @@
* SPDX-FileCopyrightText: 2020, microG Project Team * SPDX-FileCopyrightText: 2020, microG Project Team
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@file:Suppress("DEPRECATION")
package org.microg.gms.ui package org.microg.gms.ui
@ -64,16 +65,18 @@ class PushNotificationPreferencesFragment : PreferenceFragmentCompat() {
} }
private fun updateStatus() { private fun updateStatus() {
handler.postDelayed(updateRunnable, UPDATE_INTERVAL) try {
lifecycleScope.launchWhenStarted { handler.postDelayed(updateRunnable, UPDATE_INTERVAL)
val statusInfo = getGcmServiceInfo(requireContext()) lifecycleScope.launchWhenStarted {
pushStatusCategory.isVisible = statusInfo.configuration.enabled val statusInfo = getGcmServiceInfo(requireContext())
pushStatus.summary = if (statusInfo != null && statusInfo.connected) { pushStatusCategory.isVisible = statusInfo.configuration.enabled
getString(R.string.gcm_network_state_connected, DateUtils.getRelativeTimeSpanString(statusInfo.startTimestamp, System.currentTimeMillis(), 0)) pushStatus.summary = if (statusInfo.connected) {
} else { getString(R.string.gcm_network_state_connected, DateUtils.getRelativeTimeSpanString(statusInfo.startTimestamp, System.currentTimeMillis(), 0))
getString(R.string.gcm_network_state_disconnected) } else {
getString(R.string.gcm_network_state_disconnected)
}
} }
} } catch (e: Exception) {}
} }
private fun updateContent() { private fun updateContent() {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -1,97 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2015 The Android Open Source Project
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.
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:clipChildren="false"
android:clipToPadding="false">
<LinearLayout
android:id="@+id/dialog_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout
android:id="@+id/desc_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="20dip"
android:paddingLeft="20dip"
android:paddingTop="18dip"
android:paddingEnd="16dip"
android:paddingRight="16dip">
<LinearLayout
android:id="@+id/perm_desc_root"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/permission_icon"
android:layout_width="36dip"
android:layout_height="36dip"
android:scaleType="fitCenter"
android:src="@drawable/ic_cloud_bell"
app:tint="?attr/colorAccent">
</ImageView>
<TextView
android:id="@+id/permission_message"
style="@style/TextAppearance.AppCompat.Subhead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="16dip"
android:paddingLeft="16dip"
android:text="@string/pref_push_app_allow_register_ask"
android:textSize="20sp">
</TextView>
</LinearLayout>
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:orientation="horizontal"
android:paddingStart="20dip"
android:paddingLeft="20dip"
android:paddingEnd="16dip"
android:paddingRight="16dip">
<Button
android:id="@+id/permission_deny_button"
style="?attr/buttonBarButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/deny">
</Button>
<Button
android:id="@+id/permission_allow_button"
style="?attr/buttonBarButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/allow">
</Button>
</LinearLayout>
</LinearLayout>
</FrameLayout>

View File

@ -1,132 +0,0 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ 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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:gravity="center_horizontal"
android:paddingTop="10dp"
android:text="@string/account_manager_title"
android:textColor="?attr/colorPrimary"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<View
android:id="@+id/no_progress_bar"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:background="@color/dialog_border_color"
android:layout_width="match_parent"
android:layout_height="1dp" />
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:indeterminate="true"
android:layout_marginTop="2dp"
android:layout_marginBottom="3dp"
android:visibility="gone"
style="?android:attr/progressBarStyleHorizontal" />
<LinearLayout
android:paddingTop="15dp"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<FrameLayout
android:background="@drawable/circle_shape_background"
android:layout_marginEnd="-3dp"
android:layout_width="64dp"
android:layout_height="64dp"
android:padding="10dp">
<de.hdodenhof.circleimageview.CircleImageView
android:src="@drawable/ic_generic_man"
android:id="@+id/account_photo"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
<FrameLayout
android:background="@drawable/circle_shape_background"
android:layout_marginStart="-3dp"
android:layout_width="64dp"
android:layout_height="64dp"
android:padding="10dp">
<ImageView
android:src="@mipmap/ic_launcher"
android:id="@+id/app_icon"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
</LinearLayout>
<TextView
android:id="@+id/title"
android:padding="15dp"
android:gravity="center_horizontal"
android:textSize="18sp"
android:textColor="?attr/colorAccent"
android:text="@string/ask_scope_permission_title"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ListView
android:padding="5dp"
android:id="@+id/permissions"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dip" />
<TextView
android:padding="10dp"
android:textColor="?attr/colorPrimary"
android:textSize="12sp"
android:text="@string/ask_permission_tos"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_gravity="end"
android:orientation="horizontal"
android:paddingRight="10dp"
android:paddingLeft="10dp"
android:paddingBottom="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@android:id/button2"
style="?attr/buttonBarButtonStyle"
android:text="@string/deny"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@android:id/button1"
style="?attr/buttonBarButtonStyle"
android:text="@string/allow"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>

View File

@ -1,48 +0,0 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ 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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:padding="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:src="@drawable/proprietary_auth_ic_scope_icon_default"
android:id="@android:id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:padding="6dp"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:textSize="16sp"
android:id="@android:id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:textSize="12sp"
android:visibility="gone"
android:id="@android:id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>

View File

@ -5,8 +5,7 @@
--> -->
<layout xmlns:android="http://schemas.android.com/apk/res/android" <layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto">
xmlns:tools="http://schemas.android.com/tools">
<data> <data>

View File

@ -85,8 +85,6 @@ Esto puede tardar unos minutos."</string>
<string name="pref_add_account_summary">Añadir cuenta de Google</string> <string name="pref_add_account_summary">Añadir cuenta de Google</string>
<string name="pref_gcm_switcher_title">Recibir notificaciones push</string> <string name="pref_gcm_switcher_title">Recibir notificaciones push</string>
<string name="pref_gcm_enable_mcs_summary">Google Cloud Messaging es un proveedor de notificaciónes push usado por muchas aplicaciones de terceros. Pará usarlo tienes que activar registro de dispositivos.</string> <string name="pref_gcm_enable_mcs_summary">Google Cloud Messaging es un proveedor de notificaciónes push usado por muchas aplicaciones de terceros. Pará usarlo tienes que activar registro de dispositivos.</string>
<string name="pref_gcm_confirm_new_apps_title">Confirmar apps nuevas</string>
<string name="pref_gcm_confirm_new_apps_summary">Preguntar antes de registrar una nueva App para recibir notificaciones push</string>
<string name="pref_about_title">Acerca de Vanced microG</string> <string name="pref_about_title">Acerca de Vanced microG</string>
<string name="pref_cast_double_fix">Solucion para Cast duplicado</string> <string name="pref_cast_double_fix">Solucion para Cast duplicado</string>

View File

@ -85,8 +85,6 @@ Ini bisa berlangsung beberapa menit."</string>
<string name="pref_add_account_summary">Tambahkan akun Google</string> <string name="pref_add_account_summary">Tambahkan akun Google</string>
<string name="pref_gcm_switcher_title">Terima notifikasi push</string> <string name="pref_gcm_switcher_title">Terima notifikasi push</string>
<string name="pref_gcm_enable_mcs_summary">Google Cloud Messaging adalah penyedia notifikasi push yang digunakan pada banyak aplikasi pihak ketiga. Untuk menggunakannya anda harus mengaktifkan device registration.</string> <string name="pref_gcm_enable_mcs_summary">Google Cloud Messaging adalah penyedia notifikasi push yang digunakan pada banyak aplikasi pihak ketiga. Untuk menggunakannya anda harus mengaktifkan device registration.</string>
<string name="pref_gcm_confirm_new_apps_title">Konfirmasi aplikasi baru</string>
<string name="pref_gcm_confirm_new_apps_summary">Tanya sebelum meregistrasi aplikasi baru untuk menerima notifikasi push</string>
<string name="pref_about_title">Tentang Vanced microG</string> <string name="pref_about_title">Tentang Vanced microG</string>
<string name="pref_cast_double_fix">Perbaikan Cast terduplikasi</string> <string name="pref_cast_double_fix">Perbaikan Cast terduplikasi</string>

View File

@ -85,8 +85,6 @@ Questo potrà richiedere un paio di minuti"</string>
<string name="pref_add_account_summary">Aggiungi account Google</string> <string name="pref_add_account_summary">Aggiungi account Google</string>
<string name="pref_gcm_switcher_title">Ricevi notifiche push</string> <string name="pref_gcm_switcher_title">Ricevi notifiche push</string>
<string name="pref_gcm_enable_mcs_summary">Messaggistica Cloud Google è un fornitore di notifiche push presente in molte applicazioni di terze parti. Per utilizzarlo è necessario attivare la registrazione del dispositivo.</string> <string name="pref_gcm_enable_mcs_summary">Messaggistica Cloud Google è un fornitore di notifiche push presente in molte applicazioni di terze parti. Per utilizzarlo è necessario attivare la registrazione del dispositivo.</string>
<string name="pref_gcm_confirm_new_apps_title">Conferma nuove app</string>
<string name="pref_gcm_confirm_new_apps_summary">Chiedi prima di registrare una nuova app per la ricezione di notifiche push</string>
<string name="pref_about_title">Informazioni su Vanced microG</string> <string name="pref_about_title">Informazioni su Vanced microG</string>
<string name="pref_cast_double_fix">Correzione cast duplicato</string> <string name="pref_cast_double_fix">Correzione cast duplicato</string>

View File

@ -85,8 +85,6 @@ This can take a couple of minutes."</string>
<string name="pref_add_account_summary">Add Google account</string> <string name="pref_add_account_summary">Add Google account</string>
<string name="pref_gcm_switcher_title">Receive push notifications</string> <string name="pref_gcm_switcher_title">Receive push notifications</string>
<string name="pref_gcm_enable_mcs_summary">Google Cloud Messaging is a push notification provider used by many third-party applications. To use it you must enable device registration.</string> <string name="pref_gcm_enable_mcs_summary">Google Cloud Messaging is a push notification provider used by many third-party applications. To use it you must enable device registration.</string>
<string name="pref_gcm_confirm_new_apps_title">Confirm new apps</string>
<string name="pref_gcm_confirm_new_apps_summary">Ask before registering a new app to receive push notifications</string>
<string name="pref_about_title">About Vanced microG</string> <string name="pref_about_title">About Vanced microG</string>
<string name="pref_cast_double_fix">Cast duplication fix</string> <string name="pref_cast_double_fix">Cast duplication fix</string>

View File

@ -17,12 +17,6 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="gcm_confirm_new_apps"
android:summary="@string/pref_gcm_confirm_new_apps_summary"
android:title="@string/pref_gcm_confirm_new_apps_title"/>
<PreferenceCategory <PreferenceCategory
android:key="prefcat_networks" android:key="prefcat_networks"
android:title="@string/prefcat_push_networks_title"> android:title="@string/prefcat_push_networks_title">