LinuxPlanet Blogs

By Linux Geeks, For Linux Geeks.

JPAUnit Release V0.1 – Mandela Day Release 2015

without comments

JPAUnit is a Java library for assisting with unit testing your JPA code. It  facilitates the initialisation of a database to a known state before commencing units test in Java. It leverages the mapping already done in your application's model that maps Java POJOs to database tables to insert data, defined in XML files into the target database.

JPAUnit leverages the database abstraction layer already created by JPA data providers to allow tests to target any vendor database that is compatible with your JPA provider.

JPAUnit - Mandela Day Release 2015

In honour of Mandela Day, 18th July 2015, Jumping Bean is pleased to announce the release of version V0.1 of JPAUnit. Release V.01 can be downloaded from GitHub

Written by Mark Clarke

July 19th, 2015 at 1:32 pm

Posted in Uncategorized

Thoughts on Canonical, Ltd.’s Updated Ubuntu IP Policy

without comments

Most of you by now have probably seen Conservancy's and FSF's statements regarding the today's update to Canonical, Ltd.'s Ubuntu IP Policy. I have a few personal comments, speaking only for myself, that I want to add that don't appear in the FSF's nor Conservancy's analysis. (I wrote nearly all of Conservancy's analysis and did some editing on FSF's analysis, but the statements here I add are my personal opinions and don't necessarily reflect the views of the FSF nor Conservancy, notwithstanding that I have affiliations with both orgs.)

First of all, I think it's important to note the timeline: it took two years of work by two charities to get this change done. The scary thing is that compared to their peers who have also violated the GPL, Canonical, Ltd. acted rather quickly. As Conservancy pointed out regarding the VMware lawsuit, it's not uncommon for these negotiations to take even four years before we all give up and have to file a lawsuit. So, Canonical, Ltd. resolved the matter at least twice as fast as VMware, and they deserve some credit for that — even if other GPL violators have set the bar quite low.

Second, I have to express my sympathy for the positions on this matter taken by Matthew Garrett and Jonathan Riddell. Their positions show clearly that, while the GPL violation is now fully resolved, the community is very concerned about what the happens regarding non-copylefted software in Ubuntu, and thus Ubuntu as a whole.

Realize, though, that these trump clauses are widely used throughout the software industry. For example, electronics manufacturers who ship an Android/Linux system with standard, disgustingly worded, forbid-everything EULA usually include a trump clause not unlike Ubuntu's. In such systems, usually, the only copylefted program is the kernel named Linux. The rest of the distribution includes tons of (now proprietarized) non-copylefted code from Android (as well as a bunch of born-proprietary applications too). The trump clause assures the software freedom rights for that one copylefted work present, but all the non-copylefted ones are subject to the strict EULA (which often includes “no reverse engineer clauses”, etc.). That means if the electronics company did change the Android Java code in some way, you can't even legally reverse engineer it — even though it was Apache-licensed by upstream.

Trump clauses are thus less than ideal because they achieve compliance only by allowing a copyleft to prevail when the overarching license contradicts specific requirements, permissions, or rights under copyleft. That's acceptable because copyleft licenses have many important clauses that assure and uphold software freedom. By contrast, most non-copyleft licenses have very few requirements, and thus they lack adequate terms to triumph over any anti-software-freedom terms of the overarching license. For example, if I take a 100% 2-clause-BSD-licensed program and build a binary from it, nothing in the 2-clause-BSD prohibits me from imposing this license on you: “you may not redistribute this binary commercially”. Thus, even if I also say to you: “but also, if the 2-clause-BSD grants rights, my aforementioned license does not modify or reduce those rights”, nothing has changed for you. You still have a binary that you can't distribute commercially, and there was no text in the 2-clause-BSD to force the trump clause to save you.

