Some work...

This commit is contained in:
mar-v-in 2015-01-18 23:57:09 +01:00
parent d2fb7d569b
commit 6af3c0b700
10 changed files with 173 additions and 30 deletions

View File

@ -1,7 +1,6 @@
package com.google.android.gms.common.api;
import android.content.Context;
import android.os.Looper;
import org.microg.gms.common.api.ApiBuilder;
/**
* Describes a section of the Google Play Services API that should be made available. Instances of
@ -17,13 +16,13 @@ import android.os.Looper;
*/
public final class Api<O extends Api.ApiOptions> {
private final Builder<O> builder;
private final ApiBuilder<O> builder;
public Api(Builder<O> builder) {
public Api(ApiBuilder<O> builder) {
this.builder = builder;
}
public Builder<O> getBuilder() {
public ApiBuilder<O> getBuilder() {
return builder;
}
@ -57,15 +56,4 @@ public final class Api<O extends Api.ApiOptions> {
}
}
public interface Connection {
public void connect();
public void disconnect();
public boolean isConnected();
}
public interface Builder<O extends ApiOptions> {
Connection build(Context context, Looper looper, O options, AccountInfo accountInfo,
GoogleApiClient.ConnectionCallbacks callbacks,
GoogleApiClient.OnConnectionFailedListener connectionFailedListener);
}
}

View File

@ -4,6 +4,9 @@ import android.content.Context;
import android.os.Looper;
import com.google.android.gms.common.api.AccountInfo;
import com.google.android.gms.common.api.Api;
import org.microg.gms.common.api.ApiConnection;
import org.microg.gms.common.api.ApiBuilder;
import com.google.android.gms.common.api.GoogleApiClient;
import org.microg.gms.location.FusedLocationProviderApiImpl;
import org.microg.gms.location.GeofencingApiImpl;
@ -14,9 +17,9 @@ import org.microg.gms.location.LocationClientImpl;
*/
public class LocationServices {
public static final Api<Api.ApiOptions.NoOptions> API = new Api<>(
new Api.Builder<Api.ApiOptions.NoOptions>() {
new ApiBuilder<Api.ApiOptions.NoOptions>() {
@Override
public Api.Connection build(Context context, Looper looper,
public ApiConnection build(Context context, Looper looper,
Api.ApiOptions.NoOptions options,
AccountInfo accountInfo, GoogleApiClient.ConnectionCallbacks callbacks,
GoogleApiClient.OnConnectionFailedListener connectionFailedListener) {

View File

@ -9,11 +9,11 @@ import android.os.IInterface;
import android.os.RemoteException;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.api.Api;
import org.microg.gms.common.api.ApiConnection;
import com.google.android.gms.common.internal.IGmsCallbacks;
import com.google.android.gms.common.internal.IGmsServiceBroker;
public abstract class GmsClient<I extends IInterface> implements Api.Connection {
public abstract class GmsClient<I extends IInterface> implements ApiConnection {
private static final String TAG = "GmsClient";
private final Context context;

View File

@ -0,0 +1,79 @@
/*
* Copyright 2014-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.common;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import com.google.android.gms.common.api.Api;
import org.microg.gms.common.api.AbstractPendingResult;
import org.microg.gms.common.api.ApiConnection;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.Result;
import org.microg.gms.common.api.GoogleApiClientImpl;
public class GmsConnector {
public static <C extends ApiConnection, R extends Result, O extends Api.ApiOptions>
AbstractPendingResult<R> connect(GoogleApiClient apiClient, Api<O> api, Callback<C, R> callback) {
Looper looper = ((GoogleApiClientImpl) apiClient).getLooper();
final AbstractPendingResult<R> result = new AbstractPendingResult<>(looper);
Message msg = new Message();
msg.obj = new ConnectRequest<C, R, O>((GoogleApiClientImpl) apiClient, api, result, callback);
new Handler<C, R, O>(looper).sendMessage(msg);
return result;
}
public static interface Callback<C, R> {
public R onClientAvailable(C client) throws RemoteException;
}
private static class Handler<C extends ApiConnection, R extends Result, O extends Api.ApiOptions> extends android.os.Handler {
private Handler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
ConnectRequest<C, R, O> request = (ConnectRequest<C, R, O>) msg.obj;
ApiConnection apiConnection = request.apiClient.getApiConnection(request.api);
apiConnection.connect();
try {
request.result.setResult(request.callback.onClientAvailable((C) apiConnection));
} catch (RemoteException ignored) {
}
}
}
private static class ConnectRequest<C extends ApiConnection, R extends Result, O extends Api.ApiOptions> {
GoogleApiClientImpl apiClient;
Api<O> api;
AbstractPendingResult<R> result;
Callback<C, R> callback;
private ConnectRequest(GoogleApiClientImpl apiClient, Api<O> api, AbstractPendingResult<R> result, Callback<C, R> callback) {
this.apiClient = apiClient;
this.api = api;
this.result = result;
this.callback = callback;
}
}
}

View File

@ -11,13 +11,13 @@ import java.util.concurrent.TimeUnit;
public class AbstractPendingResult<R extends Result> implements PendingResult<R> {
private final Object lock = new Object();
private final CountDownLatch countDownLatch = new CountDownLatch(1);
private final CallbackHandler handler;
private final CallbackHandler<R> handler;
private boolean canceled;
private R result;
private ResultCallback<R> resultCallback;
public AbstractPendingResult(Looper looper) {
handler = new CallbackHandler(looper);
handler = new CallbackHandler<R>(looper);
}
private R getResult() {
@ -92,4 +92,7 @@ public class AbstractPendingResult<R extends Result> implements PendingResult<R>
}
public void setResult(R result) {
this.result = result;
}
}

View File

@ -0,0 +1,32 @@
/*
* Copyright 2014-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.common.api;
import android.content.Context;
import android.os.Looper;
import com.google.android.gms.common.api.AccountInfo;
import com.google.android.gms.common.api.Api;
import com.google.android.gms.common.api.GoogleApiClient;
import org.microg.gms.common.api.ApiConnection;
public interface ApiBuilder<O extends Api.ApiOptions> {
ApiConnection build(Context context, Looper looper, O options, AccountInfo accountInfo,
GoogleApiClient.ConnectionCallbacks callbacks,
GoogleApiClient.OnConnectionFailedListener connectionFailedListener);
}

View File

@ -0,0 +1,23 @@
/*
* Copyright 2014-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.common.api;
public interface ApiConnection {
public void connect();
public void disconnect();
public boolean isConnected();
}

View File

@ -28,7 +28,10 @@ class CallbackHandler<R extends Result> extends Handler {
}
public void sendResultCallback(ResultCallback<R> callback, R result) {
Message message = new Message();
message.what = CALLBACK_ON_COMPLETE;
message.obj = new OnCompleteObject<R>(callback, result);
sendMessage(message);
}
public void sendTimeoutResultCallback(AbstractPendingResult pendingResult, long millis) {
@ -38,5 +41,10 @@ class CallbackHandler<R extends Result> extends Handler {
public static class OnCompleteObject<R extends Result> {
public ResultCallback<R> callback;
public R result;
public OnCompleteObject(ResultCallback<R> callback, R result) {
this.callback = callback;
this.result = result;
}
}
}

View File

@ -18,9 +18,10 @@ public class GoogleApiClientImpl implements GoogleApiClient {
private final Looper looper;
private final AccountInfo accountInfo;
private final Map<Api, Api.ApiOptions> apis = new HashMap<>();
private final Map<Api, Api.Connection> apiConnections = new HashMap<>();
private final Map<Api, ApiConnection> apiConnections = new HashMap<>();
private final Set<ConnectionCallbacks> connectionCallbacks = new HashSet<>();
private final Set<OnConnectionFailedListener> connectionFailedListeners = new HashSet<>();
private final int clientId;
private final ConnectionCallbacks baseConnectionCallbacks = new ConnectionCallbacks() {
@Override
public void onConnected(Bundle connectionHint) {
@ -44,7 +45,6 @@ public class GoogleApiClientImpl implements GoogleApiClient {
}
}
};
private final int clientId;
public GoogleApiClientImpl(Context context, Looper looper, AccountInfo accountInfo,
Map<Api, Api.ApiOptions> apis,
@ -64,8 +64,12 @@ public class GoogleApiClientImpl implements GoogleApiClient {
baseConnectionFailedListener));
}
}
public Api.Connection getApiConnection(Api api) {
public Looper getLooper() {
return looper;
}
public ApiConnection getApiConnection(Api api) {
return apiConnections.get(api);
}
@ -86,21 +90,21 @@ public class GoogleApiClientImpl implements GoogleApiClient {
@Override
public void connect() {
for (Api.Connection connection : apiConnections.values()) {
for (ApiConnection connection : apiConnections.values()) {
connection.connect();
}
}
@Override
public void disconnect() {
for (Api.Connection connection : apiConnections.values()) {
for (ApiConnection connection : apiConnections.values()) {
connection.disconnect();
}
}
@Override
public boolean isConnected() {
for (Api.Connection connection : apiConnections.values()) {
for (ApiConnection connection : apiConnections.values()) {
if (!connection.isConnected()) return false;
}
return true;

View File

@ -11,6 +11,8 @@ import com.google.android.gms.location.FusedLocationProviderApi;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import org.microg.gms.common.GmsConnector;
public class FusedLocationProviderApiImpl implements FusedLocationProviderApi {
private static final String TAG = "GmsFusedApiImpl";
@ -27,6 +29,7 @@ public class FusedLocationProviderApiImpl implements FusedLocationProviderApi {
@Override
public PendingResult requestLocationUpdates(GoogleApiClient client, LocationRequest request,
LocationListener listener) {
//LocationClientImpl.get(client).requestLocationUpdates(request, listener);
return null;
}