27
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
28
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
29
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
30
+import com.remoteyourcam.usb.ptp.model.LiveViewData;
31
+
32
+public class EosGetLiveViewPictureCommand extends EosCommand {
33
+
34
+    private static final String TAG = EosGetLiveViewPictureCommand.class.getSimpleName();
35
+    private static byte[] tmpStorage = new byte[0x4000];
36
+    private final Options options;
37
+    private LiveViewData data;
38
+
39
+    public EosGetLiveViewPictureCommand(EosCamera camera, LiveViewData data) {
40
+        super(camera);
41
+        if (data == null) {
42
+            this.data = new LiveViewData();
43
+            this.data.histogram = ByteBuffer.allocate(1024 * 4);
44
+            this.data.histogram.order(ByteOrder.LITTLE_ENDIAN);
45
+        } else {
46
+            this.data = data;
47
+        }
48
+        options = new BitmapFactory.Options();
49
+        options.inBitmap = this.data.bitmap;
50
+        options.inSampleSize = 1;
51
+        options.inTempStorage = tmpStorage;
52
+        this.data.bitmap = null;
53
+    }
54
+
55
+    @Override
56
+    public void exec(IO io) {
57
+        io.handleCommand(this);
58
+        if (responseCode == Response.DeviceBusy) {
59
+            camera.onDeviceBusy(this, true);
60
+            return;
61
+        }
62
+        if (this.data.bitmap != null && responseCode == Response.Ok) {
63
+            camera.onLiveViewReceived(data);
64
+        } else {
65
+            camera.onLiveViewReceived(null);
66
+        }
67
+    }
68
+
69
+    @Override
70
+    public void encodeCommand(ByteBuffer b) {
71
+        encodeCommand(b, Operation.EosGetLiveViewPicture, 0x100000);
72
+    }
73
+
74
+    @Override
75
+    protected void decodeData(ByteBuffer b, int length) {
76
+
77
+        data.hasHistogram = false;
78
+        data.hasAfFrame = false;
79
+
80
+        if (length < 1000) {
81
+            if (AppConfig.LOG) {
82
+                Log.w(TAG, String.format("liveview data size too small %d", length));
83
+            }
84
+            return;
85
+        }
86
+
87
+        try {
88
+
89
+            while (b.hasRemaining()) {
90
+                int subLength = b.getInt();
91
+                int type = b.getInt();
92
+
93
+                if (subLength < 8) {
94
+                    throw new RuntimeException("Invalid sub size " + subLength);
95
+                }
96
+
97
+                int unknownInt = 0;
98
+
99
+                switch (type) {
100
+                case 0x01:
101
+                    data.bitmap = BitmapFactory.decodeByteArray(b.array(), b.position(), subLength - 8, options);
102
+                    b.position(b.position() + subLength - 8);
103
+                    break;
104
+                case 0x04:
105
+                    data.zoomFactor = b.getInt();
106
+                    break;
107
+                case 0x05:
108
+                    // zoomfocusx, zoomfocusy
109
+                    data.zoomRectRight = b.getInt();
110
+                    data.zoomRectBottom = b.getInt();
111
+                    if (AppConfig.LOG) {
112
+                        Log.i(TAG, "header 5 " + data.zoomRectRight + " " + data.zoomRectBottom);
113
+                    }
114
+                    break;
115
+                case 0x06:
116
+                    // imagex, imagey (if zoomed should be non zero)
117
+                    data.zoomRectLeft = b.getInt();
118
+                    data.zoomRectTop = b.getInt();
119
+                    if (AppConfig.LOG) {
120
+                        Log.i(TAG, "header 6 " + data.zoomRectLeft + " " + data.zoomRectTop);
121
+                    }
122
+                    break;
123
+                case 0x07:
124
+                    unknownInt = b.getInt();
125
+                    if (AppConfig.LOG) {
126
+                        Log.i(TAG, "header 7 " + unknownInt + " " + subLength);
127
+                    }
128
+                    break;
129
+                case 0x03:
130
+                    data.hasHistogram = true;
131
+                    b.get(data.histogram.array(), 0, 1024 * 4);
132
+                    break;
133
+                case 0x08: // faces if faces focus
134
+                case 0x0e: // TODO original width, original height
135
+                default:
136
+                    b.position(b.position() + subLength - 8);
137
+                    if (AppConfig.LOG) {
138
+                        Log.i(TAG, "unknown header " + type + " size " + subLength);
139
+                    }
140
+                    break;
141
+                }
142
+
143
+                if (length - b.position() < 8) {
144
+                    break;
145
+                }
146
+            }
147
+
148
+        } catch (RuntimeException e) {
149
+            Log.e(TAG, "" + e.toString());
150
+            Log.e(TAG, "" + e.getLocalizedMessage());
151
+        }
152
+    }
153
+}

+ 65 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/eos/EosOpenSessionAction.java

@@ -0,0 +1,65 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.eos;
17
+
18
+import com.remoteyourcam.usb.ptp.EosCamera;
19
+import com.remoteyourcam.usb.ptp.PtpAction;
20
+import com.remoteyourcam.usb.ptp.PtpConstants;
21
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
22
+import com.remoteyourcam.usb.ptp.commands.OpenSessionCommand;
23
+
24
+public class EosOpenSessionAction implements PtpAction {
25
+
26
+    private final EosCamera camera;
27
+
28
+    public EosOpenSessionAction(EosCamera camera) {
29
+        this.camera = camera;
30
+    }
31
+
32
+    @Override
33
+    public void exec(IO io) {
34
+        OpenSessionCommand openSession = new OpenSessionCommand(camera);
35
+        io.handleCommand(openSession);
36
+        if (openSession.getResponseCode() == PtpConstants.Response.Ok) {
37
+            EosSetPcModeCommand setPcMode = new EosSetPcModeCommand(camera);
38
+            io.handleCommand(setPcMode);
39
+            if (setPcMode.getResponseCode() == PtpConstants.Response.Ok) {
40
+                EosSetExtendedEventInfoCommand c = new EosSetExtendedEventInfoCommand(camera);
41
+                io.handleCommand(c);
42
+                if (c.getResponseCode() == PtpConstants.Response.Ok) {
43
+                    camera.onSessionOpened();
44
+                    return;
45
+                } else {
46
+                    camera.onPtpError(String.format(
47
+                            "Couldn't open session! Setting extended event info failed with error code \"%s\"",
48
+                            PtpConstants.responseToString(c.getResponseCode())));
49
+                }
50
+            } else {
51
+                camera.onPtpError(String.format(
52
+                        "Couldn't open session! Setting PcMode property failed with error code \"%s\"",
53
+                        PtpConstants.responseToString(setPcMode.getResponseCode())));
54
+            }
55
+        } else {
56
+            camera.onPtpError(String.format(
57
+                    "Couldn't open session! Open session command failed with error code \"%s\"",
58
+                    PtpConstants.responseToString(openSession.getResponseCode())));
59
+        }
60
+    }
61
+
62
+    @Override
63
+    public void reset() {
64
+    }
65
+}

+ 46 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/eos/EosSetExtendedEventInfoCommand.java

@@ -0,0 +1,46 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.eos;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.EosCamera;
21
+import com.remoteyourcam.usb.ptp.PtpConstants;
22
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
24
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
25
+
26
+public class EosSetExtendedEventInfoCommand extends EosCommand {
27
+
28
+    public EosSetExtendedEventInfoCommand(EosCamera camera) {
29
+        super(camera);
30
+    }
31
+
32
+    @Override
33
+    public void exec(IO io) {
34
+        io.handleCommand(this);
35
+        if (responseCode != Response.Ok) {
36
+            camera.onPtpError(String.format(
37
+                    "Couldn't initialize session! Setting extended event info failed, error code %s",
38
+                    PtpConstants.responseToString(responseCode)));
39
+        }
40
+    }
41
+
42
+    @Override
43
+    public void encodeCommand(ByteBuffer b) {
44
+        encodeCommand(b, Operation.EosSetEventMode, 1);
45
+    }
46
+}

+ 84 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/eos/EosSetLiveViewAction.java

