Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Verified Commit bae47fee authored by Marvin W.'s avatar Marvin W. 🐿️
Browse files

Fix wearable implementation network usage

parent f8a0c9c4
Loading
Loading
Loading
Loading
+12 −0
Original line number Original line Diff line number Diff line
@@ -21,6 +21,8 @@ import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.database.Cursor;
import android.database.Cursor;
import android.net.Uri;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.os.RemoteException;
import android.os.RemoteException;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.Base64;
import android.util.Base64;
@@ -87,6 +89,7 @@ public class WearableImpl {
    private ConnectionConfiguration[] configurations;
    private ConnectionConfiguration[] configurations;
    private boolean configurationsUpdated = false;
    private boolean configurationsUpdated = false;
    private ClockworkNodePreferences clockworkNodePreferences;
    private ClockworkNodePreferences clockworkNodePreferences;
    public Handler networkHandler;


    public WearableImpl(Context context, NodeDatabaseHelper nodeDatabase, ConfigurationDatabaseHelper configDatabase) {
    public WearableImpl(Context context, NodeDatabaseHelper nodeDatabase, ConfigurationDatabaseHelper configDatabase) {
        this.context = context;
        this.context = context;
@@ -94,6 +97,11 @@ public class WearableImpl {
        this.configDatabase = configDatabase;
        this.configDatabase = configDatabase;
        this.clockworkNodePreferences = new ClockworkNodePreferences(context);
        this.clockworkNodePreferences = new ClockworkNodePreferences(context);
        this.rpcHelper = new RpcHelper(context);
        this.rpcHelper = new RpcHelper(context);
        new Thread(() -> {
            Looper.prepare();
            networkHandler = new Handler(Looper.myLooper());
            Looper.loop();
        }).start();
    }
    }


    public String getLocalNodeId() {
    public String getLocalNodeId() {
@@ -619,4 +627,8 @@ public class WearableImpl {
        Log.d(TAG, targetNodeId + " seems not reachable");
        Log.d(TAG, targetNodeId + " seems not reachable");
        return -1;
        return -1;
    }
    }

    public void stop() {
        this.networkHandler.getLooper().quit();
    }
}
}
+15 −14
Original line number Original line Diff line number Diff line
@@ -16,10 +16,6 @@


package org.microg.gms.wearable;
package org.microg.gms.wearable;


import android.content.Context;
import android.os.Binder;
import android.os.Handler;
import android.os.Messenger;
import android.os.RemoteException;
import android.os.RemoteException;


import com.google.android.gms.common.internal.GetServiceRequest;
import com.google.android.gms.common.internal.GetServiceRequest;
@@ -31,24 +27,29 @@ import org.microg.gms.common.PackageUtils;


public class WearableService extends BaseService {
public class WearableService extends BaseService {


    private static WearableImpl wearable;
    private WearableImpl wearable;


    public WearableService() {
    public WearableService() {
        super("GmsWearSvc", GmsService.WEARABLE);
        super("GmsWearSvc", GmsService.WEARABLE);
    }
    }


    private synchronized static WearableImpl getWearable(Context appCtx) {
    @Override
        if (wearable == null) {
    public void onCreate() {
            ConfigurationDatabaseHelper configurationDatabaseHelper = new ConfigurationDatabaseHelper(appCtx);
        super.onCreate();
            NodeDatabaseHelper nodeDatabaseHelper = new NodeDatabaseHelper(appCtx);
        ConfigurationDatabaseHelper configurationDatabaseHelper = new ConfigurationDatabaseHelper(getApplicationContext());
            wearable = new WearableImpl(appCtx, nodeDatabaseHelper, configurationDatabaseHelper);
        NodeDatabaseHelper nodeDatabaseHelper = new NodeDatabaseHelper(getApplicationContext());
        wearable = new WearableImpl(getApplicationContext(), nodeDatabaseHelper, configurationDatabaseHelper);
    }
    }
        return wearable;

    @Override
    public void onDestroy() {
        super.onDestroy();
        wearable.stop();
    }
    }


    @Override
    @Override
    public void handleServiceRequest(IGmsCallbacks callback, GetServiceRequest request, GmsService service) throws RemoteException {
    public void handleServiceRequest(IGmsCallbacks callback, GetServiceRequest request, GmsService service) throws RemoteException {
        PackageUtils.checkPackageUid(this, request.packageName, Binder.getCallingUid());
        PackageUtils.getAndCheckCallingPackage(this, request.packageName);
        callback.onPostInitComplete(0, new WearableServiceImpl(this, getWearable(getApplicationContext()), request.packageName), null);
        callback.onPostInitComplete(0, new WearableServiceImpl(this, wearable, request.packageName), null);
    }
    }
}
}
+96 −111
Original line number Original line Diff line number Diff line
@@ -55,13 +55,31 @@ public class WearableServiceImpl extends IWearableService.Stub {
    private final Context context;
    private final Context context;
    private final String packageName;
    private final String packageName;
    private final WearableImpl wearable;
    private final WearableImpl wearable;
    private final Handler handler;
    private final Handler mainHandler;


    public WearableServiceImpl(Context context, WearableImpl wearable, String packageName) {
    public WearableServiceImpl(Context context, WearableImpl wearable, String packageName) {
        this.context = context;
        this.context = context;
        this.wearable = wearable;
        this.wearable = wearable;
        this.packageName = packageName;
        this.packageName = packageName;
        this.handler = new Handler(context.getMainLooper());
        this.mainHandler = new Handler(context.getMainLooper());
    }

    private void postMain(IWearableCallbacks callbacks, RemoteExceptionRunnable runnable) {
        mainHandler.post(new CallbackRunnable(callbacks) {
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
                runnable.run();
            }
        });
    }

    private void postNetwork(IWearableCallbacks callbacks, RemoteExceptionRunnable runnable) {
        this.wearable.networkHandler.post(new CallbackRunnable(callbacks) {
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
                runnable.run();
            }
        });
    }
    }


    /*
    /*
@@ -70,38 +88,29 @@ public class WearableServiceImpl extends IWearableService.Stub {


    @Override
    @Override
    public void putConfig(IWearableCallbacks callbacks, final ConnectionConfiguration config) throws RemoteException {
    public void putConfig(IWearableCallbacks callbacks, final ConnectionConfiguration config) throws RemoteException {
        handler.post(new CallbackRunnable(callbacks) {
        postMain(callbacks, () -> {
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
            wearable.createConnection(config);
            wearable.createConnection(config);
            callbacks.onStatus(Status.SUCCESS);
            callbacks.onStatus(Status.SUCCESS);
            }
        });
        });
    }
    }


    @Override
    @Override
    public void deleteConfig(IWearableCallbacks callbacks, final String name) throws RemoteException {
    public void deleteConfig(IWearableCallbacks callbacks, final String name) throws RemoteException {
        handler.post(new CallbackRunnable(callbacks) {
        postMain(callbacks, () -> {
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
            wearable.deleteConnection(name);
            wearable.deleteConnection(name);
            callbacks.onStatus(Status.SUCCESS);
            callbacks.onStatus(Status.SUCCESS);
            }
        });
        });
    }
    }


    @Override
    @Override
    public void getConfigs(IWearableCallbacks callbacks) throws RemoteException {
    public void getConfigs(IWearableCallbacks callbacks) throws RemoteException {
        Log.d(TAG, "getConfigs");
        Log.d(TAG, "getConfigs");
        handler.post(new CallbackRunnable(callbacks) {
        postMain(callbacks, () -> {
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
            try {
            try {
                callbacks.onGetConfigsResponse(new GetConfigsResponse(0, wearable.getConfigurations()));
                callbacks.onGetConfigsResponse(new GetConfigsResponse(0, wearable.getConfigurations()));
            } catch (Exception e) {
            } catch (Exception e) {
                callbacks.onGetConfigsResponse(new GetConfigsResponse(8, new ConnectionConfiguration[0]));
                callbacks.onGetConfigsResponse(new GetConfigsResponse(8, new ConnectionConfiguration[0]));
            }
            }
            }
        });
        });
    }
    }


@@ -109,24 +118,18 @@ public class WearableServiceImpl extends IWearableService.Stub {
    @Override
    @Override
    public void enableConfig(IWearableCallbacks callbacks, final String name) throws RemoteException {
    public void enableConfig(IWearableCallbacks callbacks, final String name) throws RemoteException {
        Log.d(TAG, "enableConfig: " + name);
        Log.d(TAG, "enableConfig: " + name);
        handler.post(new CallbackRunnable(callbacks) {
        postMain(callbacks, () -> {
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
            wearable.enableConnection(name);
            wearable.enableConnection(name);
            callbacks.onStatus(Status.SUCCESS);
            callbacks.onStatus(Status.SUCCESS);
            }
        });
        });
    }
    }


    @Override
    @Override
    public void disableConfig(IWearableCallbacks callbacks, final String name) throws RemoteException {
    public void disableConfig(IWearableCallbacks callbacks, final String name) throws RemoteException {
        Log.d(TAG, "disableConfig: " + name);
        Log.d(TAG, "disableConfig: " + name);
        handler.post(new CallbackRunnable(callbacks) {
        postMain(callbacks, () -> {
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
            wearable.disableConnection(name);
            wearable.disableConnection(name);
            callbacks.onStatus(Status.SUCCESS);
            callbacks.onStatus(Status.SUCCESS);
            }
        });
        });
    }
    }


@@ -137,7 +140,7 @@ public class WearableServiceImpl extends IWearableService.Stub {
    @Override
    @Override
    public void putData(IWearableCallbacks callbacks, final PutDataRequest request) throws RemoteException {
    public void putData(IWearableCallbacks callbacks, final PutDataRequest request) throws RemoteException {
        Log.d(TAG, "putData: " + request.toString(true));
        Log.d(TAG, "putData: " + request.toString(true));
        handler.post(new CallbackRunnable(callbacks) {
        this.wearable.networkHandler.post(new CallbackRunnable(callbacks) {
            @Override
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
            public void run(IWearableCallbacks callbacks) throws RemoteException {
                DataItemRecord record = wearable.putData(request, packageName);
                DataItemRecord record = wearable.putData(request, packageName);
@@ -149,27 +152,21 @@ public class WearableServiceImpl extends IWearableService.Stub {
    @Override
    @Override
    public void getDataItem(IWearableCallbacks callbacks, final Uri uri) throws RemoteException {
    public void getDataItem(IWearableCallbacks callbacks, final Uri uri) throws RemoteException {
        Log.d(TAG, "getDataItem: " + uri);
        Log.d(TAG, "getDataItem: " + uri);
        handler.post(new CallbackRunnable(callbacks) {
        postMain(callbacks, () -> {
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
            DataItemRecord record = wearable.getDataItemByUri(uri, packageName);
            DataItemRecord record = wearable.getDataItemByUri(uri, packageName);
            if (record != null) {
            if (record != null) {
                callbacks.onGetDataItemResponse(new GetDataItemResponse(0, record.toParcelable()));
                callbacks.onGetDataItemResponse(new GetDataItemResponse(0, record.toParcelable()));
            } else {
            } else {
                callbacks.onGetDataItemResponse(new GetDataItemResponse(0, null));
                callbacks.onGetDataItemResponse(new GetDataItemResponse(0, null));
            }
            }
            }
        });
        });
    }
    }


    @Override
    @Override
    public void getDataItems(final IWearableCallbacks callbacks) throws RemoteException {
    public void getDataItems(final IWearableCallbacks callbacks) throws RemoteException {
        Log.d(TAG, "getDataItems: " + callbacks);
        Log.d(TAG, "getDataItems: " + callbacks);
        handler.post(new CallbackRunnable(callbacks) {
        postMain(callbacks, () -> {
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
            callbacks.onDataItemChanged(wearable.getDataItemsAsHolder(packageName));
            callbacks.onDataItemChanged(wearable.getDataItemsAsHolder(packageName));
            }
        });
        });
    }
    }


@@ -181,11 +178,8 @@ public class WearableServiceImpl extends IWearableService.Stub {
    @Override
    @Override
    public void getDataItemsByUriWithFilter(IWearableCallbacks callbacks, final Uri uri, int typeFilter) throws RemoteException {
    public void getDataItemsByUriWithFilter(IWearableCallbacks callbacks, final Uri uri, int typeFilter) throws RemoteException {
        Log.d(TAG, "getDataItemsByUri: " + uri);
        Log.d(TAG, "getDataItemsByUri: " + uri);
        handler.post(new CallbackRunnable(callbacks) {
        postMain(callbacks, () -> {
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
            callbacks.onDataItemChanged(wearable.getDataItemsByUriAsHolder(uri, packageName));
            callbacks.onDataItemChanged(wearable.getDataItemsByUriAsHolder(uri, packageName));
            }
        });
        });
    }
    }


@@ -197,18 +191,15 @@ public class WearableServiceImpl extends IWearableService.Stub {
    @Override
    @Override
    public void deleteDataItemsWithFilter(IWearableCallbacks callbacks, final Uri uri, int typeFilter) throws RemoteException {
    public void deleteDataItemsWithFilter(IWearableCallbacks callbacks, final Uri uri, int typeFilter) throws RemoteException {
        Log.d(TAG, "deleteDataItems: " + uri);
        Log.d(TAG, "deleteDataItems: " + uri);
        handler.post(new CallbackRunnable(callbacks) {
        postMain(callbacks, () -> {
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
            callbacks.onDeleteDataItemsResponse(new DeleteDataItemsResponse(0, wearable.deleteDataItems(uri, packageName)));
            callbacks.onDeleteDataItemsResponse(new DeleteDataItemsResponse(0, wearable.deleteDataItems(uri, packageName)));
            }
        });
        });
    }
    }


    @Override
    @Override
    public void sendMessage(IWearableCallbacks callbacks, final String targetNodeId, final String path, final byte[] data) throws RemoteException {
    public void sendMessage(IWearableCallbacks callbacks, final String targetNodeId, final String path, final byte[] data) throws RemoteException {
        Log.d(TAG, "sendMessage: " + targetNodeId + " / " + path + ": " + (data == null ? null : Base64.encodeToString(data, Base64.NO_WRAP)));
        Log.d(TAG, "sendMessage: " + targetNodeId + " / " + path + ": " + (data == null ? null : Base64.encodeToString(data, Base64.NO_WRAP)));
        handler.post(new CallbackRunnable(callbacks) {
        this.wearable.networkHandler.post(new CallbackRunnable(callbacks) {
            @Override
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
            public void run(IWearableCallbacks callbacks) throws RemoteException {
                SendMessageResponse sendMessageResponse = new SendMessageResponse();
                SendMessageResponse sendMessageResponse = new SendMessageResponse();
@@ -220,7 +211,13 @@ public class WearableServiceImpl extends IWearableService.Stub {
                } catch (Exception e) {
                } catch (Exception e) {
                    sendMessageResponse.statusCode = 8;
                    sendMessageResponse.statusCode = 8;
                }
                }
                mainHandler.post(() -> {
                    try {
                        callbacks.onSendMessageResponse(sendMessageResponse);
                        callbacks.onSendMessageResponse(sendMessageResponse);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                });
            }
            }
        });
        });
    }
    }
@@ -228,16 +225,13 @@ public class WearableServiceImpl extends IWearableService.Stub {
    @Override
    @Override
    public void getFdForAsset(IWearableCallbacks callbacks, final Asset asset) throws RemoteException {
    public void getFdForAsset(IWearableCallbacks callbacks, final Asset asset) throws RemoteException {
        Log.d(TAG, "getFdForAsset " + asset);
        Log.d(TAG, "getFdForAsset " + asset);
        handler.post(new CallbackRunnable(callbacks) {
        postMain(callbacks, () -> {
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
            // TODO: Access control
            // TODO: Access control
            try {
            try {
                callbacks.onGetFdForAssetResponse(new GetFdForAssetResponse(0, ParcelFileDescriptor.open(wearable.createAssetFile(asset.getDigest()), ParcelFileDescriptor.MODE_READ_ONLY)));
                callbacks.onGetFdForAssetResponse(new GetFdForAssetResponse(0, ParcelFileDescriptor.open(wearable.createAssetFile(asset.getDigest()), ParcelFileDescriptor.MODE_READ_ONLY)));
            } catch (FileNotFoundException e) {
            } catch (FileNotFoundException e) {
                callbacks.onGetFdForAssetResponse(new GetFdForAssetResponse(8, null));
                callbacks.onGetFdForAssetResponse(new GetFdForAssetResponse(8, null));
            }
            }
            }
        });
        });
    }
    }


@@ -274,25 +268,19 @@ public class WearableServiceImpl extends IWearableService.Stub {


    @Override
    @Override
    public void getLocalNode(IWearableCallbacks callbacks) throws RemoteException {
    public void getLocalNode(IWearableCallbacks callbacks) throws RemoteException {
        handler.post(new CallbackRunnable(callbacks) {
        postMain(callbacks, () -> {
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
            try {
            try {
                callbacks.onGetLocalNodeResponse(new GetLocalNodeResponse(0, new NodeParcelable(wearable.getLocalNodeId(), wearable.getLocalNodeId())));
                callbacks.onGetLocalNodeResponse(new GetLocalNodeResponse(0, new NodeParcelable(wearable.getLocalNodeId(), wearable.getLocalNodeId())));
            } catch (Exception e) {
            } catch (Exception e) {
                callbacks.onGetLocalNodeResponse(new GetLocalNodeResponse(8, null));
                callbacks.onGetLocalNodeResponse(new GetLocalNodeResponse(8, null));
            }
            }
            }
        });
        });
    }
    }


    @Override
    @Override
    public void getConnectedNodes(IWearableCallbacks callbacks) throws RemoteException {
    public void getConnectedNodes(IWearableCallbacks callbacks) throws RemoteException {
        handler.post(new CallbackRunnable(callbacks) {
        postMain(callbacks, () -> {
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
            callbacks.onGetConnectedNodesResponse(new GetConnectedNodesResponse(0, wearable.getConnectedNodesParcelableList()));
            callbacks.onGetConnectedNodesResponse(new GetConnectedNodesResponse(0, wearable.getConnectedNodesParcelableList()));
            }
        });
        });
    }
    }


@@ -437,44 +425,35 @@ public class WearableServiceImpl extends IWearableService.Stub {
    @Deprecated
    @Deprecated
    public void getConnection(IWearableCallbacks callbacks) throws RemoteException {
    public void getConnection(IWearableCallbacks callbacks) throws RemoteException {
        Log.d(TAG, "getConfig");
        Log.d(TAG, "getConfig");
        handler.post(new CallbackRunnable(callbacks) {
        postMain(callbacks, () -> {
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
            ConnectionConfiguration[] configurations = wearable.getConfigurations();
            ConnectionConfiguration[] configurations = wearable.getConfigurations();
            if (configurations == null || configurations.length == 0) {
            if (configurations == null || configurations.length == 0) {
                callbacks.onGetConfigResponse(new GetConfigResponse(1, new ConnectionConfiguration(null, null, 0, 0, false)));
                callbacks.onGetConfigResponse(new GetConfigResponse(1, new ConnectionConfiguration(null, null, 0, 0, false)));
            } else {
            } else {
                callbacks.onGetConfigResponse(new GetConfigResponse(0, configurations[0]));
                callbacks.onGetConfigResponse(new GetConfigResponse(0, configurations[0]));
            }
            }
            }
        });
        });
    }
    }


    @Override
    @Override
    @Deprecated
    @Deprecated
    public void enableConnection(IWearableCallbacks callbacks) throws RemoteException {
    public void enableConnection(IWearableCallbacks callbacks) throws RemoteException {
        handler.post(new CallbackRunnable(callbacks) {
        postMain(callbacks, () -> {
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
            ConnectionConfiguration[] configurations = wearable.getConfigurations();
            ConnectionConfiguration[] configurations = wearable.getConfigurations();
            if (configurations.length > 0) {
            if (configurations.length > 0) {
                enableConfig(callbacks, configurations[0].name);
                enableConfig(callbacks, configurations[0].name);
            }
            }
            }
        });
        });
    }
    }


    @Override
    @Override
    @Deprecated
    @Deprecated
    public void disableConnection(IWearableCallbacks callbacks) throws RemoteException {
    public void disableConnection(IWearableCallbacks callbacks) throws RemoteException {
        handler.post(new CallbackRunnable(callbacks) {
        postMain(callbacks, () -> {
            @Override
            public void run(IWearableCallbacks callbacks) throws RemoteException {
            ConnectionConfiguration[] configurations = wearable.getConfigurations();
            ConnectionConfiguration[] configurations = wearable.getConfigurations();
            if (configurations.length > 0) {
            if (configurations.length > 0) {
                disableConfig(callbacks, configurations[0].name);
                disableConfig(callbacks, configurations[0].name);
            }
            }
            }
        });
        });
    }
    }


@@ -497,14 +476,20 @@ public class WearableServiceImpl extends IWearableService.Stub {
            try {
            try {
                run(callbacks);
                run(callbacks);
            } catch (RemoteException e) {
            } catch (RemoteException e) {
                mainHandler.post(() -> {
                    try {
                    try {
                        callbacks.onStatus(Status.CANCELED);
                        callbacks.onStatus(Status.CANCELED);
                } catch (RemoteException e1) {
                    } catch (RemoteException e2) {
                        Log.w(TAG, e);
                        Log.w(TAG, e);
                    }
                    }
                });
            }
            }
        }
        }


        public abstract void run(IWearableCallbacks callbacks) throws RemoteException;
        public abstract void run(IWearableCallbacks callbacks) throws RemoteException;
    }
    }

    public interface RemoteExceptionRunnable {
        void run() throws RemoteException;
    }
}
}