Therefore, this whole situation is a simple and clear argument for why copyleft matters. Copyleft can and does (when someone like me actually enforces it) prevent such situations. But copyleft is not infinitely expansive. Nearly every full operating system distribution available includes an aggregated mix of copylefted, non-copyleft, and often fully-proprietary userspace applications. Nearly every company that distributes them wraps the whole thing with some agreement that restricts some rights that copyleft defends, and then adds a trump clause that gives an exception just for FLOSS license compliance. Sadly, I have yet to see a company trailblaze adoption of a “software freedom preservation” clause that guarantees copyleft-like compliance for non-copylefted programs and packages. Thus, the problem with Ubuntu is just a particularly bad example of what has become a standard industry practice by nearly every “open source” company.

How badly these practices impact software freedom depends on the strictness and detailed terms of the overarching license (and not the contents of the trump clause itself; they are generally isomorphic0). The task of analyzing and rating “relative badness” of each overarching licensing document is monumental; there are probably thousands of different ones in use today. Matthew Garrett points out why Canonical, Ltd.'s is particularly bad, but that doesn't mean there aren't worse (and better) situations of a similar ilk. Perhaps our next best move is to use copyleft licenses more often, so that the trump clauses actually do more.

In other words, as long as there is non-copylefted software aggregated in a given distribution of an otherwise Free Software system, companies will seek to put non-Free terms on top of the non-copylefted parts, To my knowledge, every distribution-shipping company (except for extremely rare, Free-Software-focused companies like ThinkPenguin) place some kind of restrictions in their business terms for their enterprise distribution products. Everyone seems to be asking me today to build the “worst to almost-benign” ranking of these terms, but I've resisted the urge to try. I think the safe bet is to assume that if you're looking at one of these trump clauses, there is some sort of software-freedom-unfriendly restriction floating around in the broader agreement, and you should thus just avoid that product entirely. Or, if you really want to use it, fork it from source and relicense the non-copylefted stuff under copyleft licenses (which is permitted by nearly all non-copyleft licenses), to prevent future downstream actors from adding more restrictive terms. I'd even suggest this as a potential solution to the current Ubuntu problem (or, better yet, just go back upstream to Debian and do the same :).

Finally, IMO the biggest problem with these “overarching licenses with a trump clause” is their use by companies who herald “open source” friendliness. I suspect the community ire comes from a sense of betrayal. Yet, I feel only my usual anger at proprietary software here; I don't feel betrayed. Rather, this is just another situation that proves that saying you are an “open source company” isn't enough; only the company's actions and “fine print” terms matter. Now that open source has really succeeded at coopting software freedom, enormous effort is now required to ascertain if any company respects your software freedom. We must ignore the ballyhoo of “community managers” and look closely at the real story.


0Despite Canonical, Ltd.'s use of a trump clause, I don't think these various trump clauses are canonically isomorphic. There is no natural mapping between these various trump clauses, but they all do have the same effect: they assure that when the overarching terms conflict with the a FLOSS license, the FLOSS license triumphs over the overarching terms, no matter what they are. However, the potential relevance of the phrase “canonical isomorphism” here is yet another example why it's confusing and insidious that Canonical, Ltd. insisted so strongly on using canonical in a non-canonical way.

Written by Bradley M. Kuhn

July 15th, 2015 at 7:15 pm

Posted in Uncategorized

JPAUnit – A replacement for DBUnit in JPA Unit Tests

without comments

JPAUnit is the result of several days of fighting with Hibernate's 4.3.10 JPA implementation and DBUnit trying to get the two to work together.

Eventually we gave up and decided to write our own library. How hard could it be right? :) Besides after several days of coding in circles around DBUnit it was nice to have a change.

JPAUnit - Light Weight JPA Unit Testing

The JPAUnit repository is on github. There are unit tests that hopefully explain how it works. We have already moved some of our projects over to JPAUnit and the results look promising. No need to leave the comfort zone of JPA to load your unit tests!

How Does JPAUnit Work?

JPAUnit can load DBUnit xml data sets. We didn't want to have to rewrite all those configuration files so we created a parser for DBUnit files.

<?xml version="1.0" encoding="UTF-8"?>
<dataset>
    <SimpleBigDecimalEntity id="1" bigDecimalValue="1000.24" />
    <SimpleBigDecimalEntity id="2" bigDecimalValue="999999999999.9999" />
    <ForeignEntity id="1" simpleBigDecimal_id="1"  stringValue="String Value" />