@@ -0,0 +1,84 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.eos;
17
+
18
+import com.remoteyourcam.usb.ptp.EosCamera;
19
+import com.remoteyourcam.usb.ptp.EosConstants;
20
+import com.remoteyourcam.usb.ptp.PtpAction;
21
+import com.remoteyourcam.usb.ptp.EosConstants.EvfMode;
22
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Property;
24
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
25
+
26
+public class EosSetLiveViewAction implements PtpAction {
27
+
28
+    private final EosCamera camera;
29
+    private final boolean enabled;
30
+
31
+    public EosSetLiveViewAction(EosCamera camera, boolean enabled) {
32
+        this.camera = camera;
33
+        this.enabled = enabled;
34
+    }
35
+
36
+    @Override
37
+    public void exec(IO io) {
38
+        int evfMode = camera.getPtpProperty(Property.EosEvfMode);
39
+
40
+        if (enabled && evfMode != EvfMode.ENABLE || !enabled && evfMode != EvfMode.DISABLE) {
41
+            EosSetPropertyCommand setEvfMode = new EosSetPropertyCommand(camera, Property.EosEvfMode,
42
+                    enabled ? EvfMode.ENABLE : EvfMode.DISABLE);
43
+            io.handleCommand(setEvfMode);
44
+
45
+            if (setEvfMode.getResponseCode() == Response.DeviceBusy) {
46
+                camera.onDeviceBusy(this, true);
47
+                return;
48
+            } else if (setEvfMode.getResponseCode() != Response.Ok) {
49
+                camera.onPtpWarning("Couldn't open live view");
50
+                return;
51
+            }
52
+        }
53
+
54
+        int outputDevice = camera.getPtpProperty(Property.EosEvfOutputDevice);
55
+
56
+        if (enabled) {
57
+            outputDevice |= EosConstants.EvfOutputDevice.PC;
58
+        } else {
59
+            outputDevice &= ~EosConstants.EvfOutputDevice.PC;
60
+        }
61
+
62
+        EosSetPropertyCommand setOutputDevice = new EosSetPropertyCommand(camera, Property.EosEvfOutputDevice,
63
+                outputDevice);
64
+        io.handleCommand(setOutputDevice);
65
+
66
+        if (setOutputDevice.getResponseCode() == Response.DeviceBusy) {
67
+            camera.onDeviceBusy(this, true);
68
+        } else if (setOutputDevice.getResponseCode() == Response.Ok) {
69
+            if (!enabled) {
70
+                camera.onLiveViewStopped();
71
+            } else {
72
+                camera.onLiveViewStarted();
73
+            }
74
+            return;
75
+        } else {
76
+            camera.onPtpWarning("Couldn't open live view");
77
+        }
78
+
79
+    }
80
+
81
+    @Override
82
+    public void reset() {
83
+    }
84
+}

+ 45 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/eos/EosSetPcModeCommand.java

@@ -0,0 +1,45 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.eos;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.EosCamera;
21
+import com.remoteyourcam.usb.ptp.PtpConstants;
22
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
24
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
25
+
26
+public class EosSetPcModeCommand extends EosCommand {
27
+
28
+    public EosSetPcModeCommand(EosCamera camera) {
29
+        super(camera);
30
+    }
31
+
32
+    @Override
33
+    public void exec(IO io) {
34
+        io.handleCommand(this);
35
+        if (responseCode != Response.Ok) {
36
+            camera.onPtpError(String.format("Couldn't initialize session! setting PC Mode failed, error code %s",
37
+                    PtpConstants.responseToString(responseCode)));
38
+        }
39
+    }
40
+
41
+    @Override
42
+    public void encodeCommand(ByteBuffer b) {
43
+        encodeCommand(b, Operation.EosSetPCConnectMode, 1);
44
+    }
45
+}

+ 64 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/eos/EosSetPropertyCommand.java

@@ -0,0 +1,64 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.eos;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.EosCamera;
21
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
24
+import com.remoteyourcam.usb.ptp.PtpConstants.Type;
25
+
26
+public class EosSetPropertyCommand extends EosCommand {
27
+
28
+    private final int property;
29
+    private final int value;
30
+
31
+    public EosSetPropertyCommand(EosCamera camera, int property, int value) {
32
+        super(camera);
33
+        hasDataToSend = true;
34
+        this.property = property;
35
+        this.value = value;
36
+    }
37
+
38
+    @Override
39
+    public void exec(IO io) {
40
+        io.handleCommand(this);
41
+        if (responseCode == Response.DeviceBusy) {
42
+            camera.onDeviceBusy(this, true);
43
+            return;
44
+        }
45
+    }
46
+
47
+    @Override
48
+    public void encodeCommand(ByteBuffer b) {
49
+        encodeCommand(b, Operation.EosSetDevicePropValue);
50
+    }
51
+
52
+    @Override
53
+    public void encodeData(ByteBuffer b) {
54
+        // header
55
+        b.putInt(24);
56
+        b.putShort((short) Type.Data);
57
+        b.putShort((short) Operation.EosSetDevicePropValue);
58
+        b.putInt(camera.currentTransactionId());
59
+        // specific block
60
+        b.putInt(0x0C);
61
+        b.putInt(property);
62
+        b.putInt(value);
63
+    }
64
+}

+ 43 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/eos/EosTakePictureCommand.java

@@ -0,0 +1,43 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.eos;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.EosCamera;
21
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
24
+
25
+public class EosTakePictureCommand extends EosCommand {
26
+
27
+    public EosTakePictureCommand(EosCamera camera) {
28
+        super(camera);
29
+    }
30
+
31
+    @Override
32
+    public void exec(IO io) {
33
+        io.handleCommand(this);
34
+        if (responseCode == Response.DeviceBusy) {
35
+            camera.onDeviceBusy(this, true);
36
+        }
37
+    }
38
+
39
+    @Override
40
+    public void encodeCommand(ByteBuffer b) {
41
+        encodeCommand(b, Operation.EosTakePicture);
42
+    }
43
+}

+ 47 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonAfDriveCommand.java

@@ -0,0 +1,47 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.NikonCamera;
21
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
24
+
25
+public class NikonAfDriveCommand extends NikonCommand {
26
+
27
+    public NikonAfDriveCommand(NikonCamera camera) {
28
+        super(camera);
29
+    }
30
+
31
+    @Override
32
+    public void exec(IO io) {
33
+        //        if (camera.isInActivationTypePhase()) {
34
+        //            return;
35
+        //        }
36
+        io.handleCommand(this);
37
+        if (getResponseCode() == Response.Ok) {
38
+            camera.onFocusStarted();
39
+            camera.enqueue(new NikonAfDriveDeviceReadyCommand(camera), 200);
40
+        }
41
+    }
42
+
43
+    @Override
44
+    public void encodeCommand(ByteBuffer b) {
45
+        encodeCommand(b, Operation.NikonAfDrive);
46
+    }
47
+}

+ 46 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonAfDriveDeviceReadyCommand.java

@@ -0,0 +1,46 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.NikonCamera;
21
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
24
+
25
+public class NikonAfDriveDeviceReadyCommand extends NikonCommand {
26
+
27
+    public NikonAfDriveDeviceReadyCommand(NikonCamera camera) {
28
+        super(camera);
29
+    }
30
+
31
+    @Override
32
+    public void exec(IO io) {
33
+        io.handleCommand(this);
34
+        if (getResponseCode() == Response.DeviceBusy) {
35
+            reset();
36
+            camera.enqueue(this, 200);
37
+        } else {
38
+            camera.onFocusEnded(getResponseCode() == Response.Ok);
39
+        }
40
+    }
41
+
42
+    @Override
43
+    public void encodeCommand(ByteBuffer b) {
44
+        encodeCommand(b, Operation.NikonDeviceReady);
45
+    }
46
+}

+ 54 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonCloseSessionAction.java

@@ -0,0 +1,54 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import com.remoteyourcam.usb.ptp.NikonCamera;
19
+import com.remoteyourcam.usb.ptp.PtpAction;
20
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
21
+import com.remoteyourcam.usb.ptp.PtpConstants.Datatype;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Property;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
24
+import com.remoteyourcam.usb.ptp.commands.CloseSessionCommand;
25
+import com.remoteyourcam.usb.ptp.commands.SetDevicePropValueCommand;
26
+
27
+public class NikonCloseSessionAction implements PtpAction {
28
+
29
+    private final NikonCamera camera;
30
+
31
+    public NikonCloseSessionAction(NikonCamera camera) {
32
+        this.camera = camera;
33
+    }
34
+
35
+    @Override
36
+    public void exec(IO io) {
37
+        SetDevicePropValueCommand setRecordingMedia = new SetDevicePropValueCommand(camera,
38
+                Property.NikonRecordingMedia, 0,
39
+                Datatype.uint8);
40
+        io.handleCommand(setRecordingMedia);
41
+
42
+        if (setRecordingMedia.getResponseCode() == Response.DeviceBusy) {
43
+            camera.onDeviceBusy(this, true);
44
+            return;
45
+        }
46
+
47
+        io.handleCommand(new CloseSessionCommand(camera));
48
+        camera.onSessionClosed();
49
+    }
50
+
51
+    @Override
52
+    public void reset() {
53
+    }
54
+}

+ 29 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonCommand.java

@@ -0,0 +1,29 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import com.remoteyourcam.usb.ptp.NikonCamera;
19
+import com.remoteyourcam.usb.ptp.commands.Command;
20
+
21
+public abstract class NikonCommand extends Command {
22
+
23
+    protected NikonCamera camera;
24
+
25
+    public NikonCommand(NikonCamera camera) {
26
+        super(camera);
27
+        this.camera = camera;
28
+    }
29
+}

+ 81 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonEventCheckCommand.java

