1423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen/* 2423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * Copyright (C) 2009 The Android Open Source Project 3423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * 4423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License"); 5423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * you may not use this file except in compliance with the License. 6423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * You may obtain a copy of the License at 7423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * 8423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * http://www.apache.org/licenses/LICENSE-2.0 9423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * 10423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * Unless required by applicable law or agreed to in writing, software 11423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS, 12423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * See the License for the specific language governing permissions and 14423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen * limitations under the License. 15423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen */ 16423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 17423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenpackage com.android.magicsmoke; 18423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 19423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.app.Activity; 20423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.app.WallpaperManager; 21423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.app.WallpaperInfo; 22423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.app.Dialog; 23423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.service.wallpaper.IWallpaperConnection; 24423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.service.wallpaper.IWallpaperService; 25423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.service.wallpaper.IWallpaperEngine; 26423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.service.wallpaper.WallpaperSettingsActivity; 27423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.content.ServiceConnection; 28423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.content.Intent; 29423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.content.Context; 30423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.content.ComponentName; 31423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.content.SharedPreferences; 32423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.content.SharedPreferences.Editor; 33423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.os.RemoteException; 34423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.os.IBinder; 35423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.os.ParcelFileDescriptor; 36423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.os.Bundle; 37423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.view.MotionEvent; 38423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.view.View; 39423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.view.WindowManager; 40423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.view.ViewGroup; 41423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.view.Window; 42423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.view.LayoutInflater; 43423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.util.Log; 44423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenimport android.widget.TextView; 45423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 46423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissenpublic class MagicSmokeSelector extends Activity { 47423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 48423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen private static final String LOG_TAG = "MagicSmokeSelector"; 49423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 50423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen private WallpaperManager mWallpaperManager; 51423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen private WallpaperConnection mWallpaperConnection; 52423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 53423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen private Intent mWallpaperIntent; 54423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen private SharedPreferences mSharedPref; 55423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen private int mCurrentPreset; 56423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 57423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen @Override 58423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen protected void onCreate(Bundle savedInstanceState) { 59423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen super.onCreate(savedInstanceState); 60423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 61423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen setContentView(R.layout.selector); 62423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 63423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mWallpaperIntent = new Intent(this, MagicSmoke.class); 64423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 65423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mWallpaperManager = WallpaperManager.getInstance(this); 66423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mWallpaperConnection = new WallpaperConnection(mWallpaperIntent); 67423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 68423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mSharedPref = getSharedPreferences("magicsmoke", Context.MODE_PRIVATE); 69423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mCurrentPreset = mSharedPref.getInt("preset", MagicSmokeRS.DEFAULT_PRESET); 70423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen if (mCurrentPreset >= MagicSmokeRS.mPreset.length) { 71423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mCurrentPreset = 0; 72423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen updatePrefs(); 73423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 74423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 75423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 76423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen @Override 77423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public void onResume() { 78423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen super.onResume(); 79423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen if (mWallpaperConnection != null && mWallpaperConnection.mEngine != null) { 80423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen try { 81423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mWallpaperConnection.mEngine.setVisibility(true); 82423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } catch (RemoteException e) { 83423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen // Ignore 84423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 85423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 86423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 87423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 88423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen @Override 89423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public void onPause() { 90423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen super.onPause(); 91423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen if (mWallpaperConnection != null && mWallpaperConnection.mEngine != null) { 92423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen try { 93423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mWallpaperConnection.mEngine.setVisibility(false); 94423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } catch (RemoteException e) { 95423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen // Ignore 96423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 97423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 98423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 99423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 100423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen @Override 101423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public void onAttachedToWindow() { 102423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen super.onAttachedToWindow(); 103423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 104423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen if (!mWallpaperConnection.connect()) { 105423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mWallpaperConnection = null; 106423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 107423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 108423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 109423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen @Override 110423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public void onDetachedFromWindow() { 111423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen super.onDetachedFromWindow(); 112423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 113423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen if (mWallpaperConnection != null) { 114423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mWallpaperConnection.disconnect(); 115423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 116423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mWallpaperConnection = null; 117423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 118423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 119423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen @Override 120423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public boolean onTouchEvent(MotionEvent event) { 121423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen // TODO: make this conditional on preview mode. Right now we 122423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen // don't get touch events in preview mode. 123423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen switch(event.getAction()) { 124423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen case MotionEvent.ACTION_DOWN: 125423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen if (mCurrentPreset == 0) { 126423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mCurrentPreset = MagicSmokeRS.mPreset.length - 1; 127423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } else { 128423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mCurrentPreset--; 129423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 130423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen updatePrefs(); 131423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen return true; 132423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 133423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 134423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen return super.onTouchEvent(event); 135423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 136423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 137423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen private void updatePrefs() { 138423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen Editor edit = mSharedPref.edit(); 139423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen edit.putInt("preset", mCurrentPreset); 1400fc62f8eb8e020b742a43c7e8a44ed78b9d7da4aBrad Fitzpatrick edit.apply(); 141423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 142423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 143423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen class WallpaperConnection extends IWallpaperConnection.Stub implements ServiceConnection { 144423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen final Intent mIntent; 145423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen IWallpaperService mService; 146423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen IWallpaperEngine mEngine; 147423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen boolean mConnected; 148423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 149423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen WallpaperConnection(Intent intent) { 150423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mIntent = intent; 151423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 152423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 153423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public boolean connect() { 154423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen synchronized (this) { 155423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen if (!bindService(mIntent, this, Context.BIND_AUTO_CREATE)) { 156423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen return false; 157423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 158423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 159423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mConnected = true; 160423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen return true; 161423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 162423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 163423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 164423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public void disconnect() { 165423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen synchronized (this) { 166423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mConnected = false; 167423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen if (mEngine != null) { 168423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen try { 169423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mEngine.destroy(); 170423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } catch (RemoteException e) { 171423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen // Ignore 172423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 173423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mEngine = null; 174423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 175423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen unbindService(this); 176423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mService = null; 177423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 178423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 179423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 180423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public void onServiceConnected(ComponentName name, IBinder service) { 181423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen if (mWallpaperConnection == this) { 182423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mService = IWallpaperService.Stub.asInterface(service); 183423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen try { 184423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen final View view = findViewById(R.id.backgroundview); 185423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen final View root = view.getRootView(); 186423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mService.attach(this, view.getWindowToken(), 187423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY, 188423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen true, root.getWidth(), root.getHeight()); 189423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } catch (RemoteException e) { 190423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen Log.w(LOG_TAG, "Failed attaching wallpaper; clearing", e); 191423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 192423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 193423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 194423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 195423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public void onServiceDisconnected(ComponentName name) { 196423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mService = null; 197423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mEngine = null; 198423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen if (mWallpaperConnection == this) { 199423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen Log.w(LOG_TAG, "Wallpaper service gone: " + name); 200423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 201423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 202423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 203423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public void attachEngine(IWallpaperEngine engine) { 204423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen synchronized (this) { 205423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen if (mConnected) { 206423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen mEngine = engine; 207423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen try { 208423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen engine.setVisibility(true); 209423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } catch (RemoteException e) { 210423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen // Ignore 211423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 212423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } else { 213423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen try { 214423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen engine.destroy(); 215423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } catch (RemoteException e) { 216423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen // Ignore 217423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 218423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 219423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 220423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 221423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen 222423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen public ParcelFileDescriptor setWallpaper(String name) { 223423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen return null; 224423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 225423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen } 226423d39f6a9fd7b6399b92a272eadc49676375f48Marco Nelissen} 227