</dataset>

JPAUnit relies on Java naming conventions for much of its functionality. It expects all entities to expose their id (primary key) via "getId" which returns an int or Integer. It assumes the use of surrogate keys. JPAUnit's init method requires an data set file on the ClassPath, the package name to prepend to class names to find classes on the ClassPath, and an entity manager.

public class JpaLoaderForeignEntityTest {

    private static EntityManager em;
    private final String modelPackageName = "za.co.jumpingbean.jpaunit.test.model";

    @BeforeClass
    public static void beforeClass() {
        em = Persistence.createEntityManagerFactory("jpaunittest").createEntityManager();
    }

    @Test
    public void foreignTest() throws ParserException {
        JpaLoader loader = new JpaLoader();
        loader.init("META-INF/foreignentity.xml", modelPackageName, new SaxHandler(), em);
        loader.load();
        em.clear();
        em.getTransaction().begin();
        try {
            Query qry = em.createQuery("Select c from ForeignEntity c where c.stringValue=?");
            qry.setParameter(1,"String Value");
            ForeignEntity ent = (ForeignEntity) qry.getSingleResult();
            BigDecimal result = new BigDecimal("1000.24");
            Assert.assertTrue(MessageFormat.format("Expected {0} but got {1}",result,ent.getSimpleBigDecimal().getBigDecimalValue()),
            result.compareTo(ent.getSimpleBigDecimal().getBigDecimalValue())==0);
        } finally {
            em.getTransaction().commit();
            loader.delete();
        }
    }

}

Release 0.1?

We hope to release version 0.1 for Mandela Day 2015.

Written by Mark Clarke

July 11th, 2015 at 1:42 pm

Posted in Uncategorized

Did You Actually Read the Lower Court’s Decision?

without comments

I'm seeing plenty of people, including some non-profit organizations along with the usual punditocracy, opining on the USA Supreme Court's denial for a writ of certiorari in the Oracle v. Google copyright infringement case. And, it's not that I expect everyone in the world to read my blog, but I'm amazed that people who should know better haven't bothered to even read the lower Court's decision, which is de-facto upheld upon denial by the Supreme Court to hear the appeal.

I wrote at great length about why the decision isn't actually a decision about whether APIs are copyrightable, and that the decision actually gives us some good clarity with regard to the issue of combined work distribution (i.e., when you distribute your own works with the copyrighted material of others combined into a single program). The basic summary of the blog post I linked to above is simply: The lower Court seemed genially confused about whether Google copy-and-pasted code, as the original trial seems to have inappropriately conflated API reimplemenation with code cut-and-paste.

No one else has addressed this nuance of the lower Court's decision in the year since the decision came down, and I suspect that's because in our TL;DR 24-hour-news cycle, it's much easier for the pundits and organizations tangentially involved with this issue to get a bunch of press over giving confusing information.

So, I'm mainly making this blog post to encourage people to go back and read the decision and my blog post about it. I'd be delighted to debate people if they think I misread the decision, but I won't debate you unless you assure me you read the lower Court's decision in its entirety. I think that leaves virtually no one who will. :-/

Written by Bradley M. Kuhn

July 4th, 2015 at 2:30 pm

Posted in Uncategorized

Hot corners fot configuring cinamon desktop

without comments

In cinnamon GUI, we can configure the corners of our desktop to behave the way we want. That is when we move the cursor to any of the four corners of the desktop we can make the system behave in a specific way. For example every time we move the cursor to left corner all windows get minimized and the desktop is shown, or all the active windows are popped up on the screen.

This is possible by use of the Hot corners application.

In cinnamon this is available under preferences as shown below.

 photo in_menu.png

Once we lauch the hot corners application we will be presented with a window as shown below.

 photo hot_corner_window.png

We can see there are four corners highlighted and for each corner there is separate set of activation options. for example let us say we want to view the desktop every time we move the mouse the left top corner of the desktop. In the left top corner of the hot corner window click on the menu and select the option "Show the desktop" .

 photo hot_corner_options.png