@@ -0,0 +1,81 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import android.util.Log;
21
+
22
+import com.remoteyourcam.usb.AppConfig;
23
+import com.remoteyourcam.usb.ptp.NikonCamera;
24
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
25
+import com.remoteyourcam.usb.ptp.PtpConstants;
26
+import com.remoteyourcam.usb.ptp.PtpConstants.Event;
27
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
28
+
29
+public class NikonEventCheckCommand extends NikonCommand {
30
+
31
+    private static final String TAG = NikonEventCheckCommand.class.getSimpleName();
32
+
33
+    public NikonEventCheckCommand(NikonCamera camera) {
34
+        super(camera);
35
+    }
36
+
37
+    @Override
38
+    public void exec(IO io) {
39
+        io.handleCommand(this);
40
+    }
41
+
42
+    @Override
43
+    public void encodeCommand(ByteBuffer b) {
44
+        encodeCommand(b, Operation.NikonGetEvent);
45
+    }
46
+
47
+    @Override
48
+    protected void decodeData(ByteBuffer b, int length) {
49
+        int count = b.getShort();
50
+
51
+        while (count > 0) {
52
+            --count;
53
+
54
+            int eventCode = b.getShort();
55
+            int eventParam = b.getInt();
56
+
57
+            if (AppConfig.LOG) {
58
+                Log.i(TAG,
59
+                        String.format("event %s value %s(%04x)", PtpConstants.eventToString(eventCode),
60
+                                PtpConstants.propertyToString(eventParam), eventParam));
61
+            }
62
+
63
+            switch (eventCode) {
64
+            case Event.ObjectAdded:
65
+                camera.onEventObjectAdded(eventParam);
66
+                break;
67
+            case Event.DevicePropChanged:
68
+                camera.onEventDevicePropChanged(eventParam);
69
+                break;
70
+            case Event.CaptureComplete:
71
+                camera.onEventCaptureComplete();
72
+                break;
73
+            case Event.NikonObjectAddedInSdram:
74
+                //libgphoto2 相关处理
75
+                if (eventParam == 0) { eventParam = 0xffff001; }
76
+                camera.onEventObjectAdded(eventParam);
77
+                break;
78
+            }
79
+        }
80
+    }
81
+}

+ 70 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonGetLiveViewImageAction.java

@@ -0,0 +1,70 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import com.remoteyourcam.usb.ptp.NikonCamera;
19
+import com.remoteyourcam.usb.ptp.PtpAction;
20
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
21
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
23
+import com.remoteyourcam.usb.ptp.commands.SimpleCommand;
24
+import com.remoteyourcam.usb.ptp.model.LiveViewData;
25
+
26
+public class NikonGetLiveViewImageAction implements PtpAction {
27
+
28
+    private final NikonCamera camera;
29
+    private final LiveViewData reuse;
30
+
31
+    public NikonGetLiveViewImageAction(NikonCamera camera, LiveViewData reuse) {
32
+        this.camera = camera;
33
+        this.reuse = reuse;
34
+    }
35
+
36
+    @Override
37
+    public void exec(IO io) {
38
+        SimpleCommand simpleCmd = new SimpleCommand(camera, Operation.NikonStartLiveView);
39
+        io.handleCommand(simpleCmd);
40
+
41
+        if (simpleCmd.getResponseCode() != Response.Ok) {
42
+            return;
43
+        }
44
+
45
+        SimpleCommand deviceReady = new SimpleCommand(camera, Operation.NikonDeviceReady);
46
+        for (int i = 0; i < 10; ++i) {
47
+            try {
48
+                Thread.sleep(300);
49
+            } catch (InterruptedException e) {
50
+                // nop
51
+            }
52
+
53
+            deviceReady.reset();
54
+            io.handleCommand(deviceReady);
55
+            if (deviceReady.getResponseCode() == Response.DeviceBusy) {
56
+                // still waiting
57
+            } else if (deviceReady.getResponseCode() == Response.Ok) {
58
+                camera.onLiveViewRestarted();
59
+                io.handleCommand(new NikonGetLiveViewImageCommand(camera, reuse));
60
+                return;
61
+            } else {
62
+                return;
63
+            }
64
+        }
65
+    }
66
+
67
+    @Override
68
+    public void reset() {
69
+    }
70
+}

+ 158 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonGetLiveViewImageCommand.java

@@ -0,0 +1,158 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import android.graphics.BitmapFactory;
19
+import android.graphics.BitmapFactory.Options;
20
+import android.util.Log;
21
+
22
+import com.remoteyourcam.usb.AppConfig;
23
+import com.remoteyourcam.usb.ptp.NikonCamera;
24
+import com.remoteyourcam.usb.ptp.PacketUtil;
25
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
26
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
27
+import com.remoteyourcam.usb.ptp.PtpConstants.Product;
28
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
29
+import com.remoteyourcam.usb.ptp.model.LiveViewData;
30
+
31
+import java.nio.ByteBuffer;
32
+import java.nio.ByteOrder;
33
+
34
+public class NikonGetLiveViewImageCommand extends NikonCommand {
35
+
36
+    private static boolean haveAddedDumpToAcra = false;
37
+
38
+    private static final String TAG = NikonGetLiveViewImageCommand.class.getSimpleName();
39
+    private static byte[] tmpStorage = new byte[0x4000];
40
+    private final Options options;
41
+    private LiveViewData data;
42
+
43
+    public NikonGetLiveViewImageCommand(NikonCamera camera, LiveViewData data) {
44
+        super(camera);
45
+        this.data = data;
46
+        if (data == null) {
47
+            this.data = new LiveViewData();
48
+            //this.data.histogram = ByteBuffer.allocate(1024 * 4);
49
+            //this.data.histogram.order(ByteOrder.LITTLE_ENDIAN);
50
+        } else {
51
+            this.data = data;
52
+        }
53
+        options = new BitmapFactory.Options();
54
+        options.inBitmap = this.data.bitmap;
55
+        options.inSampleSize = 1;
56
+        options.inTempStorage = tmpStorage;
57
+        this.data.bitmap = null;
58
+    }
59
+
60
+    @Override
61
+    public void exec(IO io) {
62
+        if (!camera.isLiveViewOpen()) {
63
+            return;
64
+        }
65
+        io.handleCommand(this);
66
+        if (responseCode == Response.DeviceBusy) {
67
+            camera.onDeviceBusy(this, true);
68
+            return;
69
+        }
70
+        data.hasHistogram = false;
71
+        if (this.data.bitmap != null && responseCode == Response.Ok) {
72
+            camera.onLiveViewReceived(data);
73
+        } else {
74
+            camera.onLiveViewReceived(null);
75
+        }
76
+    }
77
+
78
+    @Override
79
+    public void encodeCommand(ByteBuffer b) {
80
+        encodeCommand(b, Operation.NikonGetLiveViewImage);
81
+    }
82
+
83
+    @Override
84
+    protected void decodeData(ByteBuffer b, int length) {
85
+        if (length <= 128) {
86
+            return;
87
+        }
88
+
89
+        data.hasAfFrame = false;
90
+
91
+        int productId = camera.getProductId();
92
+        int start = b.position();
93
+        int pictureOffset;
94
+
95
+        switch (productId) {
96
+        case Product.NikonD5000:
97
+        case Product.NikonD3S:
98
+        case Product.NikonD90:
99
+            pictureOffset = 128;
100
+            break;
101
+        case Product.NikonD3X:
102
+        case Product.NikonD300S:
103
+        case Product.NikonD3:
104
+        case Product.NikonD300:
105
+        case Product.NikonD700:
106
+            pictureOffset = 64;
107
+            break;
108
+        case Product.NikonD7000:
109
+        case Product.NikonD5100:
110
+            pictureOffset = 384;
111
+            break;
112
+        default:
113
+            return;
114
+        }
115
+
116
+        b.order(ByteOrder.BIG_ENDIAN);
117
+
118
+        // read af frame
119
+        {
120
+            data.hasAfFrame = true;
121
+
122
+            int jpegImageWidth = b.getShort() & 0xFFFF;
123
+            int jpegImageHeight = b.getShort() & 0xFFFF;
124
+            int wholeWidth = b.getShort() & 0xFFFF;
125
+            int wholeHeight = b.getShort() & 0xFFFF;
126
+
127
+            float multX = jpegImageWidth / (float) wholeWidth;
128
+            float multY = jpegImageHeight / (float) wholeHeight;
129
+
130
+            b.position(start + 16);
131
+            data.nikonWholeWidth = wholeWidth;
132
+            data.nikonWholeHeight = wholeHeight;
133
+            data.nikonAfFrameWidth = (int) ((b.getShort() & 0xFFFF) * multX);
134
+            data.nikonAfFrameHeight = (int) ((b.getShort() & 0xFFFF) * multY);
135
+            data.nikonAfFrameCenterX = (int) ((b.getShort() & 0xFFFF) * multX);
136
+            data.nikonAfFrameCenterY = (int) ((b.getShort() & 0xFFFF) * multY);
137
+        }
138
+
139
+        b.order(ByteOrder.LITTLE_ENDIAN);
140
+
141
+        b.position(start + pictureOffset);
142
+
143
+        if (b.remaining() <= 128) {
144
+            data.bitmap = null;
145
+            return;
146
+        }
147
+
148
+        try {
149
+            data.bitmap = BitmapFactory.decodeByteArray(b.array(), b.position(), length - b.position(), options);
150
+        } catch (RuntimeException e) {
151
+            Log.e(TAG, "decoding failed " + e.toString());
152
+            Log.e(TAG, e.getLocalizedMessage());
153
+            if (AppConfig.LOG) {
154
+                PacketUtil.logHexdump(TAG, b.array(), start, 512);
155
+            }
156
+        }
157
+    }
158
+}

+ 51 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonGetVendorPropCodesCommand.java

