summaryrefslogtreecommitdiff
path: root/src/com/android/customization/model/theme/ThemeBundledWallpaperInfo.java
blob: d3935e80320100cd656fd7b13d00b2a95b9af969 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.customization.model.theme;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.os.Parcel;
import android.util.Log;

import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;

import com.android.wallpaper.asset.Asset;
import com.android.wallpaper.asset.ResourceAsset;
import com.android.wallpaper.model.InlinePreviewIntentFactory;
import com.android.wallpaper.model.WallpaperInfo;

import java.util.ArrayList;
import java.util.List;

/**
 * Represents a wallpaper coming from the resources of the theme bundle container APK.
 */
public class ThemeBundledWallpaperInfo extends WallpaperInfo {
    public static final Creator<ThemeBundledWallpaperInfo> CREATOR =
            new Creator<ThemeBundledWallpaperInfo>() {
                @Override
                public ThemeBundledWallpaperInfo createFromParcel(Parcel in) {
                    return new ThemeBundledWallpaperInfo(in);
                }

                @Override
                public ThemeBundledWallpaperInfo[] newArray(int size) {
                    return new ThemeBundledWallpaperInfo[size];
                }
            };

    private static final String TAG = "ThemeBundledWallpaperInfo";

    private final String mPackageName;
    private final String mResName;
    private final String mCollectionId;
    @DrawableRes private final int mDrawableResId;
    @StringRes private final int mTitleResId;
    @StringRes private final int mAttributionResId;
    @StringRes private final int mActionUrlResId;
    private List<String> mAttributions;
    private String mActionUrl;
    private Resources mResources;
    private Asset mAsset;

    /**
     * Constructs a new theme-bundled static wallpaper model object.
     *
     * @param drawableResId  Resource ID of the raw wallpaper image.
     * @param resName        The unique name of the wallpaper resource, e.g. "z_wp001".
     * @param themeName   Unique name of the collection this wallpaper belongs in; used for logging.
     * @param titleResId     Resource ID of the string for the title attribution.
     * @param attributionResId Resource ID of the string for the first subtitle attribution.
     */
    public ThemeBundledWallpaperInfo(String packageName, String resName, String themeName,
            int drawableResId, int titleResId, int attributionResId, int actionUrlResId) {
        mPackageName = packageName;
        mResName = resName;
        mCollectionId = themeName;
        mDrawableResId = drawableResId;
        mTitleResId = titleResId;
        mAttributionResId = attributionResId;
        mActionUrlResId = actionUrlResId;
    }

    private ThemeBundledWallpaperInfo(Parcel in) {
        super(in);
        mPackageName = in.readString();
        mResName = in.readString();
        mCollectionId = in.readString();
        mDrawableResId = in.readInt();
        mTitleResId = in.readInt();
        mAttributionResId = in.readInt();
        mActionUrlResId = in.readInt();
    }

    @Override
    public List<String> getAttributions(Context context) {
        if (mAttributions == null) {
            Resources res = getPackageResources(context);
            mAttributions = new ArrayList<>();
            if (mTitleResId != 0) {
                mAttributions.add(res.getString(mTitleResId));
            }
            if (mAttributionResId != 0) {
                mAttributions.add(res.getString(mAttributionResId));
            }
        }

        return mAttributions;
    }

    @Override
    public String getActionUrl(Context context) {
        if (mActionUrl == null && mActionUrlResId != 0) {
            mActionUrl = getPackageResources(context).getString(mActionUrlResId);
        }
        return mActionUrl;
    }

    @Override
    public Asset getAsset(Context context) {
        if (mAsset == null) {
            Resources res = getPackageResources(context);
            mAsset = new ResourceAsset(res, mDrawableResId);
        }

        return mAsset;
    }

    @Override
    public Asset getThumbAsset(Context context) {
        return getAsset(context);
    }

    @Override
    public void showPreview(Activity srcActivity, InlinePreviewIntentFactory factory,
            int requestCode) {
        try {
            srcActivity.startActivityForResult(factory.newIntent(srcActivity, this), requestCode);
        } catch (ActivityNotFoundException |SecurityException e) {
            Log.e(TAG, "App isn't installed or ThemePicker doesn't have permission to launch", e);
        }

    }

    @Override
    public String getCollectionId(Context unused) {
        return mCollectionId;
    }

    @Override
    public String getWallpaperId() {
        return mResName;
    }

    public String getResName() {
        return mResName;
    }

    /**
     * Returns the {@link Resources} instance for the theme bundles stub APK.
     */
    private Resources getPackageResources(Context context) {
        if (mResources != null) {
            return mResources;
        }

        try {
            mResources = context.getPackageManager().getResourcesForApplication(mPackageName);
        } catch (PackageManager.NameNotFoundException e) {
            Log.e(TAG, "Could not get app resources for " + mPackageName);
        }
        return mResources;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        dest.writeString(mPackageName);
        dest.writeString(mResName);
        dest.writeString(mCollectionId);
        dest.writeInt(mDrawableResId);
        dest.writeInt(mTitleResId);
        dest.writeInt(mAttributionResId);
        dest.writeInt(mActionUrlResId);
    }
}