From 7b3e490d555fc4e391e071f039c05a96b15c088d Mon Sep 17 00:00:00 2001 From: mar-v-in Date: Fri, 3 Apr 2015 23:54:41 +0200 Subject: [PATCH] Add settings and Fix small MCS problems --- .../src/main/AndroidManifest.xml | 55 ++++++++++--------- .../java/org/microg/gms/auth/AuthManager.java | 4 +- .../org/microg/gms/gcm/McsInputStream.java | 6 +- .../java/org/microg/gms/gcm/McsService.java | 15 ++--- .../org/microg/gms/gcm/TriggerReceiver.java | 14 ++++- .../org/microg/gms/ui/SettingsActivity.java | 42 ++++++++++++++ .../src/main/res/values/strings.xml | 6 ++ .../src/main/res/xml/account_preferences.xml | 32 ++++++++--- .../src/main/res/xml/gms_preferences.xml | 29 ++++++++++ 9 files changed, 153 insertions(+), 50 deletions(-) create mode 100644 play-services-core/src/main/java/org/microg/gms/ui/SettingsActivity.java create mode 100644 play-services-core/src/main/res/xml/gms_preferences.xml diff --git a/play-services-core/src/main/AndroidManifest.xml b/play-services-core/src/main/AndroidManifest.xml index 1fc3dff0..8083a6d2 100644 --- a/play-services-core/src/main/AndroidManifest.xml +++ b/play-services-core/src/main/AndroidManifest.xml @@ -24,38 +24,37 @@ + android:protectionLevel="dangerous" /> + android:label="@string/perm_c2dm_send_label" + android:protectionLevel="dangerous" /> + android:name="com.google.android.googleapps.permission.GOOGLE_AUTH" + android:icon="@drawable/proprietary_auth_ic_scope_icon_default" /> + android:label="@string/permission_service_local_label" + android:protectionLevel="dangerous" /> + android:label="@string/permission_service_mail_label" + android:protectionLevel="dangerous" /> - + android:label="@string/permission_service_writely_label" + android:protectionLevel="dangerous" /> + android:label="@string/perm_status_broadcast_label" + android:protectionLevel="dangerous" /> @@ -71,7 +70,6 @@ - @@ -88,7 +86,6 @@ - @@ -104,12 +101,10 @@ android:name="org.microg.gms.gservices.GServicesProvider" android:authorities="com.google.android.gsf.gservices" android:exported="true" /> - - - + + + @@ -235,7 +232,6 @@ - - - @@ -281,7 +275,6 @@ - @@ -289,7 +282,6 @@ - @@ -297,7 +289,6 @@ - @@ -305,10 +296,20 @@ - + + + + + + + + diff --git a/play-services-core/src/main/java/org/microg/gms/auth/AuthManager.java b/play-services-core/src/main/java/org/microg/gms/auth/AuthManager.java index 67e5826c..6402ae47 100644 --- a/play-services-core/src/main/java/org/microg/gms/auth/AuthManager.java +++ b/play-services-core/src/main/java/org/microg/gms/auth/AuthManager.java @@ -36,7 +36,7 @@ public class AuthManager { private static final String TAG = "GmsAuthManager"; public static final String PERMISSION_TREE_BASE = "com.google.android.googleapps.permission.GOOGLE_AUTH."; - private static final String PREF_KEY_TRUST_GOOGLE = "auth_manager_trust_google"; + private static final String PREF_AUTH_TRUST_GOOGLE = "auth_manager_trust_google"; private final Context context; private final String accountName; @@ -165,7 +165,7 @@ public class AuthManager { } public static boolean isTrustGooglePermitted(Context context) { - return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(PREF_KEY_TRUST_GOOGLE, true); + return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(PREF_AUTH_TRUST_GOOGLE, true); } private boolean isSystemApp() { diff --git a/play-services-core/src/main/java/org/microg/gms/gcm/McsInputStream.java b/play-services-core/src/main/java/org/microg/gms/gcm/McsInputStream.java index 7b4b9224..32020e75 100644 --- a/play-services-core/src/main/java/org/microg/gms/gcm/McsInputStream.java +++ b/play-services-core/src/main/java/org/microg/gms/gcm/McsInputStream.java @@ -16,7 +16,6 @@ package org.microg.gms.gcm; -import android.util.Base64; import android.util.Log; import com.squareup.wire.Message; @@ -92,8 +91,9 @@ public class McsInputStream { Log.d(TAG, "Reading from MCS tag=" + mcsTag + " size=" + mcsSize); byte[] bytes = new byte[mcsSize]; int len = 0; - while ((len += is.read(bytes, len, mcsSize - len)) < mcsSize) ; - Log.d(TAG, "Reading from MCS: " + Base64.encodeToString(bytes, 0)); + while (len < mcsSize) { + len += is.read(bytes, len, mcsSize - len); + } Message read = read(mcsTag, bytes, len); Log.d(TAG, "Read from MCS: " + read); streamId++; diff --git a/play-services-core/src/main/java/org/microg/gms/gcm/McsService.java b/play-services-core/src/main/java/org/microg/gms/gcm/McsService.java index d5e93117..393af540 100644 --- a/play-services-core/src/main/java/org/microg/gms/gcm/McsService.java +++ b/play-services-core/src/main/java/org/microg/gms/gcm/McsService.java @@ -58,13 +58,14 @@ public class McsService extends IntentService { public static final String FROM_FIELD = "gcm@android.com"; public static final int HEARTBEAT_MS = 60000; - private static AtomicBoolean connected = new AtomicBoolean(false); + public static final int HEARTBEAT_ALLOWED_OFFSET_MS = 2000; + private static final AtomicBoolean connecting = new AtomicBoolean(false); + private static Thread connectionThread; + private static Thread heartbeatThread; private Socket sslSocket; private McsInputStream inputStream; private McsOutputStream outputStream; - private Thread connectionThread; - private Thread heartbeatThread; private long lastMsgTime; public McsService() { @@ -73,7 +74,7 @@ public class McsService extends IntentService { @Override protected void onHandleIntent(Intent intent) { - if (connected.compareAndSet(false, true)) { + if (!isConnected()) { connectionThread = new Thread(new Runnable() { @Override public void run() { @@ -87,7 +88,7 @@ public class McsService extends IntentService { } public static boolean isConnected() { - return connected.get(); + return connecting.get() || (connectionThread != null && connectionThread.isAlive()); } private void heartbeatLoop() { @@ -95,7 +96,7 @@ public class McsService extends IntentService { while (!Thread.interrupted()) { try { long waitTime; - while ((waitTime = lastMsgTime + HEARTBEAT_MS - System.currentTimeMillis()) > 0) { + while ((waitTime = lastMsgTime + HEARTBEAT_MS - System.currentTimeMillis()) > HEARTBEAT_ALLOWED_OFFSET_MS) { synchronized (heartbeatThread) { Log.d(TAG, "Waiting for " + waitTime + "ms"); heartbeatThread.wait(waitTime); @@ -123,6 +124,7 @@ public class McsService extends IntentService { } private void connect() { + connecting.set(false); try { Log.d(TAG, "Starting MCS connection..."); LastCheckinInfo info = LastCheckinInfo.read(this); @@ -160,7 +162,6 @@ public class McsService extends IntentService { heartbeatThread.interrupt(); heartbeatThread = null; } - connected.set(false); Log.d(TAG, "Connection closed"); } diff --git a/play-services-core/src/main/java/org/microg/gms/gcm/TriggerReceiver.java b/play-services-core/src/main/java/org/microg/gms/gcm/TriggerReceiver.java index ba1565f9..af395c1c 100644 --- a/play-services-core/src/main/java/org/microg/gms/gcm/TriggerReceiver.java +++ b/play-services-core/src/main/java/org/microg/gms/gcm/TriggerReceiver.java @@ -19,6 +19,8 @@ package org.microg.gms.gcm; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; import android.preference.PreferenceManager; public class TriggerReceiver extends BroadcastReceiver { @@ -27,9 +29,15 @@ public class TriggerReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { boolean force = "android.provider.Telephony.SECRET_CODE".equals(intent.getAction()); - if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean(PREF_ENABLE_GCM, false) || force) { - if (!McsService.isConnected() || force) { - context.startService(new Intent(context, McsService.class)); + + ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo networkInfo = cm.getActiveNetworkInfo(); + + if (networkInfo != null && networkInfo.isConnected() || force) { + if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean(PREF_ENABLE_GCM, false) || force) { + if (!McsService.isConnected() || force) { + context.startService(new Intent(context, McsService.class)); + } } } } diff --git a/play-services-core/src/main/java/org/microg/gms/ui/SettingsActivity.java b/play-services-core/src/main/java/org/microg/gms/ui/SettingsActivity.java new file mode 100644 index 00000000..ea5a0e37 --- /dev/null +++ b/play-services-core/src/main/java/org/microg/gms/ui/SettingsActivity.java @@ -0,0 +1,42 @@ +/* + * Copyright 2013-2015 µg 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.support.v4.app.FragmentActivity; +import android.support.v4.preference.PreferenceFragment; + +import com.google.android.gms.R; + +public class SettingsActivity extends FragmentActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.settings_activity); + getSupportFragmentManager().beginTransaction() + .replace(R.id.content_wrapper, new MyPreferenceFragment()).commit(); + } + + public static class MyPreferenceFragment extends PreferenceFragment { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.gms_preferences); + } + } +} diff --git a/play-services-core/src/main/res/values/strings.xml b/play-services-core/src/main/res/values/strings.xml index 06cb7976..ea9b39c7 100644 --- a/play-services-core/src/main/res/values/strings.xml +++ b/play-services-core/src/main/res/values/strings.xml @@ -29,4 +29,10 @@ listen to internal status broadcasts listen to C2DM messages send C2DM messages to other apps + + auth_manager_trust_google + Trust Google for app permissions + When disabled, the user is asked before an apps authorization request is sent to Google. Some applications will fail to use the Google account if this is disabled. + + µg Settings diff --git a/play-services-core/src/main/res/xml/account_preferences.xml b/play-services-core/src/main/res/xml/account_preferences.xml index fef8d34e..dbc5912b 100644 --- a/play-services-core/src/main/res/xml/account_preferences.xml +++ b/play-services-core/src/main/res/xml/account_preferences.xml @@ -1,9 +1,25 @@ - - - + + + + + + diff --git a/play-services-core/src/main/res/xml/gms_preferences.xml b/play-services-core/src/main/res/xml/gms_preferences.xml new file mode 100644 index 00000000..b8e339dd --- /dev/null +++ b/play-services-core/src/main/res/xml/gms_preferences.xml @@ -0,0 +1,29 @@ + + + + + + + +