@@ -0,0 +1,51 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.NikonCamera;
21
+import com.remoteyourcam.usb.ptp.PacketUtil;
22
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
24
+
25
+public class NikonGetVendorPropCodesCommand extends NikonCommand {
26
+
27
+    private int[] propertyCodes = new int[0];
28
+
29
+    public NikonGetVendorPropCodesCommand(NikonCamera camera) {
30
+        super(camera);
31
+    }
32
+
33
+    public int[] getPropertyCodes() {
34
+        return propertyCodes;
35
+    }
36
+
37
+    @Override
38
+    public void exec(IO io) {
39
+        throw new UnsupportedOperationException();
40
+    }
41
+
42
+    @Override
43
+    public void encodeCommand(ByteBuffer b) {
44
+        encodeCommand(b, Operation.NikonGetVendorPropCodes);
45
+    }
46
+
47
+    @Override
48
+    protected void decodeData(ByteBuffer b, int length) {
49
+        propertyCodes = PacketUtil.readU16Array(b);
50
+    }
51
+}

+ 69 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonOpenSessionAction.java

@@ -0,0 +1,69 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import com.remoteyourcam.usb.ptp.NikonCamera;
19
+import com.remoteyourcam.usb.ptp.PtpAction;
20
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
21
+import com.remoteyourcam.usb.ptp.PtpConstants;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Datatype;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
24
+import com.remoteyourcam.usb.ptp.PtpConstants.Property;
25
+import com.remoteyourcam.usb.ptp.commands.OpenSessionCommand;
26
+import com.remoteyourcam.usb.ptp.commands.SetDevicePropValueCommand;
27
+
28
+public class NikonOpenSessionAction implements PtpAction {
29
+
30
+    private final NikonCamera camera;
31
+
32
+    public NikonOpenSessionAction(NikonCamera camera) {
33
+        this.camera = camera;
34
+    }
35
+
36
+    @Override
37
+    public void exec(IO io) {
38
+        OpenSessionCommand openSession = new OpenSessionCommand(camera);
39
+        io.handleCommand(openSession);
40
+        if (openSession.getResponseCode() == PtpConstants.Response.Ok) {
41
+            if (camera.hasSupportForOperation(Operation.NikonGetVendorPropCodes)) {
42
+                NikonGetVendorPropCodesCommand getPropCodes = new NikonGetVendorPropCodesCommand(camera);
43
+                io.handleCommand(getPropCodes);
44
+                SetDevicePropValueCommand c = new SetDevicePropValueCommand(camera, Property.NikonRecordingMedia, 1,
45
+                        Datatype.uint8);
46
+                io.handleCommand(c);
47
+                if (getPropCodes.getResponseCode() == PtpConstants.Response.Ok
48
+                        && c.getResponseCode() == PtpConstants.Response.Ok) {
49
+                    camera.setVendorPropCodes(getPropCodes.getPropertyCodes());
50
+                    camera.onSessionOpened();
51
+                } else {
52
+                    camera.onPtpError(String.format(
53
+                            "Couldn't read device property codes! Open session command failed with error code \"%s\"",
54
+                            PtpConstants.responseToString(getPropCodes.getResponseCode())));
55
+                }
56
+            } else {
57
+                camera.onSessionOpened();
58
+            }
59
+        } else {
60
+            camera.onPtpError(String.format(
61
+                    "Couldn't open session! Open session command failed with error code \"%s\"",
62
+                    PtpConstants.responseToString(openSession.getResponseCode())));
63
+        }
64
+    }
65
+
66
+    @Override
67
+    public void reset() {
68
+    }
69
+}

+ 66 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonStartLiveViewAction.java

@@ -0,0 +1,66 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import com.remoteyourcam.usb.ptp.NikonCamera;
19
+import com.remoteyourcam.usb.ptp.PtpAction;
20
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
21
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
23
+import com.remoteyourcam.usb.ptp.commands.SimpleCommand;
24
+
25
+public class NikonStartLiveViewAction implements PtpAction {
26
+
27
+    private final NikonCamera camera;
28
+
29
+    public NikonStartLiveViewAction(NikonCamera camera) {
30
+        this.camera = camera;
31
+    }
32
+
33
+    @Override
34
+    public void exec(IO io) {
35
+        SimpleCommand simpleCmd = new SimpleCommand(camera, Operation.NikonStartLiveView);
36
+        io.handleCommand(simpleCmd);
37
+
38
+        if (simpleCmd.getResponseCode() != Response.Ok) {
39
+            return;
40
+        }
41
+
42
+        SimpleCommand deviceReady = new SimpleCommand(camera, Operation.NikonDeviceReady);
43
+        for (int i = 0; i < 10; ++i) {
44
+            try {
45
+                Thread.sleep(300);
46
+            } catch (InterruptedException e) {
47
+                // nop
48
+            }
49
+
50
+            deviceReady.reset();
51
+            io.handleCommand(deviceReady);
52
+            if (deviceReady.getResponseCode() == Response.DeviceBusy) {
53
+                // still waiting
54
+            } else if (deviceReady.getResponseCode() == Response.Ok) {
55
+                camera.onLiveViewStarted();
56
+                return;
57
+            } else {
58
+                return;
59
+            }
60
+        }
61
+    }
62
+
63
+    @Override
64
+    public void reset() {
65
+    }
66
+}

+ 54 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonStopLiveViewAction.java

@@ -0,0 +1,54 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import com.remoteyourcam.usb.ptp.NikonCamera;
19
+import com.remoteyourcam.usb.ptp.PtpAction;
20
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
21
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
23
+import com.remoteyourcam.usb.ptp.commands.SimpleCommand;
24
+
25
+public class NikonStopLiveViewAction implements PtpAction {
26
+
27
+    private final NikonCamera camera;
28
+    private final boolean notifyUser;
29
+
30
+    public NikonStopLiveViewAction(NikonCamera camera, boolean notifyUser) {
31
+        this.camera = camera;
32
+        this.notifyUser = notifyUser;
33
+    }
34
+
35
+    @Override
36
+    public void exec(IO io) {
37
+        SimpleCommand simpleCmd = new SimpleCommand(camera, Operation.NikonEndLiveView);
38
+        io.handleCommand(simpleCmd);
39
+
40
+        if (simpleCmd.getResponseCode() == Response.DeviceBusy) {
41
+            camera.onDeviceBusy(this, true);
42
+        } else {
43
+            if (notifyUser) {
44
+                camera.onLiveViewStopped();
45
+            } else {
46
+                camera.onLiveViewStoppedInternal();
47
+            }
48
+        }
49
+    }
50
+
51
+    @Override
52
+    public void reset() {
53
+    }
54
+}

+ 113 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/model/DeviceInfo.java

@@ -0,0 +1,113 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.model;
17
+
18
+import java.nio.ByteBuffer;
19
+import java.util.Arrays;
20
+
21
+import com.remoteyourcam.usb.ptp.PacketUtil;
22
+import com.remoteyourcam.usb.ptp.PtpConstants;
23
+
24
+/**
25
+ * Device info data set as defined by PTP standard.
26
+ */
27
+public class DeviceInfo {
28
+
29
+    public short standardVersion;
30
+    public int vendorExtensionId;
31
+    public short vendorExtensionVersion;
32
+    public String vendorExtensionDesc;
33
+    public short functionalMode;
34
+    public int[] operationsSupported;
35
+    public int[] eventsSupported;
36
+    public int[] devicePropertiesSupported;
37
+    public int[] captureFormats;
38
+    public int[] imageFormats;
39
+    public String manufacture;
40
+    public String model;
41
+    public String deviceVersion;
42
+    public String serialNumber;
43
+
44
+    public DeviceInfo(ByteBuffer b, int length) {
45
+        decode(b, length);
46
+    }
47
+
48
+    public DeviceInfo() {
49
+    }
50
+
51
+    public void decode(ByteBuffer b, int length) {
52
+        standardVersion = b.getShort();
53
+        vendorExtensionId = b.getInt();
54
+        vendorExtensionVersion = b.getShort();
55
+        vendorExtensionDesc = PacketUtil.readString(b);
56
+        functionalMode = b.getShort();
57
+        operationsSupported = PacketUtil.readU16Array(b);
58
+        eventsSupported = PacketUtil.readU16Array(b);
59
+        devicePropertiesSupported = PacketUtil.readU16Array(b);
60
+        captureFormats = PacketUtil.readU16Array(b);
61
+        imageFormats = PacketUtil.readU16Array(b);
62
+        manufacture = PacketUtil.readString(b);
63
+        model = PacketUtil.readString(b);
64
+        deviceVersion = PacketUtil.readString(b);
65
+        serialNumber = PacketUtil.readString(b);
66
+    }
67
+
68
+    public void encode(ByteBuffer b) {
69
+        b.putShort(standardVersion);
70
+        b.putInt(vendorExtensionId);
71
+        b.putInt(vendorExtensionVersion);
72
+        PacketUtil.writeString(b, "");
73
+        b.putShort(functionalMode);
74
+        PacketUtil.writeU16Array(b, new int[0]);
75
+        PacketUtil.writeU16Array(b, new int[0]);
76
+        PacketUtil.writeU16Array(b, new int[0]);
77
+        PacketUtil.writeU16Array(b, new int[0]);
78
+        PacketUtil.writeU16Array(b, new int[0]);
79
+        PacketUtil.writeString(b, "");
80
+        PacketUtil.writeString(b, "");
81
+        PacketUtil.writeString(b, "");
82
+    }
83
+
84
+    @Override
85
+    public String toString() {
86
+        // Changes here have to reflect changes in PtpConstants.main()
87
+        StringBuilder b = new StringBuilder();
88
+        b.append("DeviceInfo\n");
89
+        b.append("StandardVersion: ").append(standardVersion).append('\n');
90
+        b.append("VendorExtensionId: ").append(vendorExtensionId).append('\n');
91
+        b.append("VendorExtensionVersion: ").append(vendorExtensionVersion).append('\n');
92
+        b.append("VendorExtensionDesc: ").append(vendorExtensionDesc).append('\n');
93
+        b.append("FunctionalMode: ").append(functionalMode).append('\n');
94
+        appendU16Array(b, "OperationsSupported", PtpConstants.Operation.class, operationsSupported);
95
+        appendU16Array(b, "EventsSupported", PtpConstants.Event.class, eventsSupported);
96
+        appendU16Array(b, "DevicePropertiesSupported", PtpConstants.Property.class, devicePropertiesSupported);
97
+        appendU16Array(b, "CaptureFormats", PtpConstants.ObjectFormat.class, captureFormats);
98
+        appendU16Array(b, "ImageFormats", PtpConstants.ObjectFormat.class, imageFormats);
99
+        b.append("Manufacture: ").append(manufacture).append('\n');
100
+        b.append("Model: ").append(model).append('\n');
101
+        b.append("DeviceVersion: ").append(deviceVersion).append('\n');
102
+        b.append("SerialNumber: ").append(serialNumber).append('\n');
103
+        return b.toString();
104
+    }
105
+
106
+    private static void appendU16Array(StringBuilder b, String name, Class<?> cl, int[] a) {
107
+        Arrays.sort(a);
108
+        b.append(name).append(":\n");
109
+        for (int i = 0; i < a.length; ++i) {
110
+            b.append("    ").append(PtpConstants.constantToString(cl, a[i])).append('\n');
111
+        }
112
+    }
113
+}

