1/*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16const medialibrary = requireInternal('multimedia.mediaLibrary');
17const featureAbility = requireNapi('ability.featureAbility');
18const ARGS_ONE = 1;
19const ARGS_TWO = 2;
20
21function getParameter() {
22  const select = 'singleselect';
23  const parameter = {
24    want:
25    {
26      action: 'ohos.want.action.photoPicker',
27      type: select,
28      parameters: {
29        uri: select,
30        filterMediaType: 'FILTER_MEDIA_TYPE_ALL',
31        maxSelectCount: 1
32      }
33    },
34    action: 'ohos.want.action.photoPicker',
35    type: select,
36    parameters: {
37      uri: select,
38      filterMediaType: 'FILTER_MEDIA_TYPE_ALL',
39      maxSelectCount: 1
40    }
41  };
42  return parameter;
43}
44
45async function startMediaSelect(option, asyncCallback) {
46  console.log('MediaLibrary startMediaSelectInner param num ' + arguments.length);
47  console.log('MediaLibrary startMediaSelectInner param ' + JSON.stringify(option));
48
49  const parameter = getParameter();
50
51  if (option !== undefined && typeof option === 'object') {
52    if (option.count !== undefined && option.count > 1) {
53      parameter.want.type = 'multipleselect';
54      parameter.want.parameters.uri = 'multipleselect';
55      parameter.want.parameters.maxSelectCount = option.count;
56      parameter.type = 'multipleselect';
57      parameter.parameters.uri = 'multipleselect';
58      parameter.parameters.maxSelectCount = option.count;
59    }
60    if (option.type !== undefined) {
61      parameter.want.parameters.filterMediaType = option.type;
62      parameter.parameters.filterMediaType = option.type;
63    }
64  }
65  if (arguments.length === ARGS_TWO && typeof asyncCallback !== 'function') {
66    console.log('MediaLibrary startMediaSelectInner callback invalid');
67    throw Error('invalid callback');
68  }
69  console.log('MediaLibrary startMediaSelectInner parameter ' + JSON.stringify(parameter));
70  const result = await featureAbility.startAbilityForResult(parameter);
71  console.log('MediaLibrary startMediaSelectInner result ' + JSON.stringify(result));
72  const uri = result.want.parameters['select-item-list'];
73  if (arguments.length === ARGS_TWO && typeof asyncCallback === 'function') {
74    console.log('MediaLibrary startMediaSelectInner callback ' + uri);
75    return asyncCallback(result.resultCode, uri);
76  }
77  return new Promise((resolve, reject) => {
78    if (result.resultCode === 0) {
79      console.log('MediaLibrary startMediaSelectInner promise ' + uri);
80      resolve(uri);
81    } else {
82      console.log('MediaLibrary startMediaSelectInner err ' + result.resultCode);
83      reject(result.resultCode);
84    }
85  });
86}
87
88function getMediaLibrary(context) {
89  const media = medialibrary.getMediaLibrary(context);
90  console.log('MediaLibrary getMediaLibrary inner ');
91  if (media !== undefined) {
92    console.log('MediaLibrary getMediaLibrary inner add startMediaSelect');
93    media.startMediaSelect = startMediaSelect;
94  }
95  return media;
96}
97
98function getMediaLibraryAsync(context, asyncCallback) {
99  console.log('MediaLibrary getMediaLibraryAsync js caller ');
100  if (context === undefined) {
101    console.log('MediaLibrary getMediaLibraryAsync context invalid');
102    throw Error('invalid context');
103  }
104  if (arguments.length === ARGS_ONE) {
105    return medialibrary.getMediaLibraryAsync(context)
106      .then((media) => {
107        console.log('MediaLibrary getMediaLibraryAsync js caller add startMediaSelect');
108        media.startMediaSelect = startMediaSelect;
109        return media;
110      })
111      .catch((err) => {
112        console.log('MediaLibrary getMediaLibraryAsync js caller err ' + err);
113        throw Error(err);
114      });
115  } else if (arguments.length === ARGS_TWO && typeof asyncCallback === 'function') {
116    medialibrary.getMediaLibraryAsync(context, (err, media) => {
117      console.log('MediaLibrary getMediaLibraryAsync js caller callback ' + err);
118      if (err) {
119        asyncCallback(err);
120      } else {
121        if (media !== undefined) {
122          console.log('MediaLibrary getMediaLibraryAsync js caller add startMediaSelect');
123          media.startMediaSelect = startMediaSelect;
124        }
125        asyncCallback(err, media);
126      }
127    });
128  } else {
129    console.log('MediaLibrary getMediaLibraryAsync js caller param invalid');
130    throw Error('invalid param');
131  }
132  return undefined;
133}
134
135function getScannerInstance(context) {
136  console.log('MediaLibrary getScannerInstance js caller ');
137  const instance = medialibrary.getScannerInstance(context);
138  return instance;
139}
140
141export default {
142  getMediaLibrary,
143  getMediaLibraryAsync,
144  getScannerInstance,
145  MediaType: medialibrary.MediaType,
146  FileKey: medialibrary.FileKey,
147  DirectoryType: medialibrary.DirectoryType,
148  PrivateAlbumType: medialibrary.PrivateAlbumType
149};
150