Version 1.4

This commit is contained in:
Victor 2013-08-24 16:08:13 +03:00
parent 0ac06f6750
commit dedfdbcc83
19 changed files with 339 additions and 42 deletions

View File

@ -1,44 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.annimon.playlisteditor"
android:versionCode="4"
android:versionName="1.3" >
android:versionCode="5"
android:versionName="1.4">
<uses-sdk android:minSdkVersion="5" android:targetSdkVersion="17" />
<uses-sdk
android:minSdkVersion="5"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".SelectPlaylistActivity"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:screenOrientation="landscape" >
android:theme="@style/AppTheme" >
<activity
android:name=".SelectPlaylistActivity"
android:label="@string/app_name"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".EditPlaylistActivity"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:theme="@style/AppTheme.NoTitleBar" />
android:name=".EditPlaylistActivity"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:theme="@style/AppTheme.NoTitleBar" />
<activity
android:name="com.google.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" />
android:name=".HelpActivity"
android:label="@string/help"
android:screenOrientation="landscape" />
<activity
android:name="com.google.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" />
</application>
</manifest>
</manifest>

Binary file not shown.

Binary file not shown.

BIN
res/drawable-hdpi/help1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
res/drawable-hdpi/help2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
res/drawable-hdpi/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<GridView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/gridView"
android:layout_gravity="center"
android:numColumns="2"
android:background="@drawable/background"/>
</LinearLayout>

101
res/layout/help.xml Normal file
View File

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="utf-8"?>
<ViewFlipper
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/viewFlipper"
android:paddingLeft="5dp"
android:paddingRight="5dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/help_title_1"
android:textAppearance="?android:attr/textAppearanceMedium"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="5dp"
android:text="@string/help_message_1"
android:gravity="center"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@drawable/help1"
android:contentDescription="@string/help_message_1"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/help_title_2"
android:textAppearance="?android:attr/textAppearanceMedium"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="5dp"
android:text="@string/help_message_2"
android:gravity="center"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@drawable/help2"
android:contentDescription="@string/help_message_2"/>
</LinearLayout>
<!-- About -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/about"
android:textAppearance="?android:attr/textAppearanceMedium"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dp"
android:text="@string/about_message"
android:gravity="center"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@drawable/logo"
android:contentDescription="@string/about" />
</LinearLayout>
</ViewFlipper>

View File

@ -19,16 +19,15 @@
<Button
style="?android:attr/buttonStyleSmall"
android:id="@+id/saveButton"
android:id="@+id/showMenu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginRight="5dp"
android:background="@null"
android:drawableLeft="@android:drawable/ic_menu_save"
android:text="@string/save_playlist" />
android:drawableLeft="@android:drawable/ic_menu_more"
android:text="@string/menu" />
</RelativeLayout>
<LinearLayout

View File

@ -5,6 +5,11 @@
android:showAsAction="always|withText"
android:title="@string/new_playlist"
android:icon="@drawable/ic_new" />
<item android:id="@+id/menu_help"
android:showAsAction="always|withText"
android:title="@string/help"
android:icon="@android:drawable/ic_menu_help" />
<item android:id="@+id/menu_restore_playlist"
android:showAsAction="never"

View File

@ -11,10 +11,28 @@
<string name="enter_name">Введите имя</string>
<string name="done">Готово!</string>
<string name="all_tracks">Все треки</string>
<string name="menu">Меню</string>
<string name="sort_by_id">Сортировать по id</string>
<string name="sort_by_artist">Сортировать по исполнителю</string>
<string name="sort_by_name">Сортировать по названию</string>
<string name="reverse_list">В обратном порядке</string>
<string name="show_differences">Показать различия</string>
<!-- Errors, messages etc -->
<string name="error_while_restore_backup">Ошибка при восстановлении резервной копии</string>
<string name="unable_to_store_backup">Невозможно сохранить резервную копию</string>
<string name="empty_backup_list">Пустой список резервных копий</string>
<string name="press_again">Нажмите еще раз для выхода в меню</string>
<!-- Help, tutorial -->
<string name="help">Помощь</string>
<string name="help_title_1">Добавление/Удаление трека</string>
<string name="help_message_1">Нажмите на трек в левом списке (1), затем на пункт в правом, перед которым следует поместить трек (2). Для удаления нажмите и удерживайте пункт в правом списке.</string>
<string name="help_title_2">Показать различия</string>
<string name="help_message_2">Используется для поиска треков в левом списке, которых нет в правом, а также для поиска дубликатов.</string>
<!-- About -->
<string name="about">О программе</string>
<string name="about_message"><b>Playlist Editor 1.4</b>\n<b>Автор</b>: Виктор aNNiMON Мельник\nhttp://annimon.com/</string>
</resources>

View File