+ 102 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/model/DevicePropDesc.java

@@ -0,0 +1,102 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.model;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.PacketUtil;
21
+import com.remoteyourcam.usb.ptp.PtpConstants.Datatype;
22
+
23
+public class DevicePropDesc {
24
+
25
+    public int code;
26
+    public int datatype;
27
+    public boolean readOnly;
28
+    public int factoryDefault;
29
+    public int currentValue;
30
+    public int[] description;
31
+
32
+    public DevicePropDesc() {
33
+    }
34
+
35
+    public DevicePropDesc(ByteBuffer b, int length) {
36
+        decode(b, length);
37
+    }
38
+
39
+    public void decode(ByteBuffer b, int length) {
40
+        code = b.getShort() & 0xFFFF;
41
+        datatype = b.getShort() & 0xFFFF;
42
+        readOnly = b.get() == 0;
43
+
44
+        if (datatype == Datatype.int8 || datatype == Datatype.uint8) {
45
+            factoryDefault = b.get() & 0xFF;
46
+            currentValue = b.get() & 0xFF;
47
+            int form = b.get();
48
+            if (form == 2) {
49
+                description = PacketUtil.readU8Enumeration(b);
50
+            } else if (form == 1) {
51
+                int mini = b.get();
52
+                int maxi = b.get();
53
+                int step = b.get();
54
+                description = new int[(maxi - mini) / step + 1];
55
+                for (int i = 0; i < description.length; ++i) {
56
+                    description[i] = mini + step * i;
57
+                }
58
+            }
59
+        } else if (datatype == Datatype.uint16) {
60
+            factoryDefault = b.getShort() & 0xFFFF;
61
+            currentValue = b.getShort() & 0xFFFF;
62
+            int form = b.get();
63
+            if (form == 2) {
64
+                description = PacketUtil.readU16Enumeration(b);
65
+            } else if (form == 1) {
66
+                int mini = b.getShort() & 0xFFFF;
67
+                int maxi = b.getShort() & 0xFFFF;
68
+                int step = b.getShort() & 0xFFFF;
69
+                description = new int[(maxi - mini) / step + 1];
70
+                for (int i = 0; i < description.length; ++i) {
71
+                    description[i] = mini + step * i;
72
+                }
73
+            }
74
+        } else if (datatype == Datatype.int16) {
75
+            factoryDefault = b.getShort();
76
+            currentValue = b.getShort();
77
+            int form = b.get();
78
+            if (form == 2) {
79
+                description = PacketUtil.readS16Enumeration(b);
80
+            } else if (form == 1) {
81
+                int mini = b.getShort();
82
+                int maxi = b.getShort();
83
+                int step = b.getShort();
84
+                description = new int[(maxi - mini) / step + 1];
85
+                for (int i = 0; i < description.length; ++i) {
86
+                    description[i] = mini + step * i;
87
+                }
88
+            }
89
+        } else if (datatype == Datatype.int32 || datatype == Datatype.uint32) {
90
+            factoryDefault = b.getInt();
91
+            currentValue = b.getInt();
92
+            int form = b.get();
93
+            if (form == 2) {
94
+                description = PacketUtil.readU32Enumeration(b);
95
+            }
96
+        }
97
+
98
+        if (description == null) {
99
+            description = new int[0];
100
+        }
101
+    }
102
+}

+ 44 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/model/LiveViewData.java

@@ -0,0 +1,44 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.model;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import android.graphics.Bitmap;
21
+
22
+public class LiveViewData {
23
+
24
+    public Bitmap bitmap;
25
+
26
+    public int zoomFactor;
27
+    public int zoomRectLeft;
28
+    public int zoomRectTop;
29
+    public int zoomRectRight;
30
+    public int zoomRectBottom;
31
+
32
+    public boolean hasHistogram;
33
+    public ByteBuffer histogram;
34
+
35
+    // dimensions are in bitmap size
36
+    public boolean hasAfFrame;
37
+    public int nikonAfFrameCenterX;
38
+    public int nikonAfFrameCenterY;
39
+    public int nikonAfFrameWidth;
40
+    public int nikonAfFrameHeight;
41
+
42
+    public int nikonWholeWidth;
43
+    public int nikonWholeHeight;
44
+}

+ 101 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/model/ObjectInfo.java

@@ -0,0 +1,101 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.model;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.PacketUtil;
21
+import com.remoteyourcam.usb.ptp.PtpConstants;
22
+
23
+/**
24
+ * Object info data set as defined by the PTP standard.
25
+ */
26
+public class ObjectInfo {
27
+
28
+    public int storageId;
29
+    public int objectFormat;
30
+    public int protectionStatus;
31
+    public int objectCompressedSize;
32
+    public int thumbFormat;
33
+    public int thumbCompressedSize;
34
+    public int thumbPixWidth;
35
+    public int thumbPixHeight;
36
+    public int imagePixWidth;
37
+    public int imagePixHeight;
38
+    public int imageBitDepth;
39
+    public int parentObject;
40
+    public int associationType;
41
+    public int associationDesc;
42
+    public int sequenceNumber;
43
+    public String filename;
44
+    public String captureDate;
45
+    public String modificationDate;
46
+    public int keywords;
47
+
48
+    public ObjectInfo() {
49
+    }
50
+
51
+    public ObjectInfo(ByteBuffer b, int length) {
52
+        decode(b, length);
53
+    }
54
+
55
+    public void decode(ByteBuffer b, int length) {
56
+        storageId = b.getInt();
57
+        objectFormat = b.getShort();
58
+        protectionStatus = b.getShort();
59
+        objectCompressedSize = b.getInt();
60
+        thumbFormat = b.getShort();
61
+        thumbCompressedSize = b.getInt();
62
+        thumbPixWidth = b.getInt();
63
+        thumbPixHeight = b.getInt();
64
+        imagePixWidth = b.getInt();
65
+        imagePixHeight = b.getInt();
66
+        imageBitDepth = b.getInt();
67
+        parentObject = b.getInt();
68
+        associationType = b.getShort();
69
+        associationDesc = b.getInt();
70
+        sequenceNumber = b.getInt();
71
+        filename = PacketUtil.readString(b);
72
+        captureDate = PacketUtil.readString(b);
73
+        modificationDate = PacketUtil.readString(b);
74
+        keywords = b.get(); // string, not used on camera?
75
+    }
76
+
77
+    @Override
78
+    public String toString() {
79
+        StringBuilder b = new StringBuilder();
80
+        b.append("ObjectInfo\n");
81
+        b.append("StorageId: ").append(String.format("0x%08x\n", storageId));
82
+        b.append("ObjectFormat: ").append(PtpConstants.objectFormatToString(objectFormat)).append('\n');
83
+        b.append("ProtectionStatus: ").append(protectionStatus).append('\n');
84
+        b.append("ObjectCompressedSize: ").append(objectCompressedSize).append('\n');
85
+        b.append("ThumbFormat: ").append(PtpConstants.objectFormatToString(thumbFormat)).append('\n');
86
+        b.append("ThumbCompressedSize: ").append(thumbCompressedSize).append('\n');
87
+        b.append("ThumbPixWdith: ").append(thumbPixWidth).append('\n');
88
+        b.append("ThumbPixHeight: ").append(thumbPixHeight).append('\n');
89
+        b.append("ImagePixWidth: ").append(imagePixWidth).append('\n');
90
+        b.append("ImagePixHeight: ").append(imagePixHeight).append('\n');
91
+        b.append("ImageBitDepth: ").append(imageBitDepth).append('\n');
92
+        b.append("ParentObject: ").append(String.format("0x%08x", parentObject)).append('\n');
93
+        b.append("AssociationType: ").append(associationType).append('\n');
94
+        b.append("AssociatonDesc: ").append(associationDesc).append('\n');
95
+        b.append("Filename: ").append(filename).append('\n');
96
+        b.append("CaptureDate: ").append(captureDate).append('\n');
97
+        b.append("ModificationDate: ").append(modificationDate).append('\n');
98
+        b.append("Keywords: ").append(keywords).append('\n');
99
+        return b.toString();
100
+    }
101
+}

