1/*
2 * Copyright (C) 2009 The Android Open Source Project
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
17package com.android.wallpaper.livepicker;
18
19import android.app.Activity;
20import android.app.AlertDialog;
21import android.app.Dialog;
22import android.app.DialogFragment;
23import android.app.Fragment;
24import android.app.WallpaperInfo;
25import android.os.Bundle;
26import android.content.DialogInterface;
27import android.content.Intent;
28import android.util.Log;
29import android.view.LayoutInflater;
30import android.view.View;
31import android.view.ViewGroup;
32import android.widget.AdapterView;
33import android.widget.BaseAdapter;
34
35public class LiveWallpaperActivity extends Activity {
36    private static final String LOG_TAG = "LiveWallpapersPicker";
37    private static final int REQUEST_PREVIEW = 100;
38
39    @Override
40    protected void onCreate(Bundle savedInstanceState) {
41        super.onCreate(savedInstanceState);
42        setContentView(R.layout.live_wallpaper_base);
43
44        Fragment fragmentView = getFragmentManager().findFragmentById(R.id.live_wallpaper_fragment);
45        if (fragmentView == null) {
46            /* When the screen is XLarge, the fragment is not included in the layout, so show it
47             * as a dialog
48             */
49            DialogFragment fragment = WallpaperDialog.newInstance();
50            fragment.show(getFragmentManager(), "dialog");
51        }
52    }
53
54    @Override
55    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
56        super.onActivityResult(requestCode, resultCode, data);
57
58        if (requestCode == REQUEST_PREVIEW) {
59            if (resultCode == RESULT_OK) finish();
60        }
61    }
62
63    public static class WallpaperDialog extends DialogFragment implements
64            AdapterView.OnItemClickListener{
65        private static final String EMBEDDED_KEY = "com.android.wallpaper.livepicker."
66                + "LiveWallpaperActivity$WallpaperDialog.EMBEDDED_KEY";
67        private LiveWallpaperListAdapter mAdapter;
68        private boolean mEmbedded;
69
70        public static WallpaperDialog newInstance() {
71            WallpaperDialog dialog = new WallpaperDialog();
72            dialog.setCancelable(true);
73            return dialog;
74        }
75
76        @Override
77        public void onCreate(Bundle savedInstanceState) {
78            super.onCreate(savedInstanceState);
79            if (savedInstanceState != null && savedInstanceState.containsKey(EMBEDDED_KEY)) {
80                mEmbedded = savedInstanceState.getBoolean(EMBEDDED_KEY);
81            } else {
82                mEmbedded = isInLayout();
83            }
84        }
85
86        @Override
87        public void onSaveInstanceState(Bundle outState) {
88            outState.putBoolean(EMBEDDED_KEY, mEmbedded);
89        }
90
91        @Override
92        public void onDismiss(DialogInterface dialog) {
93            /* On orientation changes, the dialog is effectively "dismissed" so this is called
94             * when the activity is no longer associated with this dying dialog fragment. We
95             * should just safely ignore this case by checking if getActivity() returns null
96             */
97            Activity activity = getActivity();
98            if (activity != null) {
99                activity.finish();
100            }
101        }
102
103        @Override
104        public Dialog onCreateDialog(Bundle savedInstanceState) {
105            final int contentInset = getResources().getDimensionPixelSize(
106                    R.dimen.dialog_content_inset);
107            View view = generateView(getActivity().getLayoutInflater(), null);
108
109            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
110            builder.setNegativeButton(R.string.wallpaper_cancel, null);
111            builder.setTitle(R.string.live_wallpaper_picker_title);
112            builder.setView(view, contentInset, contentInset, contentInset, contentInset);
113            return builder.create();
114        }
115
116        @Override
117        public View onCreateView(LayoutInflater inflater, ViewGroup container,
118                Bundle savedInstanceState) {
119            /* If this fragment is embedded in the layout of this activity, then we should
120             * generate a view to display. Otherwise, a dialog will be created in
121             * onCreateDialog()
122             */
123            if (mEmbedded) {
124                return generateView(inflater, container);
125            }
126            return null;
127        }
128
129        @SuppressWarnings("unchecked")
130        private View generateView(LayoutInflater inflater, ViewGroup container) {
131            View layout = inflater.inflate(R.layout.live_wallpaper_list, container, false);
132
133            mAdapter = new LiveWallpaperListAdapter(getActivity());
134            AdapterView<BaseAdapter> adapterView =
135                    (AdapterView<BaseAdapter>) layout.findViewById(android.R.id.list);
136            adapterView.setAdapter(mAdapter);
137            adapterView.setOnItemClickListener(this);
138            adapterView.setEmptyView(layout.findViewById(android.R.id.empty));
139            return layout;
140        }
141
142        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
143            LiveWallpaperListAdapter.LiveWallpaperInfo wallpaperInfo =
144                    (LiveWallpaperListAdapter.LiveWallpaperInfo) mAdapter.getItem(position);
145            final Intent intent = wallpaperInfo.intent;
146            final WallpaperInfo info = wallpaperInfo.info;
147            LiveWallpaperPreview.showPreview(getActivity(), REQUEST_PREVIEW, intent, info);
148        }
149    }
150}
151