@ -11,10 +11,29 @@
<string name="enter_name">Enter name</string>
<string name="done">Done!</string>
<string name="all_tracks">All tracks</string>
<string name="menu">Menu</string>
<string name="sort_by_id">Sort by id</string>
<string name="sort_by_artist">Sort by artist</string>
<string name="sort_by_name">Sort by name</string>
<string name="reverse_list">Reverse list</string>
<string name="show_differences">Show differences</string>
<!-- Errors, messages etc -->
<string name="error_while_restore_backup">Error while restore backup</string>
<string name="unable_to_store_backup">Unable to store backup</string>
<string name="empty_backup_list">Empty backup list</string>
<string name="press_again">Press again for exit to menu</string>
<!-- Help, tutorial -->
<string name="help">Help</string>
<string name="help_title_1">Add/Remove track</string>
<string name="help_message_1">Press item in the left list (1), then press item in right list, which should be placed in front of him (2). Long tap to remove track (in right list only).</string>
<string name="help_title_2">Show differences</string>
<string name="help_message_2">Used to find tracks in the left list, which is not present in right list and to find duplicates.</string>
<!-- About -->
<string name="about">About</string>
<string name="about_message"><b>Playlist Editor 1.4</b>\n<b>Author</b>: Victor aNNiMON Melnik\nhttp://annimon.com/</string>
</resources>

View File

@ -0,0 +1,34 @@
package com.annimon.playlisteditor;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ViewFlipper;
/**
* Show help window.
* @author aNNiMON
*/
public class HelpActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.help);
final ViewFlipper flipper = (ViewFlipper) findViewById(R.id.viewFlipper);
flipper.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
flipper.showNext();
}
});
}
@Override
public void onBackPressed() {
super.onBackPressed();
overridePendingTransition(R.anim.slide_right_in, R.anim.slide_right_out);
}
}

View File

@ -0,0 +1,52 @@
package com.annimon.playlisteditor;
import android.app.Dialog;
import android.content.Context;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.GridView;
/**
* Custom menu dialog.
* @author aNNiMON
*/
public abstract class MenuDialog implements AdapterView.OnItemClickListener {
private Dialog dialog;
private int[] menuIds;
public MenuDialog(Context context, int[] menuIds) {
this.menuIds = menuIds;
dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setCancelable(true);
dialog.setContentView(R.layout.editor_menu);
String[] items = new String[menuIds.length];
for (int i = 0; i < items.length; i++) {
items[i] = context.getString(menuIds[i]);
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
context, android.R.layout.simple_list_item_1, items);
GridView gridView = (GridView) dialog.findViewById(R.id.gridView);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(this);
}
public void show() {
dialog.show();
}
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
onClick(menuIds[position], (position % 2) == 0);
dialog.dismiss();
}
protected abstract void onClick(int resId, boolean leftColumn);
}

View File

@ -43,14 +43,13 @@ public class PlaylistBackup {
}
public List<BackupFile> list() throws IOException {
String[] filelist = context.fileList();
int length = filelist.length;
List<BackupFile> backups = new ArrayList<BackupFile>(length);
for (int i = 0; i < length; i++) {
if (filelist[i].endsWith(BACKUP_EXT)) {
String playlistName = getPlaylistName(filelist[i]);
backups.add( new BackupFile(filelist[i], playlistName) );
String[] fileslist = context.fileList();
List<BackupFile> backups = new ArrayList<BackupFile>(fileslist.length);
for (String filename : fileslist) {
if (filename.endsWith(BACKUP_EXT)) {
String playlistName = getPlaylistName(filename);
backups.add(new BackupFile(filename, playlistName));
}
}

View File

@ -126,7 +126,7 @@ public class PlaylistDatabase {
/**
* Get tracks of playlist. If playlistId equals -1 - return all tracks in system.
* @param context
* @param context context.
* @param playlistId id of playlist, or -1.
* @return tracks array.
*/

View File

@ -77,6 +77,11 @@ public class SelectPlaylistActivity extends ListActivity {
case R.id.menu_restore_playlist:
restorePlaylist();
break;
case R.id.menu_help:
Intent intent = new Intent(this, HelpActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.slide_left_in, R.anim.slide_left_out);
break;
}
return true;
}

View File

@ -2,6 +2,8 @@ package com.annimon.playlisteditor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
@ -17,6 +19,8 @@ import com.annimon.playlisteditor.data.Track;
*/
public class TracksAdapter extends ArrayAdapter<Track> {
public static enum Sort { BY_ID, BY_ARTIST, BY_NAME }
private int resource;
private LayoutInflater inflater;
private List<Track> objects;
@ -44,6 +48,43 @@ public class TracksAdapter extends ArrayAdapter<Track> {
objects.remove(position);
notifyDataSetChanged();
}
public void sortTracks(Sort type) {
Comparator<Track> comparator = null;
switch (type) {
case BY_ID:
comparator = new Comparator<Track>() {
@Override
public int compare(Track track, Track track2) {
return track.getAudioId() - track2.getAudioId();
}
};
break;
case BY_ARTIST:
comparator = new Comparator<Track>() {
@Override
public int compare(Track track, Track track2) {
return track.getArtist().compareToIgnoreCase(track2.getArtist());
}
};
break;
case BY_NAME:
comparator = new Comparator<Track>() {
@Override
public int compare(Track track, Track track2) {
return track.getTitle().compareToIgnoreCase(track2.getTitle());
}
};
break;
}
Collections.sort(objects, comparator);
notifyDataSetChanged();
}
public void reverseTracks() {
Collections.reverse(objects);
notifyDataSetChanged();
}
@Override
public int getCount() {

View File

@ -11,11 +11,19 @@ public class Track {
this.artist = artist;
this.title = title;
}
public int getAudioId() {
return audioId;
}
public String getArtist() {
return artist;
}
public String getTitle() {
return title;
}
@Override
public String toString() {
return artist + " - " + title;