There are two check boxes provided below, First one is to show an icon on the desktop which when clicked will behave as we have decided. The second checkbox when enabled will enable the selected behavior when we hover the mouse at the corner.

We can also choose to run a specific command when we move the mouse to a corner by choosing the "Run a command" option from the menu and then entering the command in the text box provided. This can be used for applications that we use very often, like libreoffice or firefox etc.


Written by Tux Think

July 2nd, 2015 at 9:48 am

Posted in Uncategorized

Continuous integration testing for WordPress plugins on Github using Travis CI

without comments

seravo-travis-testing-builds

Intro

We have open sourced and published some plugins on wordpress.org. We only publish them to wordpress.org and do the development in Github. Our goal is to keep them simple but effective. Quite a few people are using them actively and some of them have contributed back by creating additional features or fixing bugs/docs. It’s super nice to have contributions from someone else but it’s hard to see if those changes break your existing features. We all do mistakes from time to time and it’s easier to recover if you have good test coverage. Automated integration tests can help you out in these situations.

Choosing Travis CI

As we use Github.com for hosting our code and wanted a tool which integrates really well with Github. Travis works seamlessly with Github and it’s free to use in open source projects. Travis gives you ability to run your tests in coordinated environments which you can modify to your preferences.

Requirements

You need to have a Github account in order to setup Travis for your projects.

How to use

1. Sign up for free Travis account

Just click the link on the page and enter your Github credentials

2. Activate testing in Travis. Go to your accounts page from right corner.

travis-accounts-onni-hakala

Then go to your Organisation page (or choose a project of your own) and activate the projects you want to be tested in Travis.

activate-travis-testing-buttons

3. Add .travis.yml into the root of your project repository. You can use samples from next section.

travis-yml-in-github

After you have pushed to Github just wait for couple of seconds and your tests should activate automatically.

Configuring your tests

I think the hardest part of Travis testing is just getting started. That’s why I created testing template for WordPress projects. You can find it in our Github repository. Next I’m going to show you a few different cases of how to use Travis. We are going to split tests into unit tests with PHPUnit and integration tests with RSpec, Poltergeist and PhantomJS.

#1 Example .travis.yml, use Rspec integration tests to make sure your plugin won’t break anything else

This is the easiest way to use Travis with your WordPress plugin. This installs latest WP and activates your plugin. It checks that your frontpage is working and that you can log into admin panel. Just drop this .travis.yml  into your project and start testing :)!


sudo: false
language: php

notifications:
  on_success: never
  on_failure: change

php:
  - nightly # PHP 7.0
  - 5.6
  - 5.5
  - 5.4

env:
  - WP_PROJECT_TYPE=plugin WP_VERSION=latest WP_MULTISITE=0 WP_TEST_URL=http://localhost:12000 WP_TEST_USER=test WP_TEST_USER_PASS=test

matrix:
  allow_failures:
    - php: nightly

before_script:
  - git clone https://github.com/Seravo/wordpress-test-template wp-tests
  - bash wp-tests/bin/install-wp-tests.sh test root '' localhost $WP_VERSION

script:
  - cd wp-tests/spec && bundle exec rspec test.rb

#2 Example .travis.yml, which uses phpunit and rspec integration tests

  1. Copy phpunit.xml and tests folder from: https://github.com/Seravo/wordpress-test-template into your project

  2. Edit tests/bootstrap.php line containing PLUGIN_NAME according to your plugin:

define('PLUGIN_NAME','your-plugin-name-here.php');
  1. Add .travis.yml file

sudo: false
language: php

notifications:
  on_success: never
  on_failure: change

php:
  - nightly # PHP 7.0
  - 5.6
  - 5.5
  - 5.4

env:
  - WP_PROJECT_TYPE=plugin WP_VERSION=latest WP_MULTISITE=0 WP_TEST_URL=http://localhost:12000 WP_TEST_USER=test WP_TEST_USER_PASS=test

matrix:
  allow_failures:
    - php: nightly

before_script:
  # Install composer packages before trying to activate themes or plugins
  # - composer install
  - git clone https://github.com/Seravo/wordpress-test-template wp-tests
  - bash wp-tests/bin/install-wp-tests.sh test root '' localhost $WP_VERSION

