1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/*
2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2016 The Android Open Source Project
3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License");
5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License.
6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at
7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *      http://www.apache.org/licenses/LICENSE-2.0
9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software
11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS,
12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and
14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License.
15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */
16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
17ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpackage com.android.dialer.callcomposer.camera.exif;
18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/**
20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * This class stores the EXIF header in IFDs according to the JPEG specification. It is the result
21ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * produced by {@link ExifReader}.
22ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @see ExifReader
24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @see IfdData
25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */
26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class ExifData {
27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private final IfdData[] mIfdDatas = new IfdData[IfdId.TYPE_IFD_COUNT];
29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /**
31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * Adds IFD data. If IFD data of the same type already exists, it will be replaced by the new
32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * data.
33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   */
34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  void addIfdData(IfdData data) {
35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    mIfdDatas[data.getId()] = data;
36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /** Returns the {@link IfdData} object corresponding to a given IFD if it exists or null. */
39ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  IfdData getIfdData(int ifdId) {
40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (ExifTag.isValidIfd(ifdId)) {
41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return mIfdDatas[ifdId];
42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return null;
44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /**
47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * Returns the tag with a given TID in the given IFD if the tag exists. Otherwise returns null.
48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   */
49ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  protected ExifTag getTag(short tag, int ifd) {
50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    IfdData ifdData = mIfdDatas[ifd];
51ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return (ifdData == null) ? null : ifdData.getTag(tag);
52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /**
55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * Adds the given ExifTag to its default IFD and returns an existing ExifTag with the same TID or
56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * null if none exist.
57ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   */
58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  ExifTag addTag(ExifTag tag) {
59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (tag != null) {
60ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      int ifd = tag.getIfd();
61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return addTag(tag, ifd);
62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return null;
64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /**
67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * Adds the given ExifTag to the given IFD and returns an existing ExifTag with the same TID or
68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * null if none exist.
69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   */
70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private ExifTag addTag(ExifTag tag, int ifdId) {
71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (tag != null && ExifTag.isValidIfd(ifdId)) {
72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      IfdData ifdData = getOrCreateIfdData(ifdId);
73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      return ifdData.setTag(tag);
74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return null;
76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
77ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /**
79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * Returns the {@link IfdData} object corresponding to a given IFD or generates one if none exist.
80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   */
81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private IfdData getOrCreateIfdData(int ifdId) {
82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    IfdData ifdData = mIfdDatas[ifdId];
83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (ifdData == null) {
84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      ifdData = new IfdData(ifdId);
85ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      mIfdDatas[ifdId] = ifdData;
86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return ifdData;
88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian}
90