| /* |
| * Copyright (C) 2007 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.development; |
| |
| import android.app.Activity; |
| import android.content.ContentResolver; |
| import android.content.ContentValues; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.content.IntentFilter; |
| import android.content.BroadcastReceiver; |
| import android.database.sqlite.SQLiteConstraintException; |
| import android.net.Uri; |
| import android.os.Bundle; |
| import android.os.Environment; |
| import android.os.Handler; |
| import android.os.Message; |
| import android.provider.MediaStore; |
| import android.provider.MediaStore.Audio; |
| import android.text.Editable; |
| import android.text.TextWatcher; |
| import android.util.Log; |
| import android.view.View; |
| import android.widget.Button; |
| import android.widget.EditText; |
| import android.widget.TextView; |
| |
| import java.util.Random; |
| |
| public class MediaScannerActivity extends Activity |
| { |
| private TextView mTitle; |
| private int mNumToInsert = 20; |
| private int mArtists; |
| private int mAlbums; |
| private int mSongs; |
| private ContentResolver mResolver; |
| private Uri mAudioUri; |
| ContentValues mValues[] = new ContentValues[10]; |
| Random mRandom = new Random(); |
| StringBuilder mBuilder = new StringBuilder(); |
| |
| public MediaScannerActivity() { |
| } |
| |
| /** Called when the activity is first created or resumed. */ |
| @Override |
| public void onCreate(Bundle icicle) { |
| super.onCreate(icicle); |
| |
| setContentView(R.layout.media_scanner_activity); |
| |
| IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_STARTED); |
| intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED); |
| intentFilter.addDataScheme("file"); |
| registerReceiver(mReceiver, intentFilter); |
| |
| EditText t = (EditText) findViewById(R.id.numsongs); |
| t.addTextChangedListener(new TextWatcher() { |
| |
| public void afterTextChanged(Editable s) { |
| String text = s.toString(); |
| try { |
| mNumToInsert = Integer.valueOf(text); |
| } catch (NumberFormatException ex) { |
| mNumToInsert = 20; |
| } |
| setInsertButtonText(); |
| } |
| |
| public void beforeTextChanged(CharSequence s, int start, int count, int after) { |
| } |
| |
| public void onTextChanged(CharSequence s, int start, int before, int count) { |
| } |
| |
| }); |
| mTitle = (TextView) findViewById(R.id.title); |
| mResolver = getContentResolver(); |
| mAudioUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; |
| |
| for (int i = 0; i < 10; i++) { |
| mValues[i] = new ContentValues(); |
| } |
| setInsertButtonText(); |
| } |
| |
| /** Called when the activity going into the background or being destroyed. */ |
| @Override |
| public void onDestroy() { |
| unregisterReceiver(mReceiver); |
| mInsertHandler.removeMessages(0); |
| super.onDestroy(); |
| } |
| |
| private final BroadcastReceiver mReceiver = new BroadcastReceiver() { |
| @Override |
| public void onReceive(Context context, Intent intent) { |
| if (intent.getAction().equals(Intent.ACTION_MEDIA_SCANNER_STARTED)) { |
| mTitle.setText("Media Scanner started scanning " + intent.getData().getPath()); |
| } |
| else if (intent.getAction().equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)) { |
| mTitle.setText("Media Scanner finished scanning " + intent.getData().getPath()); |
| } |
| } |
| }; |
| |
| public void startScan(View v) { |
| sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" |
| + Environment.getExternalStorageDirectory()))); |
| |
| mTitle.setText("Sent ACTION_MEDIA_MOUNTED to trigger the Media Scanner."); |
| } |
| |
| private void setInsertButtonText() { |
| String label = getString(R.string.insertbutton, Integer.valueOf(mNumToInsert)); |
| Button b = (Button) findViewById(R.id.insertbutton); |
| b.setText(label); |
| } |
| |
| |
| public void insertItems(View v) { |
| if (mInsertHandler.hasMessages(0)) { |
| mInsertHandler.removeMessages(0); |
| setInsertButtonText(); |
| } else { |
| mInsertHandler.sendEmptyMessage(0); |
| } |
| } |
| |
| Handler mInsertHandler = new Handler() { |
| @Override |
| public void handleMessage(Message msg) { |
| |
| if (mNumToInsert-- > 0) { |
| addAlbum(); |
| runOnUiThread(mDisplayUpdater); |
| |
| if (!isFinishing()) { |
| sendEmptyMessage(0); |
| } |
| } |
| } |
| }; |
| |
| Runnable mDisplayUpdater = new Runnable() { |
| public void run() { |
| mTitle.setText("Added " + mArtists + " artists, " + mAlbums + " albums, " |
| + mSongs + " songs."); |
| } |
| }; |
| |
| // Add one more album (with 10 songs) to the database. This will be a compilation album, |
| // with one album artist for the album, and a separate artist for each song. |
| private void addAlbum() { |
| try { |
| String albumArtist = "Various Artists"; |
| String albumName = getRandomWord(3); |
| int baseYear = 1969 + mRandom.nextInt(30); |
| for (int i = 0; i < 10; i++) { |
| mValues[i].clear(); |
| String artist = getRandomName(); |
| final ContentValues map = mValues[i]; |
| map.put(MediaStore.MediaColumns.DATA, |
| "http://bogus/" + albumName + "/" + artist + "_" + i); |
| map.put(MediaStore.MediaColumns.TITLE, |
| getRandomWord(4) + " " + getRandomWord(2) + " " + (i + 1)); |
| map.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); |
| |
| map.put(Audio.Media.ARTIST, artist); |
| map.put("album_artist", albumArtist); |
| map.put(Audio.Media.ALBUM, albumName); |
| map.put(Audio.Media.TRACK, i + 1); |
| map.put(Audio.Media.DURATION, 4*60*1000); |
| map.put(Audio.Media.IS_MUSIC, 1); |
| map.put(Audio.Media.YEAR, baseYear + mRandom.nextInt(10)); |
| } |
| mResolver.bulkInsert(mAudioUri, mValues); |
| mSongs += 10; |
| mAlbums++; |
| mArtists += 11; |
| } catch (SQLiteConstraintException ex) { |
| Log.d("@@@@", "insert failed", ex); |
| } |
| } |
| |
| /** |
| * Some code to generate random names. This just strings together random |
| * syllables, and randomly inserts a modifier between the first |
| * and last name. |
| */ |
| private String[] elements = new String[] { |
| "ab", "am", |
| "bra", "bri", |
| "ci", "co", |
| "de", "di", "do", |
| "fa", "fi", |
| "ki", |
| "la", "li", |
| "ma", "me", "mi", "mo", |
| "na", "ni", |
| "pa", |
| "ta", "ti", |
| "vi", "vo" |
| }; |
| |
| private String getRandomWord(int len) { |
| int max = elements.length; |
| mBuilder.setLength(0); |
| for (int i = 0; i < len; i++) { |
| mBuilder.append(elements[mRandom.nextInt(max)]); |
| } |
| char c = mBuilder.charAt(0); |
| c = Character.toUpperCase(c); |
| mBuilder.setCharAt(0, c); |
| return mBuilder.toString(); |
| } |
| |
| private String getRandomName() { |
| boolean longfirst = mRandom.nextInt(5) < 3; |
| String first = getRandomWord(longfirst ? 3 : 2); |
| String last = getRandomWord(3); |
| switch (mRandom.nextInt(6)) { |
| case 1: |
| if (!last.startsWith("Di")) { |
| last = "di " + last; |
| } |
| break; |
| case 2: |
| last = "van " + last; |
| break; |
| case 3: |
| last = "de " + last; |
| break; |
| } |
| return first + " " + last; |
| } |
| |
| |
| |
| } |