104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov/*
204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * Copyright (C) 2016 The Android Open Source Project
304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov *
404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * Licensed under the Apache License, Version 2.0 (the "License");
504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * you may not use this file except in compliance with the License.
604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * You may obtain a copy of the License at
704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov *
804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov *      http://www.apache.org/licenses/LICENSE-2.0
904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov *
1004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * Unless required by applicable law or agreed to in writing, software
1104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * distributed under the License is distributed on an "AS IS" BASIS,
1204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * See the License for the specific language governing permissions and
1404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * limitations under the License.
1504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov */
1604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov
1704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganovpackage android.util;
1804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov
1904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganovimport android.app.Service;
2004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganovimport android.content.Intent;
2104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganovimport android.os.IBinder;
2204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov
2304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganovimport java.io.IOException;
2404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov
2504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov/**
2604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov * Service to interact with a {@link MemoryIntArray} in another process.
2704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov */
2804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganovpublic class RemoteMemoryIntArrayService extends Service {
2904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov    private final Object mLock = new Object();
3004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov
3104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov    private MemoryIntArray mArray;
3204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov
3304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov    @Override
3404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov    public IBinder onBind(Intent intent) {
3504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov        return new android.util.IRemoteMemoryIntArray.Stub() {
3604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov
3704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            @Override
3804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            public void create(int size, boolean clientWritable) {
3904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                synchronized (mLock) {
4004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                    try {
4104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                        mArray = new MemoryIntArray(size, clientWritable);
4204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                    } catch (IOException e) {
4304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                        throw new IllegalStateException(e);
4404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                    }
4504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                }
4604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            }
4704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov
4804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            @Override
4904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            public MemoryIntArray peekInstance() {
5004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                synchronized (mLock) {
5104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                    return mArray;
5204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                }
5304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            }
5404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov
5504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            @Override
5604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            public boolean isWritable() {
5704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                synchronized (mLock) {
5804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                    return mArray.isWritable();
5904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                }
6004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            }
6104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov
6204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            @Override
6304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            public int get(int index) {
6404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                synchronized (mLock) {
6504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                    try {
6604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                        return mArray.get(index);
6704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                    } catch (IOException e) {
6804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                        throw new IllegalStateException(e);
6904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                    }
7004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                }
7104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            }
7204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov
7304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            @Override
7404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            public void set(int index, int value) {
7504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                synchronized (mLock) {
7604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                    try {
7704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                        mArray.set(index, value);
7804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                    } catch (IOException e) {
7904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                        throw new IllegalStateException(e);
8004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                    }
8104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                }
8204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            }
8304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov
8404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            @Override
8504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            public int size() {
8604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                synchronized (mLock) {
8704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                    try {
8804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                        return mArray.size();
8904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                    } catch (IOException e) {
9004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                        throw new IllegalStateException(e);
9104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                    }
9204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                }
9304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            }
9404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov
9504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            @Override
9604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            public void close() {
9704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                synchronized (mLock) {
9804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                    try {
9904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                        mArray.close();
10004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                    } catch (IOException e) {
10104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                        throw new IllegalStateException(e);
10204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                    }
10304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                }
10404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            }
10504df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov
10604df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            @Override
10704df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            public boolean isClosed() {
10804df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                synchronized (mLock) {
10904df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                    return mArray.isClosed();
11004df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov                }
11104df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov            }
11204df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov        };
11304df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov    }
11404df738bcb6584dd82b731a67f4cf8d6925b061eSvetoslav Ganov}
115