Commit 3c7ead00 authored by Romain Hunault's avatar Romain Hunault

Merge branch 'microg/master'

parents 60b4f4ed 1e444dc4
Subproject commit a57ac35b5da42e8b7f78cb1cd002daae404420fb
Subproject commit aa18e807a36440f67a16ca70f29e75ba3bc04e0b
......@@ -46,15 +46,16 @@ def execResult(...args) {
return stdout.toString().trim()
}
def gmsVersion = "12.8.79"
def gmsVersion = "13.2.80"
def gmsVersionCode = Integer.parseInt(gmsVersion.replaceAll('\\.', ''))
def gitVersionBase = execResult('git', 'describe', '--tags', '--abbrev=0').substring(1)
def gitCommitCount = Integer.parseInt(execResult('git', 'rev-list', '--count', "v$gitVersionBase..HEAD"))
def gitCommitId = execResult('git', 'show-ref', '--abbrev=7', '--head', 'HEAD').split(' ')[0]
def gitDirty = execResult('git', 'status', '--porcelain').size() > 0
def ourVersionBase = gitVersionBase.substring(0, gitVersionBase.lastIndexOf('.'))
def ourVersionCode = gmsVersionCode * 1000 + gitCommitCount + (gitDirty ? 1 : 0)
def ourVersionName = "$ourVersionBase.$gmsVersionCode" + (gitCommitCount > 0 ? "-$gitCommitCount-$gitCommitId" : "") + (gitDirty ? "-dirty" : "")
def ourVersionMinor = Integer.parseInt(ourVersionBase.substring(ourVersionBase.lastIndexOf('.') + 1))
def ourVersionCode = gmsVersionCode * 1000 + ourVersionMinor * 2 + (gitCommitCount > 0 || gitDirty ? 1 : 0)
def ourVersionName = "$ourVersionBase.$gmsVersionCode" + (gitCommitCount > 0 && !gitDirty ? "-$gitCommitCount" : "") + (gitDirty ? "-dirty" : "") + (gitCommitCount > 0 && !gitDirty ? " ($gitCommitId)" : "")
logger.lifecycle('Starting build for version {} ({})...', ourVersionName, ourVersionCode)
android {
......
......@@ -205,16 +205,18 @@
android:permission="com.google.android.c2dm.permission.RECEIVE">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTER"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<intent-filter>
<action android:name="com.google.android.c2dm.intent.UNREGISTER"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
<receiver android:name="org.microg.gms.gcm.PushRegisterReceiver">
<intent-filter>
<action android:name="com.google.iid.TOKEN_REQUEST"/>
</intent-filter>
</receiver>
<service android:name="org.microg.gms.gcm.McsService"/>
<receiver
......
......@@ -81,7 +81,13 @@ public class HttpFormClient {
os.close();
if (connection.getResponseCode() != 200) {
throw new IOException(connection.getResponseMessage());
String error = connection.getResponseMessage();
try {
error = new String(Utils.readStreamToEnd(connection.getErrorStream()));
} catch (IOException e) {
// Ignore
}
throw new IOException(error);
}
String result = new String(Utils.readStreamToEnd(connection.getInputStream()));
......
......@@ -52,6 +52,7 @@ public class PackageUtils {
KNOWN_GOOGLE_PACKAGES.put("com.google.android.apps.playconsole", "d6c35e55b481aefddd74152ca7254332739a81d6");
KNOWN_GOOGLE_PACKAGES.put("com.google.android.apps.travel.onthego", "0cbe08032217d45e61c0bc72f294395ee9ecb5d5");
KNOWN_GOOGLE_PACKAGES.put("com.google.android.apps.tycho", "01b844184e360686aa98b48eb16e05c76d4a72ad");
KNOWN_GOOGLE_PACKAGES.put("com.google.android.contacts", "ee3e2b5d95365c5a1ccc2d8dfe48d94eb33b3ebe");
KNOWN_GOOGLE_PACKAGES.put("com.google.android.wearable.app", "a197f9212f2fed64f0ff9c2a4edf24b9c8801c8c");
KNOWN_GOOGLE_PACKAGES.put("com.google.android.apps.youtube.music", "afb0fed5eeaebdd86f56a97742f4b6b33ef59875");
KNOWN_GOOGLE_PACKAGES.put("com.google.android.vr.home", "fc1edc68f7e3e4963c998e95fc38f3de8d1bfc96");
......@@ -154,4 +155,12 @@ public class PackageUtils {
return -1;
}
}
public static String versionName(Context context, String packageName) {
try {
return context.getPackageManager().getPackageInfo(packageName, 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
return null;
}
}
}
/*
* Copyright (C) 2018 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.gcm;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
import org.microg.gms.checkin.LastCheckinInfo;
import org.microg.gms.common.PackageUtils;
import org.microg.gms.common.Utils;
import static org.microg.gms.gcm.GcmConstants.ACTION_C2DM_REGISTRATION;
import static org.microg.gms.gcm.GcmConstants.ERROR_SERVICE_NOT_AVAILABLE;
import static org.microg.gms.gcm.GcmConstants.EXTRA_APP;
import static org.microg.gms.gcm.GcmConstants.EXTRA_ERROR;
class PushRegisterHandler extends Handler {
private static final String TAG = "GmsGcmRegisterHdl";
private Context context;
private int callingUid;
private GcmDatabase database;
public PushRegisterHandler(Context context, GcmDatabase database) {
this.context = context;
this.database = database;
}
@Override
public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
this.callingUid = Binder.getCallingUid();
return super.sendMessageAtTime(msg, uptimeMillis);
}
private void sendReply(int what, int id, Messenger replyTo, Bundle data) {
if (what == 0) {
Intent outIntent = new Intent(ACTION_C2DM_REGISTRATION);
outIntent.putExtras(data);
Message message = Message.obtain();
message.obj = outIntent;
try {
replyTo.send(message);
} catch (RemoteException e) {
Log.w(TAG, e);
}
} else {
Bundle messageData = new Bundle();
messageData.putBundle("data", data);
Message response = Message.obtain();
response.what = what;
response.arg1 = id;
response.setData(messageData);
try {
replyTo.send(response);
} catch (RemoteException e) {
Log.w(TAG, e);
}
}
}
private void replyError(int what, int id, Messenger replyTo, String errorMessage) {
Bundle bundle = new Bundle();
bundle.putString(EXTRA_ERROR, errorMessage);
sendReply(what, id, replyTo, bundle);
}
private void replyNotAvailable(int what, int id, Messenger replyTo) {
replyError(what, id, replyTo, ERROR_SERVICE_NOT_AVAILABLE);
}
@Override
public void handleMessage(Message msg) {
if (msg.what == 0) {
if (msg.obj instanceof Intent) {
Message nuMsg = Message.obtain();
nuMsg.what = msg.what;
nuMsg.arg1 = 0;
nuMsg.replyTo = null;
PendingIntent pendingIntent = ((Intent) msg.obj).getParcelableExtra(EXTRA_APP);
String packageName = PackageUtils.packageFromPendingIntent(pendingIntent);
Bundle data = new Bundle();
data.putBoolean("oneWay", false);
data.putString("pkg", packageName);
data.putBundle("data", msg.getData());
nuMsg.setData(data);
msg = nuMsg;
} else {
return;
}
}
int what = msg.what;
int id = msg.arg1;
Messenger replyTo = msg.replyTo;
if (replyTo == null) {
Log.w(TAG, "replyTo is null");
return;
}
Bundle data = msg.getData();
if (data.getBoolean("oneWay", false)) {
Log.w(TAG, "oneWay requested");
return;
}
String packageName = data.getString("pkg");
Bundle subdata = data.getBundle("data");
String sender = subdata.getString("sender");
boolean delete = subdata.get("delete") != null;
try {
PackageUtils.checkPackageUid(context, packageName, callingUid);
} catch (SecurityException e) {
Log.w(TAG, e);
return;
}
// TODO: We should checkin and/or ask for permission here.
PushRegisterManager.completeRegisterRequest(context, database,
new RegisterRequest()
.build(Utils.getBuild(context))
.sender(sender)
.checkin(LastCheckinInfo.read(context))
.app(packageName)
.delete(delete)
.appid(subdata.getString("appid"), subdata.getString("gmp_app_id")),
bundle -> sendReply(what, id, replyTo, bundle));
}
}
/*
* Copyright (C) 2018 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.gcm;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import org.microg.gms.checkin.LastCheckinInfo;
import org.microg.gms.common.HttpFormClient;
import org.microg.gms.common.PackageUtils;
import org.microg.gms.common.Utils;
import java.io.IOException;
import static org.microg.gms.gcm.GcmConstants.ERROR_SERVICE_NOT_AVAILABLE;
import static org.microg.gms.gcm.GcmConstants.EXTRA_ERROR;
import static org.microg.gms.gcm.GcmConstants.EXTRA_REGISTRATION_ID;
import static org.microg.gms.gcm.GcmConstants.EXTRA_RETRY_AFTER;
import static org.microg.gms.gcm.GcmConstants.EXTRA_UNREGISTERED;
public class PushRegisterManager {
private static final String TAG = "GmsGcmRegisterMgr";
public static RegisterResponse unregister(Context context, String packageName, String pkgSignature, String sender, String info) {
GcmDatabase database = new GcmDatabase(context);
RegisterResponse response = new RegisterResponse();
try {
response = new RegisterRequest()
.build(Utils.getBuild(context))
.sender(sender)
.info(info)
.checkin(LastCheckinInfo.read(context))
.app(packageName, pkgSignature)
.delete(true)
.getResponse();
} catch (IOException e) {
Log.w(TAG, e);
}
if (!packageName.equals(response.deleted)) {
database.noteAppRegistrationError(packageName, response.responseText);
} else {
database.noteAppUnregistered(packageName, pkgSignature);
}
database.close();
return response;
}
public interface BundleCallback {
void onResult(Bundle bundle);
}
public static void completeRegisterRequest(Context context, GcmDatabase database, RegisterRequest request, BundleCallback callback) {
completeRegisterRequest(context, database, null, request, callback);
}
public static void completeRegisterRequest(Context context, GcmDatabase database, String requestId, RegisterRequest request, BundleCallback callback) {
if (request.app != null) {
if (request.appSignature == null)
request.appSignature = PackageUtils.firstSignatureDigest(context, request.app);
if (request.appVersion <= 0)
request.appVersion = PackageUtils.versionCode(context, request.app);
if (request.appVersionName == null)
request.appVersionName = PackageUtils.versionName(context, request.app);
}
GcmDatabase.App app = database.getApp(request.app);
GcmPrefs prefs = GcmPrefs.get(context);
if (!request.delete) {
if (!prefs.isEnabled() ||
(app != null && !app.allowRegister) ||
LastCheckinInfo.read(context).lastCheckin <= 0 ||
(app == null && prefs.isConfirmNewApps())) {
Bundle bundle = new Bundle();
bundle.putString(EXTRA_ERROR, ERROR_SERVICE_NOT_AVAILABLE);
callback.onResult(bundle);
return;
}
} else {
if (database.getRegistrationsByApp(request.app).isEmpty()) {
Bundle bundle = new Bundle();
bundle.putString(EXTRA_UNREGISTERED, attachRequestId(request.app, requestId));
callback.onResult(bundle);
return;
}
}
request.getResponseAsync(new HttpFormClient.Callback<RegisterResponse>() {
@Override
public void onResponse(RegisterResponse response) {
callback.onResult(handleResponse(database, request, response, requestId));
}
@Override
public void onException(Exception e) {
Log.w(TAG, e);
callback.onResult(handleResponse(database, request, e, requestId));
}
});
}
private static Bundle handleResponse(GcmDatabase database, RegisterRequest request, RegisterResponse response, String requestId) {
return handleResponse(database, request, response, null, requestId);
}
private static Bundle handleResponse(GcmDatabase database, RegisterRequest request, Exception e, String requestId) {
return handleResponse(database, request, null, e, requestId);
}
private static Bundle handleResponse(GcmDatabase database, RegisterRequest request, RegisterResponse response, Exception e, String requestId) {
Bundle resultBundle = new Bundle();
if (response == null && e == null) {
resultBundle.putString(EXTRA_ERROR, attachRequestId(ERROR_SERVICE_NOT_AVAILABLE, requestId));
} else if (e != null) {
if (e.getMessage() != null && e.getMessage().startsWith("Error=")) {
String errorMessage = e.getMessage().substring(6);
database.noteAppRegistrationError(request.app, errorMessage);
resultBundle.putString(EXTRA_ERROR, attachRequestId(errorMessage, requestId));
} else {
resultBundle.putString(EXTRA_ERROR, attachRequestId(ERROR_SERVICE_NOT_AVAILABLE, requestId));
}
} else {
if (!request.delete) {
if (response.token == null) {
database.noteAppRegistrationError(request.app, response.responseText);
resultBundle.putString(EXTRA_ERROR, attachRequestId(ERROR_SERVICE_NOT_AVAILABLE, requestId));
} else {
database.noteAppRegistered(request.app, request.appSignature, response.token);
resultBundle.putString(EXTRA_REGISTRATION_ID, attachRequestId(response.token, requestId));
}
} else {
if (!request.app.equals(response.deleted) && !request.app.equals(response.token)) {
database.noteAppRegistrationError(request.app, response.responseText);
resultBundle.putString(EXTRA_ERROR, attachRequestId(ERROR_SERVICE_NOT_AVAILABLE, requestId));
} else {
database.noteAppUnregistered(request.app, request.appSignature);
resultBundle.putString(EXTRA_UNREGISTERED, attachRequestId(request.app, requestId));
}
}
if (response.retryAfter != null && !response.retryAfter.contains(":")) {
resultBundle.putLong(EXTRA_RETRY_AFTER, Long.parseLong(response.retryAfter));
}
}
return resultBundle;
}
public static String attachRequestId(String msg, String requestId) {
if (requestId == null) return msg;
return "|ID|" + requestId + "|" + msg;
}
}
/*
* Copyright (C) 2018 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.gcm;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.WakefulBroadcastReceiver;
import static org.microg.gms.gcm.GcmConstants.ACTION_C2DM_REGISTER;
import static org.microg.gms.gcm.GcmConstants.ACTION_C2DM_UNREGISTER;
public class PushRegisterReceiver extends WakefulBroadcastReceiver {
private static final String TAG = "GmsGcmRegisterRcv";
@Override
public void onReceive(Context context, Intent intent) {
Intent intent2 = new Intent(context, PushRegisterService.class);
if (intent.getExtras().get("delete") != null) {
intent2.setAction(ACTION_C2DM_UNREGISTER);
} else {
intent2.setAction(ACTION_C2DM_REGISTER);
}
intent2.putExtras(intent.getExtras());
startWakefulService(context, intent2);
}
}
......@@ -18,6 +18,7 @@ package org.microg.gms.gcm;
import org.microg.gms.checkin.LastCheckinInfo;
import org.microg.gms.common.Build;
import org.microg.gms.common.Constants;
import org.microg.gms.common.HttpFormClient;
import java.io.IOException;
......@@ -41,9 +42,11 @@ public class RegisterRequest extends HttpFormClient.Request {
public String appSignature;
@RequestContent("app_ver")
public int appVersion;
@RequestContent("app_ver_name")
public String appVersionName;
@RequestContent("info")
public String info;
@RequestContent("sender")
@RequestContent({"sender", "subtype"})
public String sender;
@RequestContent({"X-GOOG.USER_AID", "device"})
public long androidId;
......@@ -52,11 +55,22 @@ public class RegisterRequest extends HttpFormClient.Request {
public long securityToken;
public String deviceName;
public String buildVersion;
@RequestContent("osv")
public int sdkVersion;
@RequestContent("gmsv")
public int gmsVersion;
@RequestContent("scope")
public String scope = "*";
@RequestContent("appid")
public String appId;
@RequestContent("gmp_app_id")
public String gmpAppId;
@Override
public void prepare() {
userAgent = String.format(USER_AGENT, deviceName, buildVersion);
auth = "AidLogin " + androidId + ":" + securityToken;
gmsVersion = Constants.MAX_REFERENCE_VERSION;
}
public RegisterRequest checkin(LastCheckinInfo lastCheckinInfo) {
......@@ -65,10 +79,28 @@ public class RegisterRequest extends HttpFormClient.Request {
return this;
}
public RegisterRequest app(String app, String appSignature, int appVersion) {
public RegisterRequest app(String app) {
this.app = app;
return this;
}
public RegisterRequest app(String app, String appSignature) {
this.app = app;
this.appSignature = appSignature;
return this;
}
public RegisterRequest app(String app, String appSignature, int appVersion, String appVersionName) {
this.app = app;
this.appSignature = appSignature;
this.appVersion = appVersion;
this.appVersionName = appVersionName;
return this;
}
public RegisterRequest appid(String appid, String gmpAppId) {
this.appId = appid;
this.gmpAppId = gmpAppId;
return this;
}
......@@ -85,6 +117,7 @@ public class RegisterRequest extends HttpFormClient.Request {
public RegisterRequest build(Build build) {
deviceName = build.device;
buildVersion = build.id;
sdkVersion = build.sdk;
return this;
}
......
......@@ -28,7 +28,7 @@ public class UnregisterReceiver extends BroadcastReceiver {
List<GcmDatabase.Registration> registrations = database.getRegistrationsByApp(packageName);
boolean deletedAll = true;
for (GcmDatabase.Registration registration : registrations) {
deletedAll &= PushRegisterService.unregister(context, registration.packageName, registration.signature, null, null).deleted != null;
deletedAll &= PushRegisterManager.unregister(context, registration.packageName, registration.signature, null, null).deleted != null;
}
if (deletedAll) {
database.removeApp(packageName);
......
......@@ -22,6 +22,7 @@ import android.os.RemoteException;
import android.util.Log;
import com.google.android.gms.dynamic.IObjectWrapper;
import com.google.android.gms.dynamic.ObjectWrapper;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.internal.IMarkerDelegate;
......@@ -42,6 +43,7 @@ public class MarkerImpl extends IMarkerDelegate.Stub implements MarkerItemMarkup
private BitmapDescriptorImpl icon;
private AndroidBitmap oldBitmap;
private boolean removed = false;
private IObjectWrapper tag = null;
public MarkerImpl(String id, MarkerOptions options, MarkupListener listener) {
this.id = id;
......@@ -264,4 +266,24 @@ public class MarkerImpl extends IMarkerDelegate.Stub implements MarkerItemMarkup
private void prepareMarkerIcon(MarkerItem item) {
item.setMarker(new MarkerSymbol(oldBitmap, options.getAnchorU(), options.getAnchorV(), !options.isFlat()));
}
@Override
public void setZIndex(float zIndex) {
options.zIndex(zIndex);
}
@Override
public float getZIndex() {
return options.getZIndex();
}
@Override
public void setTag(IObjectWrapper obj) {
this.tag = obj;
}
@Override
public IObjectWrapper getTag() {
return this.tag == null ? ObjectWrapper.wrap(null) : this.tag;
}
}
......@@ -56,13 +56,12 @@ public class PeopleManager {
cursor.close();
databaseHelper.close();
if (url == null) return null;
String urlLastPart = url.substring(3);
String urlLastPart = url.replaceFirst(REGEX_SEARCH_USER_PHOTO, "");
File file = new File(context.getCacheDir(), urlLastPart);
if (!file.getParentFile().mkdirs() && file.exists()) {
return file;
}
if (!network) return null;
url = "https://lh" + url.toCharArray()[1] + ".googleusercontent.com/" + urlLastPart;
try {
URLConnection conn = new URL(url).openConnection();
conn.setDoInput(true);
......@@ -94,8 +93,7 @@ public class PeopleManager {
ContentValues contentValues = new ContentValues();
contentValues.put("account_name", account.name);
if (info.has("id")) contentValues.put("gaia_id", info.getString("id"));
if (info.has("picture"))
contentValues.put("avatar", info.getString("picture").replaceFirst(REGEX_SEARCH_USER_PHOTO, "~$1/"));
if (info.has("picture")) contentValues.put("avatar", info.getString("picture"));
if (info.has("name")) contentValues.put("display_name", info.getString("name"));
if (info.has("given_name")) contentValues.put("given_name", info.getString("given_name"));
if (info.has("family_name")) contentValues.put("family_name", info.getString("family_name"));
......
......@@ -139,15 +139,16 @@ public class Attestation {
}
}
public String attest() throws IOException {
public String attest(String apiKey) throws IOException {
if (payload == null) {
throw new IllegalStateException("missing payload");
}
return attest(new AttestRequest(ByteString.of(payload), droidGaurdResult)).result;
return attest(new AttestRequest(ByteString.of(payload), droidGaurdResult), apiKey).result;
}
private AttestResponse attest(AttestRequest request) throws IOException {
HttpURLConnection connection = (HttpURLConnection) new URL(SafetyNetPrefs.get(context).getServiceUrl()).openConnection();
private AttestResponse attest(AttestRequest request, String apiKey) throws IOException {
String requestUrl = SafetyNetPrefs.get(context).getServiceUrl() + "?alt=PROTO&key=" + apiKey;
HttpURLConnection connection = (HttpURLConnection) new URL(requestUrl).openConnection();
connection.setRequestMethod("POST");
connection.setDoInput(true);
connection.setDoOutput(true);
......
......@@ -39,6 +39,7 @@ import java.util.ArrayList;
public class SafetyNetClientServiceImpl extends ISafetyNetService.Stub {
private static final String TAG = "GmsSafetyNetClientImpl";
private static final String DEFAULT_API_KEY = "AIzaSyDqVnJBjE5ymo--oBJt3On7HQx9xNm1RHA";
private Context context;
private String packageName;
......@@ -52,7 +53,7 @@ public class SafetyNetClientServiceImpl extends ISafetyNetService.Stub {
@Override
public void attest(ISafetyNetCallbacks callbacks, byte[] nonce) throws RemoteException {
attestWithApiKey(callbacks, nonce, null);
attestWithApiKey(callbacks, nonce, DEFAULT_API_KEY);
}
@Override
......@@ -82,7 +83,7 @@ public class SafetyNetClientServiceImpl extends ISafetyNetService.Stub {
if (dg != null && dg.getStatusCode() == 0 && dg.getResult() != null) {
attestation.setDroidGaurdResult(Base64.encodeToString(dg.getResult(), Base64.NO_WRAP + Base64.NO_PADDING + Base64.URL_SAFE));
}
AttestationData data = new AttestationData(attestation.attest());
AttestationData data = new AttestationData(attestation.attest(apiKey));
callbacks.onAttestationData(Status.SUCCESS, data);
} else {
callbacks.onAttestationData(dg == null ? Status.INTERNAL_ERROR : new Status(dg.getStatusCode()), null);
......
......@@ -21,7 +21,7 @@ import android.content.SharedPreferences;
import android.preference.PreferenceManager;
public class SafetyNetPrefs implements SharedPreferences.OnSharedPreferenceChangeListener {
private static final String OFFICIAL_ATTEST_URL = "https://www.googleapis.com/androidcheck/v1/attestations/attest?alt=PROTO&key=AIzaSyDqVnJBjE5ymo--oBJt3On7HQx9xNm1RHA";
private static final String OFFICIAL_ATTEST_BASE_URL = "https://www.googleapis.com/androidcheck/v1/attestations/attest";
public static final String PREF_SNET_DISABLED = "snet_disabled";
public static final String PREF_SNET_OFFICIAL = "snet_official";
......@@ -89,7 +89,7 @@ public class SafetyNetPrefs implements SharedPreferences.OnSharedPreferenceChang
}
public String getServiceUrl() {
if (official) return OFFICIAL_ATTEST_URL;
if (official) return OFFICIAL_ATTEST_BASE_URL;