script:
  - phpunit
  - cd wp-tests/spec && bundle exec rspec test.rb

For this to be useful you need to add the tests according to your plugin.

To get you started see how I did it for our plugin WP-Dashboard-Log-Monitor.

Few useful links:

If you want to contribute for better WordPress testing put an issue or pull request in our WordPress testing template.

Seravo can help you using PHPUnit, Rspec and Travis in your projects,
please feel free to ask us about our WordPress testing via email at wordpress@seravo.fi or in the comment section below.

 

Written by onni

July 2nd, 2015 at 6:04 am

Posted in technology

Initial Support for Freedreno on Android

without comments

I now have Android-x86 running Freedreno on my IFC6410 o/!

Freedreno on Android

The setup:

on an IFC6410 (A320 GPU) with an ancient CRT


The gralloc module carries two responsibilities: providing an interface to /dev/graphics/fb0 for creating FrameBufferNativeWindow-s and, handling buffer requests that come in through a singleton system wide GraphicBufferAllocator object. Each request is stamped with a usage flag to help gralloc decide how to provide it.

Current setup uses the default eglSwapBuffers() based HWC, i.e. all-GPU composition for now:

$ dumpsys SurfaceFlinger
[...]
numHwLayers=3, flags=00000000
type    |  handle  |   hints  |   flags  | tr | blend |  format  |          source crop            |           frame           name
------------+----------+----------+----------+----+-------+----------+---------------------------------+--------------------------------
GLES | 2a2a31e0 | 00000000 | 00000000 | 00 | 00100 | 00000005 | [      0,     13,   1024,    744] | [    0,   13, 1024,  744] com.example.android.home/com.example.android.home.Home
GLES | 2a060ad8 | 00000000 | 00000000 | 00 | 00105 | 00000005 | [      0,      0,   1024,     13] | [    0,    0, 1024,   13] StatusBar
GLES | 2a0614d8 | 00000000 | 00000000 | 00 | 00105 | 00000005 | [      0,      0,   1024,     24] | [    0,  744, 1024,  768] NavigationBar

Shortlog of issues faced:

I started with getting bare kitkat-x86 up on the IFC6410 with an ARM build setup. Fast forward multiple tries figuring out the build system and setting up the board-specific init scripts, I added Mesa to the build. The default HWC doesn’t implement blank(), which took some time to realize and fix a segfault. With all parts in place, I had the boot logo, with two boot flows due to a race condition. Disabling GPU authentication was another hack that needed to be put in.

Finally, I had Skia causing trouble while starting the UI. This turned out to be a simple fix to drm_gralloc, but had me looking everywhere through the sources and mistaking it to be a NEON specific issue with Skia.

Quirks:

Currently, Android only renders a few windows before SurfaceFlinger crashes while gralloc::unregisterBuffer() and restarts. Also, dexopt dies causing app installation failure, so not many apps to play around with.

TODOs:

  • Add a KMS based Hardware Composer.
  • GBM for drm_gralloc

Here is my trello board: https://trello.com/b/bIXu6QL6/freedreno-android

Thanks Rob, Emil, #freedreno, #android-x86 and #linaro!



Written by Varad

June 27th, 2015 at 2:22 am

Posted in android,freedreno,X.Org

John Oliver Falls For Software Patent Trade Association Messaging

without comments

I've been otherwise impressed with John Oliver and his ability on Last Week Tonight to find key issues that don't have enough attention and give reasonably good information about them in an entertaining way — I even lauded Oliver's discussion of non-profit organizational corruption last year. I suppose that's why I'm particularly sad (as I caught up last weekend on an old episode) to find that John Oliver basically fell for the large patent holders' pro-software-patent rhetoric on so-called “software patents”.

In short, Oliver mimics the trade association and for-profit software industry rhetoric of software patent reform rather than abolition — because trolls are the only problem. I hope the worlds' largest software patent holders send Oliver's writing staff a nice gift basket, as such might be the only thing that would signal to them that they fell into this PR trap. Although, it's admittedly slightly unfair to blame Oliver and his writers; the situation is subtle.

