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 17 package android.media.cts; 18 19 import android.media.cts.R; 20 21 22 import android.content.ComponentName; 23 import android.content.Context; 24 import android.media.MediaScannerConnection; 25 import android.media.MediaScannerConnection.MediaScannerConnectionClient; 26 import android.net.Uri; 27 import android.os.IBinder; 28 import android.platform.test.annotations.AppModeFull; 29 import android.test.AndroidTestCase; 30 31 import com.android.compatibility.common.util.FileCopyHelper; 32 import com.android.compatibility.common.util.PollingCheck; 33 34 import java.io.File; 35 import java.io.FileOutputStream; 36 import java.io.InputStream; 37 38 @AppModeFull(reason = "TODO: evaluate and port to instant") 39 public class MediaScannerConnectionTest extends AndroidTestCase { 40 41 private static final String MEDIA_TYPE = "audio/mpeg"; 42 private File mMediaFile; 43 private static final int TIME_OUT = 10000; 44 private MockMediaScannerConnection mMediaScannerConnection; 45 private MockMediaScannerConnectionClient mMediaScannerConnectionClient; 46 47 @Override 48 protected void setUp() throws Exception { 49 super.setUp(); 50 // prepare the media file. 51 52 FileCopyHelper copier = new FileCopyHelper(mContext); 53 String fileName = "test" + System.currentTimeMillis(); 54 File dir = getContext().getExternalFilesDir(null); 55 mMediaFile = new File(dir, fileName); 56 copier.copyToExternalStorage(R.raw.testmp3, mMediaFile); 57 58 assertTrue(mMediaFile.exists()); 59 } 60 61 @Override 62 protected void tearDown() throws Exception { 63 super.tearDown(); 64 if (mMediaFile != null) { 65 mMediaFile.delete(); 66 } 67 if (mMediaScannerConnection != null) { 68 mMediaScannerConnection.disconnect(); 69 mMediaScannerConnection = null; 70 } 71 } 72 73 public void testMediaScannerConnection() throws InterruptedException { 74 mMediaScannerConnectionClient = new MockMediaScannerConnectionClient(); 75 mMediaScannerConnection = new MockMediaScannerConnection(getContext(), 76 mMediaScannerConnectionClient); 77 78 assertFalse(mMediaScannerConnection.isConnected()); 79 80 // test connect and disconnect. 81 mMediaScannerConnection.connect(); 82 checkConnectionState(true); 83 84 assertTrue(mMediaScannerConnection.mIsOnServiceConnectedCalled); 85 mMediaScannerConnection.disconnect(); 86 87 checkConnectionState(false); 88 89 // FIXME: onServiceDisconnected is not called. 90 assertFalse(mMediaScannerConnection.mIsOnServiceDisconnectedCalled); 91 mMediaScannerConnection.connect(); 92 93 checkConnectionState(true); 94 95 mMediaScannerConnection.scanFile(mMediaFile.getAbsolutePath(), MEDIA_TYPE); 96 97 checkMediaScannerConnection(); 98 99 assertEquals(mMediaFile.getAbsolutePath(), mMediaScannerConnectionClient.mediaPath); 100 assertNotNull(mMediaScannerConnectionClient.mediaUri); 101 } 102 103 private void checkMediaScannerConnection() { 104 new PollingCheck(TIME_OUT) { 105 protected boolean check() { 106 return mMediaScannerConnectionClient.isOnMediaScannerConnectedCalled; 107 } 108 }.run(); 109 new PollingCheck(TIME_OUT) { 110 protected boolean check() { 111 return mMediaScannerConnectionClient.mediaPath != null; 112 } 113 }.run(); 114 } 115 116 private void checkConnectionState(final boolean expected) { 117 new PollingCheck(TIME_OUT) { 118 protected boolean check() { 119 return mMediaScannerConnection.isConnected() == expected; 120 } 121 }.run(); 122 } 123 124 class MockMediaScannerConnection extends MediaScannerConnection { 125 126 public boolean mIsOnServiceConnectedCalled; 127 public boolean mIsOnServiceDisconnectedCalled; 128 public MockMediaScannerConnection(Context context, MediaScannerConnectionClient client) { 129 super(context, client); 130 } 131 132 @Override 133 public void onServiceConnected(ComponentName className, IBinder service) { 134 super.onServiceConnected(className, service); 135 mIsOnServiceConnectedCalled = true; 136 } 137 138 @Override 139 public void onServiceDisconnected(ComponentName className) { 140 super.onServiceDisconnected(className); 141 mIsOnServiceDisconnectedCalled = true; 142 // this is not called. 143 } 144 } 145 146 class MockMediaScannerConnectionClient implements MediaScannerConnectionClient { 147 148 public boolean isOnMediaScannerConnectedCalled; 149 public String mediaPath; 150 public Uri mediaUri; 151 public void onMediaScannerConnected() { 152 isOnMediaScannerConnectedCalled = true; 153 } 154 155 public void onScanCompleted(String path, Uri uri) { 156 mediaPath = path; 157 if (uri != null) { 158 mediaUri = uri; 159 } 160 } 161 162 } 163 164 } 165