/* * 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.common; import android.os.Looper; import android.os.Message; import android.os.RemoteException; import android.util.Log; import com.google.android.gms.common.api.Api; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.PendingResult; import com.google.android.gms.common.api.Result; import org.microg.gms.common.api.AbstractPendingResult; import org.microg.gms.common.api.ApiClient; import org.microg.gms.common.api.GoogleApiClientImpl; public class GmsConnector { private static final String TAG = "GmsConnector"; private final GoogleApiClientImpl apiClient; private final Api api; private final Callback callback; public GmsConnector(GoogleApiClient apiClient, Api api, Callback callback) { this.apiClient = (GoogleApiClientImpl) apiClient; this.api = api; this.callback = callback; } public static PendingResult call(GoogleApiClient client, Api api, GmsConnector.Callback callback) { return new GmsConnector(client, api, callback).connect(); } public AbstractPendingResult connect() { Log.d(TAG, "connect()"); apiClient.incrementUsageCounter(); apiClient.getApiConnection(api); Looper looper = apiClient.getLooper(); final AbstractPendingResult result = new AbstractPendingResult(looper); Message msg = new Message(); msg.obj = result; new Handler(looper).sendMessage(msg); return result; } public interface Callback { void onClientAvailable(C client, ResultProvider resultProvider) throws RemoteException; interface ResultProvider { void onResultAvailable(R result); } } private class Handler extends android.os.Handler { private Handler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { Log.d(TAG, "Handler : handleMessage"); final AbstractPendingResult result = (AbstractPendingResult) msg.obj; try { C connection = (C) apiClient.getApiConnection(api); callback.onClientAvailable(connection, new GmsConnector.Callback.ResultProvider() { @Override public void onResultAvailable(R realResult) { result.deliverResult(realResult); apiClient.decrementUsageCounter(); } }); } catch (RemoteException ignored) { } } } }