Indeed, someone not particularly versed in the situation can easily fall for this manipulation. It's just so easy to criticize non-practicing entities. Plus, the idea that the sole inventor might get funded on Shark Tank has a certain appeal, and fits a USAmerican sensibility of personal capitalistic success. Thus, the first-order conclusion is often, as Oliver's piece concludes, maybe if we got rid of trolls, things wouldn't be so bad.

And then there's also the focus on the patent quality issue; it's easy to convince the public that higher quality patents will make it ok to restrict software sharing and improvement with patents. It's great rhetoric for a pro-patent entities to generate outrage among the technology-using public by pointing to, say, an example of a patent that reads on every Android application and telling a few jokes about patent quality. In fact, at nearly every FLOSS conference I've gone to in the last year, OIN has sponsored a speaker to talk about that very issue. The jokes at such talks aren't as good as John Oliver's, but they still get laughs and technologists upset about patent quality and trolls — but through carefully cultural engineering, not about software patents themselves.

In fact, I don't think I've seen a for-profit industry and its trade associations do so well at public outrage distraction since the “tort reform” battles of the 1980s and 1990s, which were produced in part by George H. W. Bush's beloved M.C. Rove himself. I really encourage those who want to understand of how the anti-troll messaging manipulation works to study how and why the tort reform issue played out the way it did. (As I mentioned on the Free as in Freedom audcast, Episode 0x13, the documentary film Hot Coffee is a good resource for that.)

I've literally been laughed at publicly by OIN representatives when I point out that IBM, Microsoft, and other practicing entities do software patent shake-downs, too — just like the trolls. They're part of a well-trained and well-funded (by trade associations and companies) PR machine out there in our community to convince us that trolls and so-called “poor patent quality” are the only problems. Yet, nary a year has gone in my adult life where I don't see a some incident where a so-called legitimate, non-obvious software patent causes serious trouble for a Free Software project. From RSA, to the codec patents, to Microsoft FAT patent shakedowns, to IBM's shakedown of the Hercules open source project, to exfat — and that's just a few choice examples from the public tip of the practicing entity shakedown iceberg. IMO, the practicing entities are just trolls with more expensive suits and proprietary software licenses for sale. We should politically oppose the companies and trade associations that bolster them — and call for an end to software patents.

Written by Bradley M. Kuhn

June 26th, 2015 at 1:25 pm

Posted in Uncategorized

LinuxQuestions.org Turns Fifteen

without comments

WOW. Fifteen years ago today I made the first post ever at LQ, introducing it to the world. 15 Years. I know I’ve said it before, but 5,354,618 posts later the site and community have exceeded my wildest expectations in every way. The community that has formed around LQ is simply amazing. The dedication that the members and mod team has shown is both inspiring and truly humbling. I’d like to once again thank each and every LQ member for their participation and feedback. While there is always room for improvement, that LQ has remained a friendly and welcoming place for new Linux members despite its size is a testament to the community. Reaching this milestone has served to energize and refocus my efforts on making sure the next fifteen years are even better than the first fifteen. Visit this thread for more on how we plan to do that. We can’t do it without you.

–jeremy


Written by jeremy

June 25th, 2015 at 10:16 am

Posted in LinuxQuestions.org

HTC One M9 Review

without comments

Here’s my review from the latest episode of Bad Voltage. Note that a slightly longer version, with some pictures and a quote is available at LQ.

It’s no secret that I’m a fan of Android. As a result, I use and test a lot of different Android phones. I plan to start actually reviewing more of them. First up is the HTC One M9. You may remember that I mentioned the One M8 when I reviewed the Nexus 5. HTC’s 2015 top-of-the-line phone builds on the same sleek design as last year’s M8, sticking to the luxurious all-metal case and 5 inch Super LCD3 1080p HD screen while incorporating some key spec improvements, such as an upgraded Octo-core Snapdragon 810 processor, a 20 mega-pixel camera and a 2840 mAh battery. While it’s a bit heavy at 157g, especially compared to the iPhone 6 or Galaxy S6, I prefer the weight and balance HTC has created. At 5.69 by 2.74 inches, it’s about as large as I prefer a phone to be (For comparison, the iPhone 6+ is 6.22 x 3.06 and the Nexus 6 is 6.27 x 3.27) The M9 is one of the few flagship phones to still feature expandable storage via SD card, and it offers a unique Uh Oh one-year replacement program in the US. While the phone ships with Android 5.0, I’d expect a 5.1 roll-out in the next month or so. The device is priced at $649 unlocked in the US, with on-contract pricing starting at $199.