+ 47 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/model/StorageInfo.java

@@ -0,0 +1,47 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.model;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.PacketUtil;
21
+
22
+public class StorageInfo {
23
+
24
+    public int storageType;
25
+    public int filesystemType;
26
+    public int accessCapability;
27
+    public long maxCapacity;
28
+    public long freeSpaceInBytes;
29
+    public int freeSpaceInImages;
30
+    public String storageDescription;
31
+    public String volumeLabel;
32
+
33
+    public StorageInfo(ByteBuffer b, int length) {
34
+        decode(b, length);
35
+    }
36
+
37
+    private void decode(ByteBuffer b, int length) {
38
+        storageType = b.getShort() & 0xffff;
39
+        filesystemType = b.getShort() & 0xffff;
40
+        accessCapability = b.getShort() & 0xff;
41
+        maxCapacity = b.getLong();
42
+        freeSpaceInBytes = b.getLong();
43
+        freeSpaceInImages = b.getInt();
44
+        storageDescription = PacketUtil.readString(b);
45
+        volumeLabel = PacketUtil.readString(b);
46
+    }
47
+}

+ 3 - 0
ryc/src/main/res/values/strings.xml

@@ -0,0 +1,3 @@
1
+<resources>
2
+    <string name="app_name">ryc</string>
3
+</resources>

+ 1 - 1
settings.gradle

@@ -1 +1 @@
1
-include ':app', ':common', ':views'
1
+include ':app', ':common', ':views', ':ryc'

简报页UI · 2a40feae4e - Gogs: Go Git Service

简报页UI

chengzhenyu 9 年之前
父節點
當前提交
2a40feae4e

+ 1 - 1
app/src/main/java/ai/pai/lensman/briefs/BriefsActivity.java