With the specs out of the way, let’s get to what’s important; how does the One M9 perform on a day to day basis. Let’s start with the first thing you’ll notice if you’re coming from a non-HTC phone, which is Sense 7. Sense is the UI skin that HTC puts on their Android phones. If you’re a Samsung user, it’s the equivalent to TouchWiz. My last couple full time phones have been from the Nexus family and I tend to prefer the stock Android experience. That said, Sense 7 is actually quite nice. It’s clean, performs well and has a few little touches that would be welcome additions to Android proper. An interesting new feature is a home-screen widget which dynamically changes which apps are displayed within it, depending on your location. (Work, Home, on the go). The theme generator is also pretty cool: you can take a snap of anything and the phone will analyze the image and create a full palette of colors to use with icons and app headers. Even the font and icon shapes will be altered to match the overall feel of the new theme.

While the screen doesn’t have the density or resolution of the Galaxy S6 or LG G4, its 441 pixel per inch screen looks better than the similarly spec’d Nexus 5. HTC has once again eschewed playing the number game here and opted for a non-2k experience which offers almost no discernible benefits to me at this screen size while eating up more of your limited battery. While the speakers haven’t changed much since the previous version, they are still far and away the best available in any phone. The camera is one area that has had a big change since the previous model. The 4-mega-pixel Ultrapixel sensor has been moved to the front of the phone and the aforementioned 20-mega-pixel camera now sits on the back. The phone produced quality photos in my tests, although low light scenarios are a bit of a weak point. I did notice some shutter lag at times, but there are similar lags on my Nexus 5.

While the battery is slightly more capacious than the previous One and HTC estimates you should get a full day of use out of the phone, I’d say that’s ambitious. To be fair, most Android flagship phones seem to be roughly equivalent in this regard and it’s really an area manufacturers need to focus on in my opinion. One other thing that’s changed, and this time not for the better in my opinion, is the power button transferring to the right-hand side of the phone. This may be a more natural place for it to be positioned and some people seem to prefer it, but the fact that it’s the same size and shape as the volume buttons above it results in me inadvertently hitting the incorrect button at times. It’s placement has also resulted in me accidentally powering the screen off. Perhaps I hold my phone in a different position than most people, but I suspect it’s something I’d get used to over time.

One frustrating thing about the phone is that, while it supports QuickCharge 2.0, which can charge the phone 60% in just 30 minutes, the charger that ships with the phone is not QuickCharge enabled. That seems ludicrous for a phone in this price range. It should also be noted that during serious use, the phone tends to get a bit hotter than other phones I’ve used.

So, what’s the Bad Voltage verdict? The One M8 was one of my favorite phones last year. The slick design of the M9 is still amazing, but I will say the competition has upped its game considerably. While the M8 had the plasticky S5 and the small iPhone to contend with, the M9 has to compete with the also well designed S6 and the newer updated iPhone 6. A flagship phone has to score well in a lot of areas for me to consider it a phone worth recommending. It has to have solid performance, gorgeous design, a camera that will capture memories accurately and expediently, last through a full day of use and be reasonably priced. That’s a tall order to be sure. I think the HTC One M9 makes the short list (along with the Samsung Galaxy S6 and if you don’t mind a giant phone, the Nexus 6 or LG G4). If you’re looking for an Android phone I’d recommend you look at those phones and pick the one that suits your personal tastes best. As the Nexus 6 is too big for me, my personal choice would currently be the One M9. As a testament to just how good the phone is, I lent my review device to an iPhone user so they could get a feel for Android. They’re no longer an iPhone user.

–jeremy


Written by jeremy

June 25th, 2015 at 9:49 am

Posted in android