@@ -41,7 +41,7 @@ public class BriefsActivity extends BaseActivity implements BriefsContract.View{
41 41
             public View makeView() {
42 42
                 TextView myText = new TextView(BriefsActivity.this);
43 43
                 myText.setGravity(Gravity.CENTER_VERTICAL);
44
-                myText.setTextSize(18);
44
+                myText.setTextSize(16);
45 45
                 myText.setTextColor(Color.parseColor("#333333"));
46 46
                 return myText;
47 47
             }

+ 382 - 220
app/src/main/res/layout/activity_briefs.xml

@@ -58,233 +58,395 @@
58 58
 
59 59
     </LinearLayout>
60 60
 
61
-<LinearLayout
62
-    android:layout_width="match_parent"
63
-    android:layout_height="wrap_content"
64
-    android:orientation="vertical"
65
-    android:layout_below="@id/title_bar_with_back_btn">
66
-
67
-    <LinearLayout
68
-        android:layout_width="match_parent"
69
-        android:layout_height="90dp"
70
-        android:orientation="horizontal"
71
-        android:gravity="center_vertical"
72
-        android:background="@color/background_white">
73
-
74
-        <RelativeLayout
75
-            android:layout_width="0dp"
76
-            android:layout_weight="1"
77
-            android:layout_height="match_parent">
78
-
79
-            <TextView
80
-                android:id="@+id/tv_today_upload"
81
-                android:layout_width="wrap_content"
82
-                android:layout_height="wrap_content"
83
-                android:layout_marginTop="15dp"
84
-                android:textColor="@color/_7B8088"
85
-                android:textSize="14sp"
86
-                android:layout_centerHorizontal="true"
87
-                android:text="@string/today_capture"/>
88
-
89
-            <TextView
90
-                android:id="@+id/tv_today_upload_num"
91
-                android:layout_width="wrap_content"
92
-                android:layout_height="wrap_content"
93
-                android:layout_below="@id/tv_today_upload"
94
-                android:layout_marginTop="12dp"
95
-                android:textColor="@color/_EF4847"
96
-                android:textSize="22sp"
97
-                android:layout_centerHorizontal="true"/>
98
-
99
-        </RelativeLayout>
100
-
101
-        <View
102
-            android:layout_width="1px"
103
-            android:layout_height="45dp"
104
-            android:background="@color/text_hint_grey_color"/>
105
-
106
-        <RelativeLayout
107
-            android:layout_width="0dp"
108
-            android:layout_weight="1"
109
-            android:layout_height="match_parent">
110
-
111
-            <TextView
112
-                android:id="@+id/tv_today_point"
113
-                android:layout_width="wrap_content"
114
-                android:layout_height="wrap_content"
115
-                android:layout_marginTop="15dp"
116
-                android:textColor="@color/_7B8088"
117
-                android:textSize="14sp"
118
-                android:layout_centerHorizontal="true"
119
-                android:text="@string/today_incoming"/>
120
-
121
-            <TextView
122
-                android:id="@+id/tv_today_point_amount"
123
-                android:layout_width="wrap_content"
124
-                android:layout_height="wrap_content"
125
-                android:layout_below="@id/tv_today_point"
126
-                android:layout_marginTop="12dp"
127
-                android:textColor="@color/_EF4847"
128
-                android:textSize="22sp"
129
-                android:layout_centerHorizontal="true"/>
130
-
131
-        </RelativeLayout>
132
-
133
-    </LinearLayout>
134
-    <LinearLayout
61
+    <ScrollView
135 62
         android:layout_width="match_parent"
136
-        android:layout_height="90dp"
137
-        android:orientation="horizontal"
138
-        android:gravity="center_vertical"
139
-        android:background="@color/background_white">
140
-
141
-        <RelativeLayout
142
-            android:layout_width="0dp"
143
-            android:layout_weight="1"
144
-            android:layout_height="match_parent">
145
-
146
-            <TextView
147
-                android:id="@+id/tv_week_origin_sold"
148
-                android:layout_width="wrap_content"
149
-                android:layout_height="wrap_content"
150
-                android:layout_marginTop="15dp"
151
-                android:textColor="@color/_7B8088"
152
-                android:textSize="14sp"
153
-                android:layout_centerHorizontal="true"
154
-                android:text="@string/week_origin_sold"/>
155
-
156
-            <TextView
157
-                android:id="@+id/tv_week_origin_sold_num"
158
-                android:layout_width="wrap_content"
159
-                android:layout_height="wrap_content"
160
-                android:layout_below="@id/tv_week_origin_sold"
161
-                android:layout_marginTop="12dp"
162
-                android:textColor="@color/_EF4847"
163
-                android:textSize="22sp"
164
-                android:layout_centerHorizontal="true"/>
165
-
166
-        </RelativeLayout>
167
-
168
-        <View
169
-            android:layout_width="1px"
170
-            android:layout_height="45dp"
171
-            android:background="@color/text_hint_grey_color"/>
172
-
173
-        <RelativeLayout
174
-            android:layout_width="0dp"
175
-            android:layout_weight="1"
176
-            android:layout_height="match_parent">
177
-
178
-            <TextView
179
-                android:id="@+id/tv_week_point"
180
-                android:layout_width="wrap_content"
181
-                android:layout_height="wrap_content"
182
-                android:layout_marginTop="15dp"
183
-                android:textColor="@color/_7B8088"
184
-                android:textSize="14sp"
185
-                android:layout_centerHorizontal="true"
186
-                android:text="@string/week_point"/>
187
-
188
-            <TextView
189
-                android:id="@+id/tv_week_point_amount"
190
-                android:layout_width="wrap_content"
191
-                android:layout_height="wrap_content"
192
-                android:layout_below="@id/tv_week_point"
193
-                android:layout_marginTop="12dp"
194
-                android:textColor="@color/_EF4847"
195
-                android:textSize="22sp"
196
-                android:layout_centerHorizontal="true"/>
197
-
198
-        </RelativeLayout>
199
-
200
-    </LinearLayout>
201
-
202
-    <LinearLayout
203
-        android:id="@+id/layout_message_part"
204
-        android:layout_marginTop="8dp"
205
-        android:layout_width="match_parent"
206
-        android:layout_height="wrap_content"
207
-        android:background="@color/background_white"
208
-        android:orientation="vertical">
63
+        android:layout_height="match_parent"
64
+        android:layout_below="@id/title_bar_with_back_btn">
209 65
 
210 66
         <LinearLayout
211 67
             android:layout_width="match_parent"
212
-            android:layout_height="32dp"
213
-            android:orientation="horizontal">
214
-
215
-            <TextView
216
-                android:layout_width="wrap_content"
68
+            android:layout_height="wrap_content"
69
+            android:orientation="vertical"
70
+           >
71
+
72
+            <LinearLayout
73
+                android:layout_width="match_parent"
74
+                android:layout_height="90dp"
75
+                android:orientation="horizontal"
76
+                android:gravity="center_vertical"
77
+                android:background="@color/background_white">
78
+
79
+                <RelativeLayout
80
+                    android:layout_width="0dp"
81
+                    android:layout_weight="1"
82
+                    android:layout_height="match_parent">
83
+
84
+                    <TextView
85
+                        android:id="@+id/tv_today_upload"
86
+                        android:layout_width="wrap_content"
87
+                        android:layout_height="wrap_content"
88
+                        android:layout_marginTop="15dp"
89
+                        android:textColor="@color/_7B8088"
90
+                        android:textSize="14sp"
91
+                        android:layout_centerHorizontal="true"
92
+                        android:text="@string/today_capture"/>
93
+
94
+                    <TextView
95
+                        android:id="@+id/tv_today_upload_num"
96
+                        android:layout_width="wrap_content"
97
+                        android:layout_height="wrap_content"
98
+                        android:layout_below="@id/tv_today_upload"
99
+                        android:layout_marginTop="12dp"
100
+                        android:textColor="@color/_EF4847"
101
+                        android:textSize="22sp"
102
+                        android:layout_centerHorizontal="true"/>
103
+
104
+                </RelativeLayout>
105
+
106
+                <View
107
+                    android:layout_width="1px"
108
+                    android:layout_height="45dp"
109
+                    android:background="@color/text_hint_grey_color"/>
110
+
111
+                <RelativeLayout
112
+                    android:layout_width="0dp"
113
+                    android:layout_weight="1"
114
+                    android:layout_height="match_parent">
115
+
116
+                    <TextView
117
+                        android:id="@+id/tv_today_point"
118
+                        android:layout_width="wrap_content"
119
+                        android:layout_height="wrap_content"
120
+                        android:layout_marginTop="15dp"
121
+                        android:textColor="@color/_7B8088"
122
+                        android:textSize="14sp"
123
+                        android:layout_centerHorizontal="true"
124
+                        android:text="@string/today_incoming"/>
125
+
126
+                    <TextView
127
+                        android:id="@+id/tv_today_point_amount"
128
+                        android:layout_width="wrap_content"
129
+                        android:layout_height="wrap_content"
130
+                        android:layout_below="@id/tv_today_point"
131
+                        android:layout_marginTop="12dp"
132
+                        android:textColor="@color/_EF4847"
133
+                        android:textSize="22sp"
134
+                        android:layout_centerHorizontal="true"/>
135
+
136
+                </RelativeLayout>
137
+
138
+            </LinearLayout>
139
+            <LinearLayout
140
+                android:layout_width="match_parent"
141
+                android:layout_height="90dp"
142
+                android:orientation="horizontal"
143
+                android:gravity="center_vertical"
144
+                android:background="@color/background_white">
145
+
146
+                <RelativeLayout
147
+                    android:layout_width="0dp"
148
+                    android:layout_weight="1"
149
+                    android:layout_height="match_parent">
150
+
151
+                    <TextView
152
+                        android:id="@+id/tv_week_origin_sold"
153
+                        android:layout_width="wrap_content"
154
+                        android:layout_height="wrap_content"
155
+                        android:layout_marginTop="15dp"
156
+                        android:textColor="@color/_7B8088"
157
+                        android:textSize="14sp"
158
+                        android:layout_centerHorizontal="true"
159
+                        android:text="@string/week_origin_sold"/>
160
+
161
+                    <TextView
162
+                        android:id="@+id/tv_week_origin_sold_num"
163
+                        android:layout_width="wrap_content"
164
+                        android:layout_height="wrap_content"
165
+                        android:layout_below="@id/tv_week_origin_sold"
166
+                        android:layout_marginTop="12dp"
167
+                        android:textColor="@color/_EF4847"
168
+                        android:textSize="22sp"
169
+                        android:layout_centerHorizontal="true"/>
170
+
171
+                </RelativeLayout>
172
+
173
+                <View
174
+                    android:layout_width="1px"
175
+                    android:layout_height="45dp"
176
+                    android:background="@color/text_hint_grey_color"/>
177
+
178
+                <RelativeLayout
179
+                    android:layout_width="0dp"
180
+                    android:layout_weight="1"
181
+                    android:layout_height="match_parent">
182
+
183
+                    <TextView
184
+                        android:id="@+id/tv_week_point"
185
+                        android:layout_width="wrap_content"
186
+                        android:layout_height="wrap_content"
187
+                        android:layout_marginTop="15dp"
188
+                        android:textColor="@color/_7B8088"
189
+                        android:textSize="14sp"
190
+                        android:layout_centerHorizontal="true"
191
+                        android:text="@string/week_point"/>
192
+
193
+                    <TextView
194
+                        android:id="@+id/tv_week_point_amount"
195
+                        android:layout_width="wrap_content"
196
+                        android:layout_height="wrap_content"
197
+                        android:layout_below="@id/tv_week_point"
198
+                        android:layout_marginTop="12dp"
199
+                        android:textColor="@color/_EF4847"
200
+                        android:textSize="22sp"
201
+                        android:layout_centerHorizontal="true"/>
202
+
203
+                </RelativeLayout>
204
+
205
+            </LinearLayout>
206
+
207
+            <LinearLayout
208
+                android:id="@+id/layout_message_part"
209
+                android:layout_marginTop="8dp"
210
+                android:layout_width="match_parent"
217 211
                 android:layout_height="wrap_content"
218
-                android:layout_gravity="center_vertical"
219
-                android:text="@string/message"
212
+                android:background="@color/background_white"
213
+                android:orientation="vertical">
214
+
215
+                <LinearLayout
216
+                    android:layout_width="match_parent"
217
+                    android:layout_height="32dp"
218
+                    android:orientation="horizontal">
219
+
220
+                    <TextView
221
+                        android:layout_width="wrap_content"
222
+                        android:layout_height="wrap_content"
223
+                        android:layout_gravity="center_vertical"
224
+                        android:text="@string/message"
225
+                        android:paddingLeft="10dp"
226
+                        android:textColor="@color/_7B8088"
227
+                        android:textSize="14sp"
228
+                        />
229
+                </LinearLayout>
230
+
231
+            </LinearLayout>
232
+
233
+            <View
234
+                android:layout_width="match_parent"
235
+                android:layout_height="1px"
236
+                android:background="@color/text_hint_grey_color"/>
237
+
238
+            <LinearLayout
239
+                android:layout_width="match_parent"
240
+                android:layout_height="44dp"
220 241
                 android:paddingLeft="10dp"
221
-                android:textColor="@color/_7B8088"
222
-                android:textSize="14sp"
223
-                />
224
-        </LinearLayout>
225
-
226
-    </LinearLayout>
227
-
228
-    <View
229
-        android:layout_width="match_parent"
230
-        android:layout_height="1px"
231
-        android:background="@color/text_hint_grey_color"/>
232
-
233
-    <LinearLayout
234
-        android:layout_width="match_parent"
235
-        android:layout_height="44dp"
236
-        android:paddingLeft="10dp"
237
-        android:paddingRight="6dp"
238
-        android:background="@color/background_white"
239
-        android:orientation="horizontal">
240
-
241
-    <TextSwitcher
242
-        android:id="@+id/switcher_system_msg"
243
-        android:layout_width="0dp"
244
-        android:inAnimation="@android:anim/slide_in_left"
245
-        android:outAnimation="@android:anim/slide_out_right"
246
-        android:layout_height="wrap_content"
247
-        android:layout_gravity="center_vertical"
248
-        android:layout_weight="1"/>
249
-
250
-    <ImageView
251
-        android:layout_width="10dp"
252
-        android:layout_height="18dp"
253
-        android:layout_gravity="center_vertical"
254
-        android:src="@drawable/arrow_right"/>
255
-
256
-</LinearLayout>
257
-
258
-    <View
259
-        android:layout_width="match_parent"
260
-        android:layout_height="1px"
261
-        android:background="@color/text_hint_grey_color"/>
262
-
263
-    <LinearLayout
264
-        android:layout_width="match_parent"
265
-        android:layout_height="44dp"
266
-        android:paddingLeft="10dp"
267
-        android:paddingRight="6dp"
268
-        android:background="@color/background_white"
269
-        android:orientation="horizontal">
270
-
271
-        <TextSwitcher
272
-            android:id="@+id/switcher_order_msg"
273
-            android:layout_width="0dp"
274
-            android:layout_height="wrap_content"
275
-            android:inAnimation="@android:anim/slide_in_left"
276
-            android:outAnimation="@android:anim/slide_out_right"
277
-            android:layout_gravity="center_vertical"
278
-            android:layout_weight="1"/>
279
-
280
-        <ImageView
281
-            android:layout_width="10dp"
282
-            android:layout_height="18dp"
283
-            android:layout_gravity="center_vertical"
284
-            android:src="@drawable/arrow_right"/>
242
+                android:paddingRight="6dp"
243
+                android:background="@color/background_white"
244
+                android:orientation="horizontal">
245
+
246
+                <TextSwitcher
247
+                    android:id="@+id/switcher_system_msg"
248
+                    android:layout_width="0dp"
249
+                    android:inAnimation="@android:anim/slide_in_left"
250
+                    android:outAnimation="@android:anim/slide_out_right"
251
+                    android:layout_height="wrap_content"
252
+                    android:layout_gravity="center_vertical"
253
+                    android:layout_weight="1"/>
254
+
255
+                <ImageView
256
+                    android:layout_width="10dp"
257
+                    android:layout_height="18dp"
258
+                    android:layout_gravity="center_vertical"
259
+                    android:src="@drawable/arrow_right"/>
260
+
261
+            </LinearLayout>
262
+
263
+            <View
264
+                android:layout_width="match_parent"
265
+                android:layout_height="1px"
266
+                android:background="@color/text_hint_grey_color"/>
267
+
268
+            <LinearLayout
269
+                android:layout_width="match_parent"
270
+                android:layout_height="44dp"
271
+                android:paddingLeft="10dp"
272
+                android:paddingRight="6dp"
273
+                android:background="@color/background_white"
274
+                android:orientation="horizontal">
275
+
276
+                <TextSwitcher
277
+                    android:id="@+id/switcher_order_msg"
278
+                    android:layout_width="0dp"
279
+                    android:layout_height="wrap_content"
280
+                    android:inAnimation="@android:anim/slide_in_left"
281
+                    android:outAnimation="@android:anim/slide_out_right"
282
+                    android:layout_gravity="center_vertical"
283
+                    android:layout_weight="1"/>
284
+
285
+                <ImageView
286
+                    android:layout_width="10dp"
287
+                    android:layout_height="18dp"
288
+                    android:layout_gravity="center_vertical"
289
+                    android:src="@drawable/arrow_right"/>
290
+
291
+            </LinearLayout>
292
+
293
+            <LinearLayout
294
+                android:id="@+id/layout_box_part"
295
+                android:layout_marginTop="8dp"
296
+                android:layout_width="match_parent"
297
+                android:layout_height="wrap_content"
298
+                android:background="@color/background_white"
299
+                android:orientation="vertical">
300
+
301
+                <LinearLayout
302
+                    android:layout_width="match_parent"
303
+                    android:layout_height="32dp"
304
+                    android:orientation="horizontal">
305
+
306
+                    <TextView
307
+                        android:layout_width="wrap_content"
308
+                        android:layout_height="wrap_content"
309
+                        android:layout_gravity="center_vertical"
310
+                        android:text="@string/box_setting"
311
+                        android:paddingLeft="10dp"
312
+                        android:textColor="@color/_7B8088"
313
+                        android:textSize="14sp"
314
+                        />
315
+                </LinearLayout>
316
+
317
+                <View
318
+                    android:layout_width="match_parent"
319
+                    android:layout_height="1px"
320
+                    android:background="@color/text_hint_grey_color"/>
321
+
322
+                <LinearLayout
323
+                    android:layout_width="match_parent"
324
+                    android:layout_height="44dp"
325
+                    android:orientation="horizontal">
326
+
327
+                    <TextView
328
+                        android:layout_width="wrap_content"
329
+                        android:layout_height="wrap_content"
330
+                        android:layout_gravity="center_vertical"
331
+                        android:text="@string/box_no"
332
+                        android:paddingLeft="10dp"
333
+                        android:textColor="@color/dark_grey"
334
+                        android:textSize="16sp"
335
+                        />
336
+
337
+                    <TextView
338
+                        android:id="@+id/tv_box_num"
339
+                        android:layout_width="0dp"
340
+                        android:layout_weight="1"
341
+                        android:layout_height="match_parent"
342
+                        android:gravity="center_vertical|right"
343
+                        android:text="SN89757"
344
+                        android:paddingRight="10dp"
345
+                        android:textColor="@color/grey"
346
+                        android:textSize="14sp"
347
+                        />
348
+                </LinearLayout>
349
+
350
+                <View
351
+                    android:layout_width="match_parent"
352
+                    android:layout_height="1px"
353
+                    android:background="@color/text_hint_grey_color"/>
354
+
355
+                <LinearLayout
356
+                    android:layout_width="match_parent"
357
+                    android:layout_height="44dp"
358
+                    android:orientation="horizontal">
359
+
360
+                    <TextView
361
+                        android:layout_width="wrap_content"
362
+                        android:layout_height="wrap_content"
363
+                        android:layout_gravity="center_vertical"
364
+                        android:text="@string/box_status"
365
+                        android:paddingLeft="10dp"
366
+                        android:textColor="@color/dark_grey"
367
+                        android:textSize="16sp"
368
+                        />
369
+
370
+                    <TextView
371
+                        android:id="@+id/tv_box_status"
372
+                        android:layout_width="0dp"
373
+                        android:layout_weight="1"
374
+                        android:layout_height="match_parent"
375
+                        android:gravity="center_vertical|right"
376
+                        android:text="@string/connected_device"
377
+                        android:paddingRight="10dp"
378
+                        android:textColor="@color/grey"
379
+                        android:textSize="14sp"
380
+                        />
381
+                </LinearLayout>
382
+
383
+            </LinearLayout>
384
+
385
+            <LinearLayout
386
+                android:id="@+id/layout_price_part"
387
+                android:layout_marginTop="8dp"
388
+                android:layout_width="match_parent"
389
+                android:layout_height="wrap_content"
390
+                android:background="@color/background_white"
391
+                android:orientation="vertical">
392
+
393
+                <LinearLayout
394
+                    android:layout_width="match_parent"
395
+                    android:layout_height="44dp"
396
+                    android:paddingRight="6dp"
397
+                    android:orientation="horizontal">
398
+
399
+                    <TextView
400
+                        android:layout_width="0dp"
401
+                        android:layout_height="wrap_content"
402
+                        android:layout_gravity="center_vertical"
403
+                        android:text="@string/price_manage"
404
+                        android:paddingLeft="10dp"
405
+                        android:textColor="@color/dark_grey"
406
+                        android:textSize="16sp"
407
+                        android:layout_weight="1"/>
408
+
409
+                    <ImageView
410
+                        android:layout_width="10dp"
411
+                        android:layout_height="18dp"
412
+                        android:layout_gravity="center_vertical"
413
+                        android:src="@drawable/arrow_right"/>
414
+
415
+                </LinearLayout>
416
+
417
+                <View
418
+                    android:layout_width="match_parent"
419
+                    android:layout_height="1px"
420
+                    android:background="@color/text_hint_grey_color"/>
421
+
422
+                <LinearLayout
423
+                    android:layout_width="match_parent"
424
+                    android:layout_height="44dp"
425
+                    android:paddingRight="6dp"
426
+                    android:orientation="horizontal">
427
+
428
+                    <TextView
429
+                        android:layout_width="0dp"
430
+                        android:layout_height="wrap_content"
431
+                        android:layout_gravity="center_vertical"
432
+                        android:text="@string/platform_price_rule"
433
+                        android:paddingLeft="10dp"
434
+                        android:textColor="@color/dark_grey"
435
+                        android:textSize="16sp"
436
+                        android:layout_weight="1"/>
437
+
438
+                    <ImageView
439
+                        android:layout_width="10dp"
440
+                        android:layout_height="18dp"
441
+                        android:layout_gravity="center_vertical"
442
+                        android:src="@drawable/arrow_right"/>
443
+
444
+                </LinearLayout>
445
+
446
+            </LinearLayout>
285 447
 
286
-    </LinearLayout>
448
+        </LinearLayout>
449
+    </ScrollView>
287 450
 
288
-</LinearLayout>
289 451
 
290 452
 </RelativeLayout>

+ 10 - 4
app/src/main/res/values/strings.xml

@@ -49,8 +49,6 @@
49 49
 
50 50
     <string name="today_capture_hour">今日拍摄</string>
51 51
 
52
-    <string name="photo_upload_count">累计上传</string>
53
-
54 52
     <string name="week_point">周积分(元)</string>
55 53
 
56 54
     <string name="message">消息</string>
@@ -71,8 +69,6 @@
71 69
 
72 70
     <string name="query_processing">正在查询打印机状态</string>
73 71
 
74
-    <string name="print_test">打印测试页</string>
75
-
76 72
     <string name="bluetooth_status">蓝牙状态</string>
77 73
 
78 74
     <string name="bt_is_enabled">蓝牙已打开</string>
@@ -112,4 +108,14 @@
112 108
     <string name="printer_service_boot_fail">打印机服务连接失败,请退出应用重试</string>
113 109
 
114 110
     <string name="not_set_printer_yet">尚未设置打印机,去设置</string>
111
+
112
+    <string name="box_setting">盒子设置</string>
113
+
114
+    <string name="box_no">盒子编号</string>
115
+
116
+    <string name="box_status">盒子状态</string>
117
+
118
+    <string name="price_manage">价格管理</string>
119
+
120
+    <string name="platform_price_rule">分成及结算规则</string>
115 121
 </resources>